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

How does opengl depth testing use the 24bit depth buffer?

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

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

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

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

引用 OpenGL 4.5 core profile spec 的第 13.6 "coordinate transformations" 节(强调我的):

z_w may be represented using either a fixed-point or floating-point representation. However, a floating-point representation must be used if the draw framebuffer has a floating-point depth buffer. If an m-bit fixed-point representation is used, we assume that it represents each value k/(2^m-1), where k in {0,1,...,2^m- 1}, as k (e.g. 1.0 is represented in binary as a string of all ones).

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