5.6.3.5 标准化深度值

来源:互联网 发布:java培训课 编辑:程序博客网 时间:2024/05/19 12:15

看起来好像在投影后,我们就可以丢弃原来的3D z坐标,因为所有的投影点,现在都在2D投影窗口,其形成由眼睛看到的2D图像。但是,我们仍然需要围绕深度缓冲算法的3D深度信息。就像Direct3D希望在标准化的范围内投影的x和y坐标,Direct3D希望的深度坐标标准化的范围为[0,1]。因此,我们必须构建一个保序函数g(z)用于映射区间[n,f]到[0,1]。因为该功能是保存顺序的,如果z1,z2∈[n,f]和z1<z2,则g(z1)<g(z2);所以尽管深度值已转化,但相对深度的关系保持不变,所以在标准化区间,我们仍然可以正确地比较深度。

映射[n,f]到[0,1]可以使用缩放和平移完成。但是,这种方法不会整合到我们当前的投影策略。我们从公式5.3看到,z坐标经受的转化:

undergoesZ

现在,我们需要选择A和B满足条件

条件1:G(N)= A + B/ N= 0(近平面被映射到零)

条件2:G(F)= A + B/ F =1(远平面被映射到一个)

解决条件1:B = –An。代入条件2和求解出A:asubb

g(z)函数(图5.25),说明它是严格递增的(顺序保留)和非线性的。它也表明,g(z)大部分的范围对应的深度值都是近平面的深度值。因此,大多数的深度值映射为g(z)范围的小子集。这可能会导致深度缓冲的精度问题(计算机不再区分由于有限的数字表示的细微不同转化深度值)。一般的建议是,让远近平面尽可能接近,以减少深度精确度的问题grath gz

现在,我们已经解决了A和B,我们可以陈述完整的透视投影矩阵

perspective projection

本文固定链接:http://www.oxox.work/web/directx11/normalized-depth-value/ | 虚幻大学

0 0
原创粉丝点击