opengl深度测试如何使用24位深度缓冲区?

时间:2017-04-02 16:41:23

标签: opengl depth-testing

我正在使用32位浮点值,我将其输入到每个顶点的x,y,z位置的顶点着色器中。但是,我已经读过opengl使用24位深度缓冲区和8位用于模板缓冲区。

因为,我在gl_position中复制了我在顶点着色器中作为输入接收的相同32位浮点数,我想了解opengl如何将此32位浮点数转换为24位进行深度测试。

1 个答案:

答案 0 :(得分:2)

顶点着色器中的gl_Position剪辑空间坐标。将w除以生成规范化设备坐标,其中OpenGL中的可见范围为[-1,1](默认情况下,现在可以更改)。这些值将根据当前设置的glDepthRange参数进行转换,以最终获得窗口空间z值,该值在[0,1]范围内。

深度缓冲区必须只存储这些值,并且 - 非常类似于通常每个通道仅存储8位值的颜色值 - 整数深度缓冲区用于表示固定点值范围。

引自OpenGL 4.5 core profile spec(强调我的)的第13.6节“坐标转换”:

  

z_w可以使用定点或浮点表示来表示。   但是,如果绘制帧缓冲区具有浮点深度缓冲区,则必须使用浮点表示。 如果是   m - 使用位定点表示,我们   假设它代表每个值k/(2^m-1) ,   其中k位于{0,1,...,2 ^ m - 1},为k(例如1.0以二进制形式表示为全部字符串)。

因此,窗口空间z_w值(在[0,1]中)只是乘以2^m -1,并四舍五入为整数,结果存储在缓冲区中。