您的位置:首页 > 其它

深入探索透视纹理映射

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)



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  3D数学