3D数学-透视校正插值
好记性不如烂笔头啊,还是记录一下!
在3D渲染
中,输入数据是一些primitive
信息,包括顶点位置、颜色、纹理坐标等等。在光栅化阶段,primitive
(一般为三角形)被转化成一系列的fragment(或者称为像素)
,这些fragment接
下来要做ps操作,此时每个fragment
都有位置、颜色、纹理坐标这些属性信息,这些属性信息通过顶点属性用插值方法得到的。
如下图所示对投影面上相等的空间步长与
,它们在三角形面上对应的步长会随着离摄像机的距离的增加而变长,即
。因此对于处于
与
之间的那个像素点,虽然在投影面上其坐标处于
与
之间的
处,但是其在眼空间中的对应点并非处于
与
之间的
处,而顶点的属性信息却又都是在投影变换前的空间中指定的。
因此对像素属性信息的插值不能是简单的线性,尤其是纹理坐标在用线性插值时会出现明显的失真。那么应该怎么办呢?方法就是如下的透视校正插值
。
那么如何得到均匀的顶点属性插值呢?稍等一下,我们先看看深度插值:
假设投射的直线是:
对于该直线上的一点,从
O点(相机位置)
发出一束光线照射到该点,则光线与投影平面的交点为(投影平面的z值始终为-e),由于三角形相似原理可得出以下关系式:
解出得:
带入道直线方程中可得:
转化为:
考虑线段的两个端点和
,以及它们在投影平面上得对应点
和
,假设
,则
是点
和
在投影平面上得线性插值点的
值,则
值为:
可见,的倒数是线性插值,所以我们可以用顶点的
值来插值求得
primitive
内部fragment
的属性值,比如颜色等等。
假定的颜色为
,
的颜色为把
,则
的颜色为
为:
根据:
可解得:
转化一下为:
由此可见用深度倒数来插值顶点属性是合适的。
也许有人看得比较晕,几何的证明更直观,更能使你看到结论的本质所在。
附上一个几何证明:
图中有一处错误为
。
本节教程就到此结束,希望大家继续阅读我之后的教程。
谢谢大家,再见!
饮水思源
参考文献:
《3D游戏与图形学中得数学方法》
https://www.cnblogs.com/arenak/archive/2008/03/13/1103532.html
https://www.cnblogs.com/mikewolf2002/archive/2012/11/25/2787480.html
https://www.cnblogs.com/cys12345/archive/2009/03/16/1413821.html
版权声明:原创技术文章,撰写不易,转载请注明出处!