5.6.3.5 标准化深度值
2015-11-22 09:44
363 查看
看起来好像在投影后,我们就可以丢弃原来的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坐标经受的转化:
现在,我们需要选择A和B满足条件:
条件1:G(N)= A + B/ N= 0(近平面被映射到零)
条件2:G(F)= A + B/ F =1(远平面被映射到一个)
解决条件1:B = –An。代入条件2和求解出A:
g(z)函数(图5.25),说明它是严格递增的(顺序保留)和非线性的。它也表明,g(z)大部分的范围对应的深度值都是近平面的深度值。因此,大多数的深度值映射为g(z)范围的小子集。这可能会导致深度缓冲的精度问题(计算机不再区分由于有限的数字表示的细微不同转化深度值)。一般的建议是,让远近平面尽可能接近,以减少深度精确度的问题。
现在,我们已经解决了A和B,我们可以陈述完整的透视投影矩阵:
本文固定链接:http://www.oxox.work/web/directx11/normalized-depth-value/ | 虚幻大学
映射[n,f]到[0,1]可以使用缩放和平移完成。但是,这种方法不会整合到我们当前的投影策略。我们从公式5.3看到,z坐标经受的转化:
现在,我们需要选择A和B满足条件:
条件1:G(N)= A + B/ N= 0(近平面被映射到零)
条件2:G(F)= A + B/ F =1(远平面被映射到一个)
解决条件1:B = –An。代入条件2和求解出A:
g(z)函数(图5.25),说明它是严格递增的(顺序保留)和非线性的。它也表明,g(z)大部分的范围对应的深度值都是近平面的深度值。因此,大多数的深度值映射为g(z)范围的小子集。这可能会导致深度缓冲的精度问题(计算机不再区分由于有限的数字表示的细微不同转化深度值)。一般的建议是,让远近平面尽可能接近,以减少深度精确度的问题。
现在,我们已经解决了A和B,我们可以陈述完整的透视投影矩阵:
本文固定链接:http://www.oxox.work/web/directx11/normalized-depth-value/ | 虚幻大学
相关文章推荐
- 5.6.3.4 编写投影方程的矩阵
- 5.6.3.3 设备坐标标准化 (NDC)
- 5.6.3.2 投影顶点
- 5.6.3.1 Defining a Frustum
- [团队制度]得分宝宝概论
- android108 内存分配
- opencv:轮廓属性
- 蓝桥杯——矩阵乘法
- 欢迎使用CSDN-markdown编辑器
- PHP入门(5)-运算符
- Linux可重入函数
- P,NP,NPC以及NP-Hard问题说明
- javascript实现别踩白块儿小游戏程序
- 大话设计模式之面向对象基础篇(一)
- IOS 修改App的状态栏颜色为白色
- 在SQL Server中创建用户角色及授权
- 抽象类和抽象函数
- 继承:extends
- AltiumDesigner05——常见芯片的封装类型
- 我的第一个JAVA程序