2008-11-04 5 views
5

Ich habe einen iPhone app, wo ich diese drei Funktionen in appDidFinishLaunching nennen:Warum gibt mir glMatrixMode (GL_PROJECTION) EXC_BAD_ACCESS in einer iPhone App?

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

Wenn mit dem Debugger Schreiten durch I EXC BAD ACCESS, wenn ich die erste Zeile auszuführen. Irgendwelche Ideen, warum das passiert?

Btw Ich habe eine andere Anwendung, wo ich das gleiche tun, und es funktioniert gut. Also habe ich versucht, alles in dieser App zu duplizieren (#imports, OpenGLES-Framework hinzufügen, etc), aber jetzt bin ich einfach stecken.

Antwort

4

Ich habe mit OpenGL-Aufrufe in dieses geraten, wenn zwei Threads gleichzeitig versuchen, in die OpenGL-Szene zu zeichnen. Das klingt jedoch nicht wie das, was Sie tun.

Haben Sie vor diesem Aufruf Ihren Anzeigekontext und Framebuffer ordnungsgemäß initialisiert? Zum Beispiel in meinem UIView Unterklasse, die OpenGL Zeichnung der Fall ist, nenne ich folgendes in seiner initWithCoder: Methode:

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

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

Die createFramebuffer Methode sieht wie folgt aus:

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

Das ist so ziemlich Standardcode , wie von der OpenGL ES Application Vorlage in XCode generiert. Vielleicht bekommst du einen Absturz, wenn du Dinge vor dem Aufruf von glMatrixMode() nicht initialisierst.

Auch, warum machst du OpenGL Zeichnung in applicationDidFinishLaunching :? Wäre ein View- oder View-Controller kein geeigneterer Ort für OpenGL-Aufrufe als Ihr UIApplicationDelegate?

+0

Es könnte sein, weil Apples Demo-Anwendung, CrashLanding es so macht. – xyz

2

Ich habe diesen Fehler in vielen verschiedenen Situationen gesehen, aber niemals speziell in Ihrem. Das Problem tritt normalerweise auf, wenn die Anwendung versucht, auf Speicher zuzugreifen, der bereits freigegeben wurde.

Können Sie bestätigen, dass rect immer noch zugewiesen ist?

1

Sie müssen die aktuelle Matrix vor dem Aufruf von glOrthof durch die Identitätsmatrix ersetzen. Dies kann mit glLoadIdentity()

3

Problem mit dem Datum, an dem Sie den Fehler eingereicht haben, unwahrscheinlich, aber Sie würden auch so etwas sehen, wenn Sie den Apple-Beispielcode verwenden und auf einem ES 2.0-fähigen ausführen Gerät, da es den Matrixstack aus der Spezifikation entfernt, obwohl die Funktionsdefinitionen für den Compiler sichtbar bleiben, da das Gerät auch ES 1.1 unterstützt.

+0

Das Standard-OpenGL-Projekt versucht zunächst, ES 2.0 zu laden, und nur 1.1, wenn dies fehlschlägt. Sie können dies beheben, indem Sie 'watchFromNib' bearbeiten. – tsellon

1

Starten Sie den iPhone Simulator neu. Dieses Problem ist definitiv darauf zurückzuführen, dass der OpenGL-Kontext nicht ordnungsgemäß festgelegt wurde. Ich habe festgestellt, dass der iPhone Simulator manchmal Probleme hat und neu gestartet werden muss, damit der OpenGL-Kontext von [EAGLContext setCurrentContext:] richtig eingestellt wird.

+3

Ich bekam auch diesen Fehler und konnte nicht herausfinden warum. Ich habe diese Seite über Google gefunden. Dann schaute ich mir meinen Code genauer an und erkannte, dass ich den Kontext mit ES 2.0 initialisierte, aber meinen ES 1.1-Renderer zur Anzeige verwendete. Hoppla. – Christine