透视校正插值

透视校正插值

当图形处理器在屏幕上显示一个三角形时,是需要进行逐行的光栅化。三角形顶点除了含有位置信息外,还包含颜色、纹理等属性信息,当然这类信息也需要进行插值。由于投影平面上的相同步长随着三角形面与相机距离的增加而在三角形面上产生更大的步长。图形处理需要采用非线性插值方式来计算相关属性信息才能获得正确的结果。
mark

深度插值

mark
如下图所示,(x-z) 平面上存在一条与三角形的某一个扫描线对应的线段,假如该线段不通过原点,则该线段方程可以表达为:

[ax + bz = c , c eq 0 ]

对于该条直线上的一点((x,z)),从做坐标原点发出的光线到该点,通过计算可以获得投影平面的交点,这个交点的(z)坐标固定为(e),假设其(x)坐标为(p),通过几何关系可以计算出((x,z))(p)的关系

[frac{p}{x} = frac{-e}{z} ightarrow x = -frac{p}{e}z ]

将公式带入带线段方程可得:

[(-frac{p}{e} + b)z = c ightarrow frac{1}{z} = -frac{p}{ec} + frac{b}{c} ]

考虑线段上两个端点((x_1 , y_1)) , ((x_2 , y_2)) 以及它们在投影平面上的对应点((p_1 ,e)) , ((p_2 ,e))。对于任意满足$ 0 leq t leq 1(的)t(值,投影平面上的插值点)x(值为)p_3 = (1-t)p_1 + t p_2$ ,则通过原点与(p_3,e)的光线与线段的交叉点((x_3,y_3))可以通过上面的公式获得:

[ frac{1}{z_3} =-frac{p_3}{ec} + frac{b}{c} \ = -frac{(1-t)p_1 + t p_2}{ec} + frac{b}{c} \ = (-frac{p_3}{ec} + frac{b}{c} )(1-t) +(-frac{p_3}{ec} + frac{b}{c} )t \ = frac{1}{z_1} (1-t) + frac{1}{z_2} t ]

也就是说三角形表面上插值点的坐标值倒数是线性关系。二维屏幕上的插值点的可以通过(frac{1}{z})$ 计算获得

顶点属性插值

当对三角形进行光栅化时,三角形中任意一点的属性都是需要相邻顶点属性进行插值获得。假设线段两个端点的深度值(z_1) , (z_2) , 分别包含属性 (b_1)(b_2), 则插值属性(b_3)与插值点的关系:

[frac{b_3-b_1}{b_2-b_1} = frac{z_3 - z_1}{z_2 - z_1} ]

(z_3)带入公式可以获得:

[b_3 = frac{b_1 z_2(1-t) + b_2 z_1 t} {z_2 (1-t) + z_1 t } \ = z_3 [ frac{b_1}{z_1} (1-t) + frac{b_2}{z_2} t] \ \ longrightarrow frac{b_3}{z_3} = frac{b_1}{z_1} (1-t) + frac{b_2}{z_2} t ]

也就是说三角形属性插值与(z)倒数的乘积是线性插值。所以在光栅化的时候图形处理器先计算(frac{1}{z})的线性插值,然后再计算的顶点属性的插值结果

参考

[1] : 一篇关于投影校正的论文,下载地址:http://pan.baidu.com/s/1kUVcZTt
[2]: (Mathematics.for.3D.Game.Programming.and.Computer.Graphics.3Ed) [http://pan.baidu.com/s/1pLljNeV]
[3]: 博客文章 http://www.cnblogs.com/mikewolf2002/archive/2012/11/25/2787480.html
[4]: 关于光栅化的简单介绍 http://gpudesign.bafree.net/computer-graphics/graphics-pipeline

原文地址:https://www.cnblogs.com/zsb517/p/6181663.html