2008-11-04 3 views
5

J'ai une application iPhone où j'appelle ces trois fonctions appDidFinishLaunching:Pourquoi appeler glMatrixMode (GL_PROJECTION) me donne EXC_BAD_ACCESS dans une application iPhone?

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

Lorsque le pas à pas dans débogueur je reçois EXC ACCESS BAD quand j'exécute la première ligne. Des idées pour lesquelles cela se passe?

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

Répondre

4

Je l'ai déjà fait avec des appels OpenGL si deux threads tentent de dessiner sur la scène OpenGL en même temps. Cependant, cela ne ressemble pas à ce que vous faites. Avez-vous correctement initialisé votre contexte d'affichage et votre framebuffer avant cet appel? Par exemple, dans ma sous-classe UIView qui fait le dessin OpenGL, j'appelle ce qui suit dans son initWithCoder: Méthode:

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; 
} 

C'est à peu près le code passe-partout , tel que généré par le modèle d'application OpenGL ES dans XCode. Peut-être en n'initialisant pas les choses avant d'appeler glMatrixMode(), vous obtenez un plantage.

En outre, pourquoi dessinez-vous OpenGL dans applicationDidFinishLaunching:? Un contrôleur de vue ou de vue ne serait-il pas un endroit plus approprié pour les appels OpenGL que votre UIApplicationDelegate?

+0

C'est peut-être parce que l'application de démonstration d'Apple, CrashLanding, le fait de cette façon. – xyz

2

J'ai vu cette erreur dans plusieurs situations différentes mais jamais spécifiquement dans la vôtre. Cela vient généralement du fait que l'application essaye d'accéder à la mémoire qui a déjà été libérée.

Pouvez-vous confirmer que rect est toujours alloué?

1

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

3

Probablement pas le problème étant donné la date à laquelle vous avez soumis le bogue, mais vous verrez aussi quelque chose comme ça si vous utilisez le code d'exemple d'Apple et que vous utilisez un ES 2.0 capable device, car il supprime la pile de la spécification, bien que les définitions de la fonction restent visibles pour le compilateur puisque le périphérique prend également en charge ES 1.1.

+0

Le projet OpenGL par défaut tente de charger ES 2.0 en premier, et seulement 1.1 si cela échoue. Vous pouvez résoudre ce problème en éditant «awakeFromNib». – tsellon

1

Redémarrez le simulateur d'iPhone. Ce problème est définitivement dû au fait que le contexte OpenGL n'est pas correctement défini. J'ai trouvé que parfois le simulateur de l'iPhone a des problèmes et doit être redémarré pour que le contexte OpenGL soit correctement défini par [EAGLContext setCurrentContext:].

+3

Je recevais aussi cette erreur et je n'arrivais pas à comprendre pourquoi. J'ai trouvé cette page via google. Puis j'ai regardé de plus près mon code et j'ai réalisé que j'initialisais le contexte avec ES 2.0, mais en utilisant mon moteur de rendu ES 1.1 pour l'afficher. Oops. – Christine

Questions connexes