我正在使用32位浮点值,我将其输入到每个顶点的x,y,z
位置的顶点着色器中。但是,我已经读过opengl使用24位深度缓冲区和8位用于模板缓冲区。
因为,我在gl_position
中复制了我在顶点着色器中作为输入接收的相同32位浮点数,我想了解opengl如何将此32位浮点数转换为24位进行深度测试。
答案 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
,并四舍五入为整数,结果存储在缓冲区中。