简体   繁体   English

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

[英]Using depth buffer in opengl es 2.0 iphone

I followed a tutorial using depth buffer in opengl es 1.1. 我在opengl 1.1中使用了深度缓冲的教程。 But I use opengl es 2.0. 但我使用opengl es 2.0。 The implemented code results in an error: Failed to make complete framebuffer object 8cd6. 实现的代码导致错误:无法生成完整的帧缓冲对象8cd6。 See implemented code below: 请参阅以下实施代码:

 (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));
    }
}

Regards Niclas 关心尼克拉斯

The problem is that you're twice binding storage to your Depth renderbuffer, and never to your Color renderbuffer. 问题在于,您将两次存储绑定到Depth渲染缓冲区,而不再使用Color renderbuffer。 The -renderbufferStorage:fromDrawable: message to your EAGLContext binds a storage to the currently bound renderbuffer, which in your case is the Depth renderbuffer. -renderbufferStorage:fromDrawable:消息到你的EAGLContext将存储绑定到当前绑定的渲染缓冲区,在你的情况下是深度渲染缓冲区。 Following, you're binding storage to it again using the glRenderbufferStorage call. 接下来,您使用glRenderbufferStorage调用再次将存储绑定到它。

The solution is to bind the Color renderbuffer prior to sending the storage message, so that the storage gets bounds to that. 解决方案是在发送存储消息之前绑定Color renderbuffer,以便存储绑定到该存储消息。 That is, insert a line glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); 也就是说,插入一行glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); directly above the message, after you create your Depth renderbuffer. 创建深度渲染缓冲区后,直接在邮件上方。 It should work, I was able to reproduce your error and subsequently solve it in this way. 它应该工作,我能够重现你的错误,然后以这种方式解决它。

NB. NB。 Always make sure the correct buffers are bound. 始终确保绑定正确的缓冲区。 You can check using glGetIntegerv() for the binding, and glGetRenderbufferParameteriv() for additional parameters. 您可以检查使用glGetIntegerv()的结合,和glGetRenderbufferParameteriv()的附加参数。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM