5

appDidFinishLaunching で次の 3 つの関数を呼び出す iPhone アプリがあります。

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

デバッガーをステップ実行すると、最初の行を実行すると EXC BAD ACCESS が発生します。なぜこれが起こっているのですか?

ところで、同じことを行う別のアプリケーションがあり、正常に動作します。そのため、そのアプリのすべてを複製しようとしました (#imports、OpenGLES フレームワークの追加など)。

4

5 に答える 5

4

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呼び出しに適した場所ではないでしょうか。

于 2008-11-05T17:42:19.593 に答える
3

バグを提出した日付を考えると問題になる可能性は低いですが、Apple のサンプル コードを使用して ES 2.0 対応デバイスで実行すると、仕様からマトリックス スタックが削除されるため、次のようなことも見られます。ただし、デバイスは ES 1.1 もサポートしているため、関数定義はコンパイラに表示されたままになります。

于 2010-02-04T19:08:00.573 に答える
2

このエラーはさまざまな状況で見られましたが、特にあなたの状況では見られませんでした。これは通常、アプリケーションがすでに解放されているメモリにアクセスしようとした結果として発生します。

rectがまだ割り当てられていることを確認できますか?

于 2008-11-04T16:07:43.187 に答える
1

glOrthofを呼び出す前に、現在の行列を単位行列に置き換える必要があります。これはglLoadIdentity()で実行できます

于 2009-02-20T03:50:02.980 に答える
1

iPhone シミュレーターを再起動します。この問題は、OpenGL コンテキストが正しく設定されていないことが原因であることは間違いありません。[EAGLContext setCurrentContext:] で OpenGL コンテキストを適切に設定するには、iPhone シミュレーターに問題があり、再起動する必要がある場合があることがわかりました。

于 2010-05-23T18:56:27.590 に答える