【发布时间】:2017-04-02 16:41:22
【问题描述】:
我正在使用 32 位浮点值,我将其输入到顶点着色器中,用于每个顶点的 x,y,z 位置。但是,我读过 opengl 使用 24 位作为深度缓冲区,使用 8 位作为模板缓冲区。
由于我在gl_position 中复制了相同的 32 位浮点数,我在顶点着色器中作为输入接收,我想了解 opengl 如何将此 32 位浮点数转换为 24 位以进行深度测试。
【问题讨论】:
标签: opengl depth-testing
我正在使用 32 位浮点值,我将其输入到顶点着色器中,用于每个顶点的 x,y,z 位置。但是,我读过 opengl 使用 24 位作为深度缓冲区,使用 8 位作为模板缓冲区。
由于我在gl_position 中复制了相同的 32 位浮点数,我在顶点着色器中作为输入接收,我想了解 opengl 如何将此 32 位浮点数转换为 24 位以进行深度测试。
【问题讨论】:
标签: opengl depth-testing
顶点着色器中的gl_Position 是一个剪辑空间坐标。将有一个除以w 来生成标准化的设备坐标,其中可见范围在OpenGL 中是[-1,1](默认情况下,现在可以更改)。这些值将根据当前设置的glDepthRange参数进行转换,最终得到窗口空间z值,该值在[0,1]范围内。
深度缓冲区必须只存储这些值,并且 - 与通常仅存储每个通道甚至 8 位值的颜色值非常相似 - 整数深度缓冲区用于表示其中的 定点 值范围。
引用OpenGL 4.5 core profile spec 的第 13.6 节“坐标转换”(强调我的):
z_w可以使用定点或浮点表示来表示。 但是,如果绘图帧缓冲区具有浮点深度缓冲区,则必须使用浮点表示。 如果 使用m-bit 定点表示,我们 假设它代表每个值k/(2^m-1), 其中k在 {0,1,...,2^m- 1} 中,as k(例如,1.0 以二进制表示为全为一的字符串)。
所以,窗口空间z_w的值(在[0,1]中)只是乘以2^m -1,并四舍五入为整数,结果存储在缓冲区中。
【讨论】: