【问题标题】:Using depth buffer in opengl es 2.0 iphone在opengl es 2.0 iphone中使用深度缓冲区
【发布时间】:2010-10-30 21:11:21
【问题描述】:

我遵循了在 opengl es 1.1 中使用深度缓冲区的教程。但我使用opengl es 2.0。实现的代码导致错误:Failed to make complete framebuffer object 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));
    }
}

问候 尼古拉斯

【问题讨论】:

    标签: iphone depth-buffer opengl-es-2.0


    【解决方案1】:

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

    解决方案是在发送存储消息之前绑定颜色渲染缓冲区,以便存储得到限制。也就是说,在创建深度渲染缓冲区之后,在消息正上方插入一行 glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);。它应该可以工作,我能够重现您的错误并随后以这种方式解决它。

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

    【讨论】:

    • 嗨,是的,我切换了位置并将所有 depth_buffer 代码放在最后,所以它起作用了。不过谢谢你的解释。
    猜你喜欢
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多