深入探索透视纹理映射
2016-07-21 23:48
459 查看
1.
推出了投影之后的x’和原始z之间的关系——x’和1/z是线性关系,y’和1/z也是线形关系。
上图是在相机空间的俯视图,eye是眼睛的位置,也就是原点。np和fp分别是近、远裁剪平面,N和F分别是z=0到两个裁剪平面的距离。pq是一个三角形pqr在xy平面上的两个点,p的坐标为(x,
y, z),p’是p投影之后的点,坐标为(x’,
y’, z’),则有
另外,在相机空间中,三角形pqr是一个平面,因此它内部的每一条边上的x和z,以及y和z都是线性关系,即
这样,把上面投影之后的结果(1)带入这个线性式(2)(为了书写方便,现在开始我只处理x方向计算,y的情况一致),有
则我们通过这个式子推出了投影之后的x’和原始z之间的关系——x’和1/z是线性关系,y’和1/z也是线形关系。现在回忆我们上一篇文章中讲道的线性插值理论,我们可以说:因为x’、y’和1/z是线形关系,因此我们可以在投影面上通过x’和y’对1/z进行线性插值。至此我们可以得到这样的透视纹理映射思路:在投影平面上通过x’和y’对1/z线性插值,计算出1/z后,通过上面的(1)式计算出原始的x和y,然后在3D空间中通过x和y计算出s和t(x、y和s、t都是在3D空间中的三角形上定义的,是线性关系)。这样就找到了投影面上一个点所对应的纹理坐标的正确值了。
有一个问题——计算次数太多了,有些繁琐——我们还需要在空间中再进行几次线性插值才能得到想要的东西。有没有更简单的方式呢?当然了!
我们注意到,在空间中,x、y和s、t都是线性的(因为三角形是平面),所以有关系
把(4)带入(1),有
把(3)带入上式的中间项,得到(常数都进行合并)
我们发现s/z、t/z和x’、y’也是线性关系。而我们之前知道1/z和x’、y’是线性关系。则我们得出新的思路:对1/z关于x’、y’插值得到1/z’,然后对s/z、t/z关于x’、y’进行插值得到s’/z’、t’/z’,然后用s’/z’和t’/z’分别除以1/z’,就得到了插值s’和t’。这样就不用空间中的插值步骤了。
结论:
(1)最终投影点x、y和1/z是线性关系
(2)最终投影点x、y和s/z、t/z是线性关系
参考:
深入探索透视纹理映射(下) : http://blog.csdn.net/popy007/article/details/5570803
补充:
用垂直可视范围角度a和横纵比r构成的透视投影矩阵:
如果 vp = Mp * v0
那么值得主要的就是,vp.w = v0.z,
那么在Shader中看到 uv / pos.w 的话,那么就是相当于uv / pos.z,那么就是进行了上面说的
投影点x、y和s/z、t/z是线性关系
的变换。
(pos.w 具体是z还是-z要看使用的投影矩阵,OpenGL的话,就是-z,DX就是z)
推出了投影之后的x’和原始z之间的关系——x’和1/z是线性关系,y’和1/z也是线形关系。
上图是在相机空间的俯视图,eye是眼睛的位置,也就是原点。np和fp分别是近、远裁剪平面,N和F分别是z=0到两个裁剪平面的距离。pq是一个三角形pqr在xy平面上的两个点,p的坐标为(x,
y, z),p’是p投影之后的点,坐标为(x’,
y’, z’),则有
另外,在相机空间中,三角形pqr是一个平面,因此它内部的每一条边上的x和z,以及y和z都是线性关系,即
这样,把上面投影之后的结果(1)带入这个线性式(2)(为了书写方便,现在开始我只处理x方向计算,y的情况一致),有
则我们通过这个式子推出了投影之后的x’和原始z之间的关系——x’和1/z是线性关系,y’和1/z也是线形关系。现在回忆我们上一篇文章中讲道的线性插值理论,我们可以说:因为x’、y’和1/z是线形关系,因此我们可以在投影面上通过x’和y’对1/z进行线性插值。至此我们可以得到这样的透视纹理映射思路:在投影平面上通过x’和y’对1/z线性插值,计算出1/z后,通过上面的(1)式计算出原始的x和y,然后在3D空间中通过x和y计算出s和t(x、y和s、t都是在3D空间中的三角形上定义的,是线性关系)。这样就找到了投影面上一个点所对应的纹理坐标的正确值了。
有一个问题——计算次数太多了,有些繁琐——我们还需要在空间中再进行几次线性插值才能得到想要的东西。有没有更简单的方式呢?当然了!
我们注意到,在空间中,x、y和s、t都是线性的(因为三角形是平面),所以有关系
把(4)带入(1),有
把(3)带入上式的中间项,得到(常数都进行合并)
我们发现s/z、t/z和x’、y’也是线性关系。而我们之前知道1/z和x’、y’是线性关系。则我们得出新的思路:对1/z关于x’、y’插值得到1/z’,然后对s/z、t/z关于x’、y’进行插值得到s’/z’、t’/z’,然后用s’/z’和t’/z’分别除以1/z’,就得到了插值s’和t’。这样就不用空间中的插值步骤了。
结论:
(1)最终投影点x、y和1/z是线性关系
(2)最终投影点x、y和s/z、t/z是线性关系
参考:
深入探索透视纹理映射(下) : http://blog.csdn.net/popy007/article/details/5570803
补充:
用垂直可视范围角度a和横纵比r构成的透视投影矩阵:
如果 vp = Mp * v0
那么值得主要的就是,vp.w = v0.z,
那么在Shader中看到 uv / pos.w 的话,那么就是相当于uv / pos.z,那么就是进行了上面说的
投影点x、y和s/z、t/z是线性关系
的变换。
(pos.w 具体是z还是-z要看使用的投影矩阵,OpenGL的话,就是-z,DX就是z)
相关文章推荐
- 3D数学基础至四元数
- 四元数的转换(一)
- 3D数学读书笔记——向量运算及在c++上的实现
- 3D数学读书笔记——矩阵基础
- 3D数学读书笔记——矩阵基础番外篇之线性变换
- 3D数学读书笔记——矩阵进阶
- 3D数学读书笔记——四元数
- 3D数学读书笔记——3D中的方位与角位移
- 3D数学--学习笔记(一):笛卡尔坐标系、向量、矩阵初识
- 矩阵基础算法实现
- 3D游戏中的数学运用
- 世界坐标变换要先缩放、后旋转、再平移的原因
- 3D数学--学习笔记(一):笛卡尔坐标系、向量、矩阵初识
- 3D数学--学习笔记(三):3D中绕任意轴的旋转
- 3D数学--学习笔记(四):缩放
- 3D数学--学习笔记(五):一些概念总结(避免遗忘!)
- 判断点是否在三角形内
- 游戏中的高数
- 《3D数学基础系列视频》0.绪论
- 《3D数学基础系列视频》1.1向量基本概念