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

Is there any way to access depth buffer for OpenGL?

本文关键字:深度 缓冲区 OpenGL 访问 有没有      更新时间:2023-10-16

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

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

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

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

添加:然后 z 缓冲区仅显示立方体的颜色(深度 90,正面)

那么现在,我想获取保存在窗口中心的像素上的值 4。有什么方法可以获得该值吗?

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

您可以在您感兴趣的点上执行相机变换的逆向运算,以便在场景的"空间"中获得一条线。然后,您可以将该线与场景中的对象相交;这些交集发生的地方是该像素后面对象的 Z 值。

但这一切似乎都倒退到正常的技术上。也许如果我们知道你想实现的目标,我们可以提出一个具体的解决方案。

使用以下 openGL API:

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

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