在OpenGL ES 2.0 iPhone中使用深度缓冲区

4

我按照一个使用opengl es 1.1深度缓冲的教程进行了操作。但是我使用的是opengl es 2.0。实现的代码导致错误:无法完成帧缓冲对象8cd6。请参见下面的实现代码:

 (void)createFramebuffer
{
   if (context && !defaultFramebuffer)
   {
        [EAGLContext setCurrentContext:context];

        // Create default framebuffer object.
        glGenFramebuffers(1, &defaultFramebuffer);
        glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);

        // Create color render buffer and allocate backing store.
        glGenRenderbuffers(1, &colorRenderbuffer);
        glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);

        // Create depth render buffer
        glGenRenderbuffers(1, &depthRenderbuffer);
        glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);

        [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];
        glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &framebufferWidth);
        glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &framebufferHeight);

        glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
        glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, framebufferWidth, framebufferHeight);

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


        if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
            NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER));
    }
}

问候 Niclas

1个回答

3
问题在于您将存储器绑定了两次到深度渲染缓冲区,而从未绑定到颜色渲染缓冲区。对EAGLContext发送的“-renderbufferStorage:fromDrawable:”消息会将存储器绑定到当前绑定的渲染缓冲区,而在这种情况下,是深度渲染缓冲区。接下来,您使用“glRenderbufferStorage”调用再次将存储器绑定到它上面。
解决方案是在发送存储消息之前将颜色渲染缓冲区绑定,以便存储器绑定到那个缓冲区。也就是说,在创建深度渲染缓冲区后,在该消息上方直接插入一行“glBindRenderbuffer(GL_RENDERBUFFER,colorRenderbuffer);”。它应该可以工作,我能够复制您的错误并以这种方式解决它。
注意:始终确保正确绑定缓冲区。您可以使用“glGetIntegerv()”检查绑定,并使用“glGetRenderbufferParameteriv()”获取其他参数。

嗨,是的,我换了位置,把所有深度缓冲区代码放在最后,所以它正常工作了。但还是谢谢你的解释。 - tyuip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接