在opengl es 2.0 iphone中使用深度缓冲区

在opengl es 2.0 iphone中使用深度缓冲区,iphone,depth-buffer,opengl-es-2.0,Iphone,Depth Buffer,Opengl Es 2.0,我遵循了OpenGLES1.1中使用深度缓冲区的教程。但是我使用OpenGLES2.0。实现的代码导致错误:无法生成完整的帧缓冲区对象8cd6。 请参见下面的实现代码: (void)createFramebuffer { if (context && !defaultFramebuffer) { [EAGLContext setCurrentContext:context]; // Create default framebuffe

我遵循了OpenGLES1.1中使用深度缓冲区的教程。但是我使用OpenGLES2.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

问题在于,您将存储绑定到深度渲染缓冲区的次数增加了两次,而从未绑定到颜色渲染缓冲区。EAGLContext中的
-renderbufferStorage:fromDrawable:
消息将存储绑定到当前绑定的renderbuffer,在您的情况下,这就是深度renderbuffer。接下来,您将使用
glRenderbufferStorage
调用再次将存储绑定到它

解决方案是在发送存储消息之前绑定Color renderbuffer,以便存储得到该消息的边界。也就是说,插入一行
glBindRenderbuffer(GL_RENDERBUFFER,colorRenderbuffer)直接位于消息上方。它应该可以工作,我能够重现你的错误,然后用这种方式解决它


注意。始终确保绑定了正确的缓冲区。您可以使用
glGetIntegerv()
检查绑定,并使用
glGetRenderbufferParameteriv()
检查其他参数。

您好,是的,我切换了位置并将所有深度缓冲区代码放在最后,所以它工作了。但是谢谢你的解释。