Pourquoi l'appel de glMatrixMode (GL_PROJECTION) me donne-t-il EXC_BAD_ACCESS dans une application iPhone?

StackOverflow https://stackoverflow.com/questions/260391

  •  06-07-2019
  •  | 
  •  

Question

J'ai une application iPhone où j'appelle ces trois fonctions dans appDidFinishLaunching:

glMatrixMode(GL_PROJECTION);
glOrthof(0, rect.size.width, 0, rect.size.height, -1, 1);
glMatrixMode(GL_MODELVIEW);

Lorsque j'exécute le débogueur, j'obtiens EXC BAD ACCESS lorsque j'exécute la première ligne. Des idées pour expliquer cela?

Btw J'ai une autre application où je fais la même chose et ça fonctionne bien. J'ai donc essayé de tout dupliquer dans cette application (#imports, en ajoutant le framework OpenGLES, etc.) mais maintenant je suis coincé.

Était-ce utile?

La solution

Je me suis heurté à cela avec les appels OpenGL si deux threads tentent d’attirer simultanément la scène OpenGL. Cependant, cela ne ressemble pas à ce que vous faites.

Avez-vous correctement initialisé votre contexte d’affichage et votre tampon de mémoire avant cet appel? Par exemple, dans ma sous-classe UIView qui effectue le dessin OpenGL, j’appelle ce qui suit dans sa méthode initWithCoder:

context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];

if (!context || ![EAGLContext setCurrentContext:context] || ![self createFramebuffer]) 
{
    [self release];
    return nil;
}

La méthode createFramebuffer se présente comme suit:

- (BOOL)createFramebuffer 
{   
    glGenFramebuffersOES(1, &viewFramebuffer);
    glGenRenderbuffersOES(1, &viewRenderbuffer);

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
    [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer];
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);

    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);

    if (USE_DEPTH_BUFFER) {
        glGenRenderbuffersOES(1, &depthRenderbuffer);
        glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
        glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
        glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);
    }

    if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) 
    {
        return NO;
    }

    return YES;
}

Il s'agit en gros d'un code standard, tel que généré par le modèle d'application OpenGL ES dans XCode. Peut-être qu'en n'initialisant pas les choses avant d'appeler glMatrixMode (), vous obtenez un crash.

Aussi, pourquoi faites-vous du dessin OpenGL dans applicationDidFinishLaunching :? Une vue ou un contrôleur de vue ne serait-il pas un endroit plus approprié pour les appels OpenGL que votre UIApplicationDelegate?

Autres conseils

Ce n'est probablement pas le problème, compte tenu de la date à laquelle vous avez soumis le bogue, mais vous constaterez le même problème si vous utilisez le code d'exemple Apple et que vous vous exécutez sur un périphérique compatible ES 2.0, car cela supprime la pile de matrice. la spécification, bien que les définitions de fonction restent visibles pour le compilateur, car le périphérique prend également en charge ES 1.1.

J'ai vu cette erreur dans de nombreuses situations différentes, mais jamais spécifiquement dans la vôtre. Cela survient généralement lorsque l’application tente d’accéder à la mémoire déjà libérée.

Pouvez-vous confirmer que rect est toujours attribué?

Vous devez remplacer la matrice actuelle par la matrice d'identité avant d'appeler glOrthof. Cela peut être fait avec glLoadIdentity ()

Redémarrez le simulateur iPhone. Ce problème est certainement dû au fait que le contexte OpenGL n’est pas défini correctement. J'ai constaté que parfois, le simulateur iPhone rencontrait des problèmes et devait être redémarré pour que le contexte OpenGL soit correctement défini par [EAGLContext setCurrentContext:].

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top