2012-03-28 186 views
3

我注意到,如果我的颜色缓冲区之前绑定我的深度缓存,应用按预期工作:OpenGL ES 2.0的缓冲设置

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

编辑

深度之前:

enter image description here enter image description here

深度绑定后:

enter image description here

+0

检查这个问题的答案:http://stackoverflow.com/questions/4361516/request-a-depthbuffer-in-opengl-es-for-iphone - 你似乎缺少查询缓冲区大小和附加它到帧缓冲区。 – 2012-03-28 14:47:53

+1

后来到了;如果它不在那里,不管我在订单顺序上有什么问题,我都不会使用深度缓冲区。 – 2012-03-28 15:00:51

+0

好的。 _sw和_sh是否正确?我在问上面的答案,答案海报完全是第二种方式,当答案被接受时,我认为它正在工作。 – 2012-03-28 15:19:19

回答

3

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

glBindRenderbuffer(GL_RENDERBUFFER, _renderbuffer); 

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

+0

我暂时接受了这个答案,尽管我正在寻找一个来自OpenGL ES 2.0专家的更确定的答案,并且能够准确解释为什么它会像这样工作。 – 2012-04-17 19:21:03

+0

请让我知道如果这不能真正解决您的问题,所以我可以理清我不了解OpenGL的内容。谢谢! – davehayden 2012-04-17 20:37:01

+0

它确实有效,并且您的答案背后的概念似乎是正确的。但是,在我看来,'internalformat'参数仍然是一个黑盒子。在'glRenderbufferStorage(...)'中发生了什么,它使得为后续调用绑定到渲染缓冲区的缓冲区有所不同。从技术上讲,如果顺序很重要,深度缓冲区正在完成的任何事情都被'glBindRenderbuffer(GL_RENDERBUFFER,_renderbuffer)'覆盖,这引出了我的要求,深度缓冲区是否在做任何事情?它看起来不像它...因为在我的应用程序中省略了代码段的变化**没有任何**。笑 – 2012-04-17 20:52:42

0

有人会认为,为了渲染,您只需将所需的帧缓冲区绑定到GL_FRAMEBUFFER--因为帧缓冲区本身被附加到颜色和深度渲染缓冲区。

但是,在iOS/OpenGL ES 2.0上,您还需要将颜色渲染缓冲区绑定到GL_RENDERBUFFER,否则不会绘制任何内容。

因此,重新分配后盾深度渲染后,一定要做到这一点,通过调用:

glBindRenderbuffer(GL_RENDERBUFFER, colorRenderBuffer); 

这是为什么?那么,在iOS上,我们习惯于使用EAGLContext将OpenGL ES渲染到CAEAGLLayer上。因此,在使用OGL调用渲染到帧缓冲区后执行渲染后,我们将EAGLContext的presentRenderbuffer:方法称为实际将其显示在可绘制表面上。

EAGLContext docs

- (BOOL)presentRenderbuffer:(NSUInteger)target

显示一个渲染的屏幕上的内容。

要显示使用renderbufferStorage必须已分配存储的渲染:fromDrawable:方法

可以验证这是通过将呼叫立即glBindRenderbuffer你的电话之前[context presentRenderbuffer:GL_RENDERBUFFER] - 绑定仅影响调用,而不是之前与OpenGL的交互。