深入探索透视纹理映射

1.


推出了投影之后的x’和原始z之间的关系——x’1/z是线性关系,y’1/z也是线形关系。


 

 

上图是在相机空间的俯视图,eye是眼睛的位置,也就是原点。npfp分别是近、远裁剪平面,NF分别是z=0到两个裁剪平面的距离。pq是一个三角形pqrxy平面上的两个点,p的坐标为(x, y, z),p’p投影之后的点,坐标为(x’, y’, z’),则有

 

 

另外,在相机空间中,三角形pqr是一个平面,因此它内部的每一条边上的xz,以及yz都是线性关系,即

 

 

 

这样,把上面投影之后的结果(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)式计算出原始的xy,然后在3D空间中通过xy计算出stxyst都是在3D空间中的三角形上定义的,是线性关系)。这样就找到了投影面上一个点所对应的纹理坐标的正确值了。




有一个问题——计算次数太多了,有些繁琐——我们还需要在空间中再进行几次线性插值才能得到想要的东西。有没有更简单的方式呢?当然了!

我们注意到,在空间中,xyst都是线性的(因为三角形是平面),所以有关系

 

 

 

把(4)带入(1),有

 

 

 

把(3)带入上式的中间项,得到(常数都进行合并)

 

 

 

我们发现s/zt/zx’y’也是线性关系。而我们之前知道1/zx’y’是线性关系。则我们得出新的思路:对1/z关于x’y’插值得到1/z’,然后对s/zt/z关于x’y’进行插值得到s’/z’t’/z’,然后用s’/z’t’/z’分别除以1/z’,就得到了插值s’t’。这样就不用空间中的插值步骤了。

结论:

1)最终投影点xy1/z是线性关系

2)最终投影点xys/zt/z是线性关系



参考:

深入探索透视纹理映射(下) : http://blog.youkuaiyun.com/popy007/article/details/5570803


补充:


用垂直可视范围角度a和横纵比r构成的透视投影矩阵:

如果 vp = Mp * v0

那么值得主要的就是,vp.w = v0.z,

那么在Shader中看到  uv / pos.w 的话,那么就是相当于uv / pos.z,那么就是进行了上面说的 投影点xys/zt/z是线性关系 的变换。


(pos.w 具体是z还是-z要看使用的投影矩阵,OpenGL的话,就是-z,DX就是z)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值