有没有办法访问OpenGL的深度缓冲区?

时间:2017-01-04 11:20:50

标签: c++ opengl

例如,有两个对象,我从(0,0,100)到(0,0,0)看到它们。

对象1:中心的立方体(长度/宽度/高度10) 对象2:中心的球体(半径5)

然后,我只能看到立方体(此时我不考虑视野和观察体积)

因为openGL使用z-buffer算法, 在窗口的中心,像素首先具有四个深度值。 深度90(立方体的正面),深度110(立方体的背面) 深度95和105(球体)

添加:然后z-buffer仅显示立方体的颜色(深度为90,正面)

然后现在,我想获得保存在窗口中心的像素上的值4。 有没有办法获得这个价值?

2 个答案:

答案 0 :(得分:1)

这有点倒退;像素没有深度值。基于场景中对象的深度,它们的相对位置和方向以及摄像机设置来计算像素的颜色。像素是所有这些的结果,而不是输入数据。

您可以在您感兴趣的点上执行相机变换的反转,以在场景的“空间”中获得一条线。然后,您可以通过场景中的对象与该线相交;这些交叉点出现的位置是该像素后面的对象的Z值。

但是,这一切似乎都与普通技术相反。也许如果我们知道你想要完成什么,我们可以建议一个具体的决议。

答案 1 :(得分:0)

使用以下openGL API:

void glReadPixels( GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid * data);

以及GL_DEPTH_COMPONENT作为format参数。返回值介于0和1之间,您必须根据查看视锥而变换。 您不会同时获得四个值。您可以单独渲染单个对象并阅读所需的不同点。