【问题标题】:How does opengl depth testing use the 24bit depth buffer?opengl深度测试如何使用24位深度缓冲区?
【发布时间】:2017-04-02 16:41:22
【问题描述】:

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

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

【问题讨论】:

    标签: opengl depth-testing


    【解决方案1】:

    顶点着色器中的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,并四舍五入为整数,结果存储在缓冲区中。

    【讨论】:

    • 1) 那么,我在使用深度测试时必然会降低精度,因为它会四舍五入到最接近的整数?如果场景中有大量对象,比如 10^7,那么我不能确保深度测试准确吗? 2) 既然您引用了 OpenGL 4.5 规范,那么早期版本的规范中没有任何内容吗? 3)我不太确定m位定点表示,浮点表示是否为位?
    • 1) 在透视情况下 z 的双曲线失真对于您的深度测试精度来说将是一个更大的问题。不知道为什么将深度测试与对象的数量联系起来,它根本不关心对象。 2)我刚刚引用了最新的规范。回到 1.0 的旧规格基本上说的是同样的事情。 3) 我什至不明白这个问题。
    • 我担心对象数量的原因是,比如说,我想为所有 10^7 个对象分配一个深度值,然后考虑到浮点表示 (IEEE 754),它可能很难由于表示浮点数时的精度损失,根据对象的深度为对象分配不同的浮点数。我不知道双曲失真是什么意思,所以我会尝试阅读它,看看它如何影响深度测试。只是想知道我是否可以根据唯一的深度正确区分大量对象。
    • 嗯,使用 24 位深度缓冲区,有 2^24 个不同的深度值,即 1.7*10^7,所以是的,您可以表示它们。但是您必须小心介于两者之间的所有转换和浮点表示。
    • 是的!但我怀疑它是否可以实现。我刚刚读到您不能使用(符号,指数,尾数)格式以浮点数表示 0.2。现在因为浮点表示会四舍五入,然后opengl会将其转换为整数。所以找出最小的深度值(我想把它加到零来得到每个对象的深度)是不可能的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多