3

私はこのコードを使用します:

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

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

    glGenFramebuffers(1, &defaultFramebuffer);
    glGenRenderbuffers(1, &colorRenderbuffer);
    glGenRenderbuffers(1, &depthRenderbuffer);

    glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);

    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

しかし、アプリケーションを実行していると、紫色の画面が表示されます。このコードの何が問題になっていますか?

4

2 に答える 2

6

カラーレンダバッファを表示するCAEAGLLayerにバインドする場所がわかりません(後で発生する可能性があります)。また、深度テストを有効にしていません。また、私が間違っていなければ、カラーレンダバッファをバインドする必要がありglFramebufferRenderbuffer()、それを呼び出してから、深度レンダバッファをバインドして再度呼び出します。

以下は、OpenGL ES 2.0 で同様のディスプレイをセットアップするために使用したコードです。

glEnable(GL_DEPTH_TEST);

glGenFramebuffers(1, &viewFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, viewFramebuffer);

glGenRenderbuffers(1, &viewRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer);

[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer];

glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &backingHeight);

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, viewRenderbuffer);

glGenRenderbuffers(1, &depthRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, backingWidth, backingHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);

if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) 
{
    NSLog(@"Failure with framebuffer generation");
    return NO;
}

このアプリケーションの完全なコードは、こちらから入手できます

于 2010-12-07T15:28:02.713 に答える
1

これがどれだけ古いものかはわかっていますが、まったく同じことをまったく同じ結果で行ったので、貢献したいと思いました. 私のプロジェクトで起こったことは、レンダー バッファーを設定するときにオートコンプリートでエンター キーを押すのが速すぎたため、次のようになりました。

glGenBuffers(1, &_colorRenderBuffer);

これの代わりに:

glGenRenderbuffers(1, &_colorRenderBuffer);

最終結果: 紫色の画面。

于 2012-10-16T19:52:46.540 に答える