1

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

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

4

1 回答 1

2

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

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

引用OpenGL 4.5 核心配置文件规范的第 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,然后四舍五入为整数,结果存储在缓冲区中。

于 2017-04-02T17:23:54.437 回答