0

Apple の EAGLView の例に基づく 3D プロジェクトがあります。

私はコンテキストに非常に奇妙なバグがあります(私は思う)、私のコンテキストは次を使用して作成されます:

[コンテキスト renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer];

3Dビューの初期化では機能し、レイアウトサブビューでは、frameBufferが破棄されて再び作成されます。ただし、場合によっては、フレームバッファが作成されません。デバッガーで検索したところ、コンテキスト「作成」から問題が発生していることがわかりました。

- (BOOL)createFramebuffer
{
    NSLog(@"[EAGLVIEW] create framebuffer");

    glGenFramebuffersOES(1, &viewFramebuffer);
    glGenRenderbuffersOES(1, &viewRenderbuffer);

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);


    //////// HERE, some time the context is 0 /////////
    [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);


    // On génère le tampon de profondeur -- bah oui, on fait de la 3D
    glGenRenderbuffersOES(1, &depthRenderbuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
    // On paramètre le tampon :
    // - avec les dimensions que l'on veut
    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
    //glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_RGB8_OES, backingWidth, backingHeight);
    // - avec la profondeur que l'on veut
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);


    if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) {
        NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
        return NO;
    }

    return YES;
}

なぜそれが機能しているかどうかはわかりません。このバグが発生したとき、強制的にlayoutSubviewを実行するようにiPhoneをオンにすると、うまくいきます。とても奇妙です。

コンテキストが 2 番目に作成されない理由は何ですか。直後は問題ありません。

4

1 に答える 1

0

コンテキストを実際に作成した方法を示すコードを投稿しておらず、それを使用しているだけです。コンテキストの作成は次のようになります

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

if (!context || ![EAGLContext setCurrentContext:context])
    return false;

また、コンテキストが0(nilを意味する)の場合は、事前にそれを検出しているはずです。

于 2010-09-16T11:45:04.907 に答える