2011-07-12 208 views
4

我想从我的相机视图中检索深度缓冲区以获得3D过滤应用程序。目前,我正在使用glReadPixels来获取深度组件。我不需要[0,1]值,我需要深度缓冲区的真实值,或者在世界坐标系中相机的真实距离。使用OpenGL读取像素的真实深度值

我试图通过GL_DEPTH_BIAS和GL_DEPTH_SCALE来转换深度值,但那不起作用。

glReadPixels(0, 0, width_, height_, GL_DEPTH_COMPONENT, GL_FLOAT, depth_buffer); 
glGetDoublev(GL_DEPTH_BIAS, &depth_bias); // Returns 0.0 
glGetDoublev(GL_DEPTH_SCALE, &depth_scale); // Returns 1.0 

我意识到这是类似于Getting the true z value from the depth buffer,但我想获得的深度值到主存储器中,而不是在着色器。

回答

2

像以前一样,从Z缓冲区中检索标准化深度值后,使用gluUnproject()尝试。您需要提供模型视图矩阵,投影矩阵和视口值,您可以使用glGetDoublev()glGetIntegerv()来检索它们。

+0

非常感谢,这工作。我为gluUnproject()调用了一个身份模型视图矩阵。 –

2

取代[0,1]值,我需要深度缓冲区的真实值,或真实世界坐标中相机的距离。

深度缓冲区不包含来自相机的距离值。深度值是相机平面的垂直距离。所以如果你真的需要相机的径向距离,你需要在着色器中计算它们并将它们写入缓冲区;深度缓冲区不会有帮助。

但我想深度值进入主内存,而不是着色器。

然后做那些着色器所做的事情,除了C/C++(或其他)代码而不是着色器。数学是一样的。只需循环遍历深度缓冲区中的每个值并将其转换即可。