2008-11-04 11 views
5

Mam iPhone app gdzie nazywają te trzy funkcje w appDidFinishLaunching:Dlaczego wywołanie glMatrixMode (GL_PROJECTION) daje mi EXC_BAD_ACCESS w aplikacji na iPhone'a?

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

Przy przechodzeniu z debugera uzyskać EXC BAD DOSTĘPU kiedy wykonać pierwszą linię. Jakieś pomysły, dlaczego tak się dzieje?

Przy okazji mam inną aplikację, w której robię to samo i działa dobrze. Próbowałem więc skopiować wszystko w tej aplikacji (#imports, dodając framework OpenGLES, itp.), Ale teraz po prostu utknąłem.

Odpowiedz

4

Uruchomiłem to za pomocą wywołań OpenGL, jeśli dwa wątki próbują narysować jednocześnie scenę OpenGL. Jednak to nie brzmi jak to, co robisz.

Czy poprawnie zainicjalizowano kontekst wyświetlania i bufor ramki przed wywołaniem? Na przykład w moim UIView podklasy, dokłada OpenGL rysunek, wzywam następujące w jej initWithCoder: Metoda:

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

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

Sposób createFramebuffer wygląda następującą:

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

jest to bardzo standardowy kod , wygenerowany przez szablon aplikacji OpenGL ES w XCode. Być może nie inicjując rzeczy przed wywołaniem glMatrixMode(), dostajesz awarię.

Ponadto, dlaczego robisz rysunek OpenGL w applicationDidFinishLaunching :? Czy kontroler widoku lub widoku nie byłby bardziej odpowiednim miejscem dla wywołań OpenGL niż twój UIApplicationDelegate?

+0

Może to być spowodowane tym, że aplikacja demo firmy Apple, CrashLanding robi to w ten sposób. – xyz

2

Widziałem ten błąd w wielu różnych sytuacjach, ale nigdy konkretnie w twoim. Zwykle pojawia się w wyniku aplikacji próbującej uzyskać dostęp do pamięci, która została już wydana.

Czy możesz potwierdzić, że rect jest nadal przydzielony?

1

Musisz zastąpić bieżącą macierz macierzą tożsamości przed wywołaniem glORtof. Można to zrobić za pomocą glLoadIdentity()

3

Jest mało prawdopodobne, aby był to problem z datą zgłoszenia błędu, ale zobaczysz również coś takiego, jeśli używasz przykładowego kodu Apple i działasz z obsługą ES 2.0 urządzenie, ponieważ usuwa stos macierzy ze specyfikacji, chociaż definicje funkcji pozostaną widoczne dla kompilatora, ponieważ urządzenie obsługuje także ES 1.1.

+0

Domyślny projekt OpenGL próbuje najpierw załadować ES 2.0, a tylko 1.1, jeśli to się nie powiedzie. Możesz to naprawić, edytując "awakeFromNib". – tsellon

1

Zrestartuj iPhone'a Simulator. Ten problem jest zdecydowanie spowodowany niepoprawnym ustawieniem kontekstu OpenGL. Zauważyłem, że czasami iPhone Simulator ma problemy i musi zostać uruchomiony ponownie, aby kontekst OpenGL został poprawnie ustawiony przez [EAGLContext setCurrentContext:].

+3

Otrzymałem również ten błąd i nie mogłem zrozumieć dlaczego. Znalazłem tę stronę przez google. Następnie przyjrzałem się bliżej swojemu kodowi i zdałem sobie sprawę, że zainicjowałem kontekst za pomocą ES 2.0, ale używając mojego renderera ES 1.1 do wyświetlenia. Ups. – Christine

Powiązane problemy