2017-01-03 79 views
2

我试图从深度缓冲区获取深度值,并使用glReadPixels函数。它总是返回0给我。glReadPixels无法在OpenGL ES 1.0上获取深度

首先,我创建深度缓冲附件:

glGenFramebuffersOES(1, &viewFramebuffer); 
glGenRenderbuffersOES(1, &viewRenderbuffer); 

glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); 
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); 
[self.context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer]; 
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer); 

glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth); 
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); 

if (USE_DEPTH_BUFFER) 
{ 
    glGenRenderbuffersOES(1, &depthRenderbuffer); 
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer); 
    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight); 
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer); 
} 

然后我打电话glReadPixels函数来得到深度缓冲深度值:

float depth = 0.0f; 

glReadPixels(point.x, self.renderUIView.frame.size.height - point.y, 1, 1, GL_DEPTH_COMPONENT16_OES, GL_FLOAT, &depth); 

,但它不工作,深度值始终为0.我尝试从glGetError()获取错误代码,它返回1280。我错过了什么设置?

+0

@RawN谢谢你的回答,在我的问题中,OpenGL ES 1.0和OpenGL 2.0是一样的吗? –

+0

恐怕我不知道。 – 2017-01-03 06:43:53

+0

@RawN好的,谢谢你的回答。 –

回答

0

OpenGL ES(任何API版本)都不支持您正在尝试的操作 - 无法在深度缓冲区上使用glReadPixels

另外在一般情况下请注意,使用glReadPixels作为主要渲染循环的一部分的任何真正的3D游戏是一个“非常糟糕的主意” - 它迫使管道刷新,这将完全杀死你的表现。

+0

感谢您的回答。顺便说一句,我怎样才能在OpenGL ES 1.0中获得深度缓冲区值? –

+0

使用OpenGL ES 1.0,您运气不佳 - 没有办法做到您想要的。 – solidpixel

+0

使用OpenGL ES 2.0以后,如果您正在屏幕外渲染FBO,则可以在第二个渲染过程中将深度值作为纹理读取,例如使用片段着色器将其编码到RGBA颜色缓冲区中,您可以在其上调用“glReadPixels”(尽管它仍会导致性能下降)。如果您正在渲染到主窗口表面,而不是渲染到离屏表面,那么您运气不好,因为没有办法将窗口表面深度缓冲区映射为纹理。 – solidpixel