在3D渲染中,輸入數據是一些primitive信息,包括頂點位置、顏色、紋理坐標等等。在光柵化階段,primitive(一般為三角形)被轉化成一系列的fragment(或者稱為像素),這些fragment接下來要做ps操作,此時每個fragment都有位置、顏色、紋理坐標這些屬性信息,這些屬性信息通過頂點屬性用插值方法得到的。比如下面的primtive,輸入數據中只有a,b,c三個頂點的信息,則三角形內部經過掃描轉化得到的像素f的顏色則是通過插值得到,d是a、b的差值,e是a、c的差值,然后f又是d、e的插值。
下圖是clip裁剪錐體的xz平面,從圖中可以看出,在投影平面的均勻插值(一系列藍色的標記),它們實際位置距離並不是均勻的,距離投影平面越遠,實際位置距離越長,所以這是我們采用線性插值的話,可能最終的結果並不是我們所想要的。
那么如何得到均勻的頂點屬性插值呢?稍等一下,我們先看看深度插值:
點O是視點位置,從視點觀察物體的投射線和投影平面相交的點即為物體在投影平面上的投射點,比如(x1,z1)在投影平面上的投射點為(p1,-e),投射線的方程為ax+bz =c , 其中c不能等於0,假設點(x,z)和O在投影平面的交點為(p,-e)(注意z坐標總是-e),則有
已知線段<x1,z1>-<x2,z2>的投影坐標線段為<p1,-e>-<p2,-e>,假定p3=(1-t)p1+tp2 (0<=t<=1),則p3是點<p1,-e>和<p2,-e>在投影平面上的線性差值點的x分量,則有下面的推導公式:
可見,z的倒數是線性插值,所以我們可以用頂點的z值來插值求得primitive內部fragment的屬性值,比如顏色等等。
假定<x1,z1>的顏色為b1, <x2,z2>的顏色為把b2,則<x,z>的顏色為b3為:
可見用深度倒數來插值頂點屬性是合適的。