使用OpenGL readPixels的真实深度值

时间:2011-07-12 01:00:11

标签: opengl depth-buffer

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

我尝试通过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 个答案:

答案 0 :(得分:2)

  

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

深度缓冲区不包含摄像机的距离值。深度值是到相机平面的垂直距离。因此,如果您确实需要相机的径向距离,则需要在着色器中计算它们并将它们写入缓冲区;深度缓冲区无济于事。

  

但我想将深度值放入主内存中,而不是在着色器中。

然后执行这些着色器的操作,除了C / C ++(或其他)代码,而不是着色器。无论哪种方式,数学都是一样的。只需遍历深度缓冲区中的每个值并对其进行转换。

答案 1 :(得分:2)

如前所述,在从Z缓冲区中检索归一化深度值后尝试使用gluUnproject()。您需要提供模型视图矩阵,投影矩阵和视口值,您可以使用glGetDoublev()glGetIntegerv()检索这些值。