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
以生成归一化设备坐标,其中可见范围在 OpenGL 中为 [-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
,并四舍五入为整数,并且结果存储在缓冲区中。
我正在使用 32 位浮点值,我将其输入到顶点着色器中用于每个顶点的 x,y,z
位置。但是,我读到 opengl 使用 24 位深度缓冲区和 8 位模板缓冲区。
因为,我在 gl_position
中复制相同的 32 位浮点数作为顶点着色器的输入,我想了解 opengl 如何将这个 32 位浮点数转换为 24 位以进行深度测试。
顶点着色器中的gl_Position
是一个剪辑space坐标。将除以 w
以生成归一化设备坐标,其中可见范围在 OpenGL 中为 [-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 anm
-bit fixed-point representation is used, we assume that it represents each valuek/(2^m-1)
, wherek
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
,并四舍五入为整数,并且结果存储在缓冲区中。