3

我注意到如果我在颜色缓冲区之前绑定我的深度缓冲区,应用程序会按预期工作:

glGenRenderbuffers(1, &_depthbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _depthbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, _sw, _sh);
glGenRenderbuffers(1, &_renderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _renderbuffer);
[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer];

但是,之后绑定深度缓冲区不会导致任何渲染,即使我的 glClearColor 设置也被忽略:

glGenRenderbuffers(1, &_renderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _renderbuffer);
[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer];
glGenRenderbuffers(1, &_depthbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _depthbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, _sw, _sh);

通过彻底研究各个组件,我已经了解了 OpenGL ES 2.0 如何工作的一些流程,但这似乎是每个人在他们的教程/书籍中所做的唯一事情,但没有解释原因。有任何想法吗?这甚至是一个问题,或者我的其余设置可能有问题吗?(如果是这样,我将包括所有代码)

编辑

@cli_hlt - 深度缓冲区已被添加到帧缓冲区:

glGenFramebuffers(1, &_framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, _framebuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, _depthbuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _renderbuffer);

编辑

之前的深度限制:

在此处输入图像描述 在此处输入图像描述

深度限制后:

在此处输入图像描述

4

1 回答 1

3

我可能完全错了——我自己只是在处理这些东西——但据我所知,glBind 命令只告诉 OpenGL 哪个渲染缓冲区/纹理/用于后续函数的任何内容。如果您习惯于面向对象编程,这是一个奇怪的模型。在样板设置代码中,您必须将创建的缓冲区绑定到 GL_RENDERBUFFER “插槽”,以便下一个 glRenderbufferStorage() 或 -[EAGLContext renderbufferStorage:fromDrawable:] 调用知道要使用的缓冲区。我认为问题在于您在调用 -[EAGLContext presentRenderBuffer:] 之前没有将活动的 GL_RENDERBUFFER 绑定回颜色缓冲区,因此您实际上是在显示深度缓冲区。添加

glBindRenderbuffer(GL_RENDERBUFFER, _renderbuffer);

在 presentRenderBuffer: 调用之前应该解决这个问题。…我认为。

于 2012-04-16T06:08:04.040 回答