2つのスレッドが一度にOpenGLシーンに描画しようとしている場合、OpenGL呼び出しでこれに遭遇しました。しかし、それはあなたがしていることのようには聞こえません。
この呼び出しの前に、表示コンテキストとフレームバッファを適切に初期化しましたか?たとえば、OpenGL描画を行うUIViewサブクラスでは、initWithCoderで次のように呼び出します。メソッド:
context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
if (!context || ![EAGLContext setCurrentContext:context] || ![self createFramebuffer])
{
[self release];
return nil;
}
createFramebufferメソッドは次のようになります。
- (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;
}
これは、XCodeのOpenGL ESアプリケーションテンプレートによって生成された、ほぼ定型的なコードです。おそらく、glMatrixMode()を呼び出す前に初期化しないことで、クラッシュが発生します。
また、なぜapplicationDidFinishLaunchingでOpenGL描画を行っているのですか?ビューまたはビューコントローラは、UIApplicationDelegateよりもOpenGL呼び出しに適した場所ではないでしょうか。