3D数学-透视校正插值

3D数学-透视校正插值

好记性不如烂笔头啊,还是记录一下!


3D渲染中,输入数据是一些primitive信息,包括顶点位置、颜色、纹理坐标等等。在光栅化阶段,primitive(一般为三角形)被转化成一系列的fragment(或者称为像素),这些fragment接下来要做ps操作,此时每个fragment都有位置、颜色、纹理坐标这些属性信息,这些属性信息通过顶点属性用插值方法得到的。

如下图所示对投影面上相等的空间步长与,它们在三角形面上对应的步长会随着离摄像机的距离的增加而变长,即。因此对于处于与之间的那个像素点,虽然在投影面上其坐标处于与之间的处,但是其在眼空间中的对应点并非处于与之间的处,而顶点的属性信息却又都是在投影变换前的空间中指定的。

因此对像素属性信息的插值不能是简单的线性,尤其是纹理坐标在用线性插值时会出现明显的失真。那么应该怎么办呢?方法就是如下的透视校正插值

3D数学-透视校正插值_1.png

那么如何得到均匀的顶点属性插值呢?稍等一下,我们先看看深度插值:

3D数学-透视校正插值_2.png

假设投射的直线是:

对于该直线上的一点,从O点(相机位置)发出一束光线照射到该点,则光线与投影平面的交点为(投影平面的z值始终为-e),由于三角形相似原理可得出以下关系式:

解出得:

带入道直线方程中可得:

转化为:

考虑线段的两个端点和,以及它们在投影平面上得对应点和,假设,则是点和在投影平面上得线性插值点的值,则值为:
\frac{1}{z_{3}} = -\frac{ap_{3}}{ce} + \frac{b}{c} \\ \qquad \qquad \qquad \quad \; \; = -\frac{ap_{1}}{ce}(1-t) - \frac{ap_{2}}{ce}t + \frac{b}{c} \\ \qquad \qquad \qquad \qquad \qquad \quad =(-\frac{ap_{3}}{ce} + \frac{b}{c})(1-t) + (\frac{ap_{2}}{ce} + \frac{b}{c})t \\ \qquad \quad \; \, = \frac{1}{z_{1}}(1-t) + \frac{1}{z_{2}}t
可见,的倒数是线性插值,所以我们可以用顶点的值来插值求得primitive内部fragment的属性值,比如颜色等等。
假定的颜色为, 的颜色为把,则的颜色为为:

根据:

可解得:
b_{3} = \frac{b_{1}z_{2}(1-t)+b_{2}z_{1}t}{z_{2}(1-t)+z_{1}t} \\ = \frac{\frac{b_{1}}{z_{1}}(1-t)+\frac{b_{2}}{z_{2}}t}{\frac{1}{z_{1}}(1-t)+\frac{1}{z_{2}}t} \;\,\\ \quad = z_{3}[\frac{b_{1}}{z_{1}}(1-t)+\frac{b_{2}}{z_{2}}t]
转化一下为:

由此可见用深度倒数来插值顶点属性是合适的。

也许有人看得比较晕,几何的证明更直观,更能使你看到结论的本质所在。

附上一个几何证明:

3D数学-透视校正插值_3.jpg

图中有一处错误为。

本节教程就到此结束,希望大家继续阅读我之后的教程。

谢谢大家,再见!


饮水思源

参考文献:

《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


版权声明:原创技术文章,撰写不易,转载请注明出处!

你可能感兴趣的:(3D数学-透视校正插值)