我正在使用 32 位浮点值,将其输入到顶点着色器中以获取x,y,z
每个顶点的位置。但是,我读过 opengl 使用 24 位作为深度缓冲区,使用 8 位作为模板缓冲区。
因为,我正在复制相同的 32 位浮点数,gl_position
作为顶点着色器的输入,我想了解 opengl 如何将此 32 位浮点数转换为 24 位以进行深度测试。
我正在使用 32 位浮点值,将其输入到顶点着色器中以获取x,y,z
每个顶点的位置。但是,我读过 opengl 使用 24 位作为深度缓冲区,使用 8 位作为模板缓冲区。
因为,我正在复制相同的 32 位浮点数,gl_position
作为顶点着色器的输入,我想了解 opengl 如何将此 32 位浮点数转换为 24 位以进行深度测试。
gl_Position
顶点着色器中的 是剪辑空间坐标。将有一个除以w
生成标准化设备坐标,其中可见范围在 OpenGL 中为 [-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
,然后四舍五入为整数,结果存储在缓冲区中。