在模型空間,世界空間,相機空間和剪裁空間中三角面上的紋理座標與空間座標是線性關係,按空間座標進行線性插值即可求得紋理座標。
但在透視投影模式下在歸一化裝置空間和視口空間中紋理座標與空間座標就不再是線性關係了,要在歸一化裝置空間或視口空間插值計算紋理座標,需要進行非線性插值。
其原因就在於透視投影模式下由剪裁空間到歸一化裝置空間進行了一步透視除法。
在光柵化過程中,我們通常都是要在視口空間進行紋理插值,所以我們這裡重點推導視口空間中紋理座標的插值方法。
設相機空間中的座標為(x,y,z),其變換到剪裁空間中的座標為(xc,yc,zc),經過透視除法變換到歸一化裝置空間(xd,yd,zd),然後再經過視口變換變換到視口空間(xv,yv,zv)。
有關係:(參考:
(根據透視投影矩陣:)
xc=x*(cot(fovy/2)/aspect)
yc=y*cot(fovy/2)
zc=-(f+n)/(f-n)*z-2fn/(f-n)
wc=-z
(根據透視除法:)
xd=xc/wc
yd=yc/wc
zd=zc/wc
wd=1
(根據視口矩陣:)
xv=0.5*width*xd+vx+0.5*width (vx,vy為視口左下角座標)
yv=0.5*height*yd+vy+0.5*height
zv=0.5*zd+0.5
根據相機空間中三角面上的x,y,z為線性關係,有:
ax+by+cz+d=0
兩邊除以z得:a(x/z)+b(x/z)+c+d/z=0 (1)
由於xd=xc/wc=-x/z*(cot(fovy/2)/aspect)
yd=yc/wc=-y/z*cot(fovy/2)
zd=zc/wc=(f+n)/(f-n)+2fn/(f-n)*(1/z)
代入(1)式得:
a(-xd*aspect/cot(fovy/2))+b(-yd/cot(fovy/2))+c+d(zd-(f+n)/(f-n))(f-n)/(2fn)=0
合併一下常數項得:
a'*xd+b'*yd+c'+d'*zd=0,其中a',b',c',d'均為常數。
可見xd,yd,zd是線性關係。
又由於xv與xd是線性關係,yv與yd是線性關係,zv與zd是線性關係,所以xv,yv,zv是線性關係,即:
zv=l(xv,yv) -----(結論1)
所以視口空間裡深度值可以能過線性插值計算。
再來看紋理座標:
由於三角面在相機空間中紋理座標與空間座標是線性關係,所以有:
s=ax+by+cz+d。
兩邊除以z得:
s/z=a(x/z)+b(y/z)+c+d/z (2)
由於xd=xc/wc=-x/z*(cot(fovy/2)/aspect)
yd=yc/wc=-y/z*cot(fovy/2)
zd=zc/wc=(f+n)/(f-n)+2fn/(f-n)*(1/z)
代入(2)式得:
s/z=a(-xd*aspect/cot(fovy/2))+b(-yd/cot(fovy/2))+c+d(zd-(f+n)/(f-n))(f-n)/(2fn)
合併一下常數項得:
s/z=a'*xd+b'*yd+c'+d'*zd,其中a',b',c',d'均為常數。
即s/z=l(xd,yd,zd)
由於xv與xd是線性關係,yv與yd是線性關係,zv與zd是線性關係,所以
s/z=l(xv,yv,zv)
由於zv=l(xv,yv),所以
s/z=l(xv,yv)
由於zd=(f+n)/(f-n)+2fn/(f-n)*(1/z)及zv=0.5*zd+0.5,所以1/z=((zv-0.5)*2-(f+n)/(f-n))*(f-n)/(2fn),代入上式得:
s*((zv-0.5)*2-(f+n)/(f-n))*(f-n)/(2fn)=l(xv,yv)
上式可簡化為:s*(zv-f/(f-n))=l(xv,yv)
類似有:t*(zv-f/(f-n))=l(xv,yv)
----(結論2)
根據結論1和結論2就可以得到透視投影模式下在視口空間插值計算紋理座標的方法了:
首先通過線性插值計算zv,然後通過線性插值計算s*(zv-f/(f-n))和t*(zv-f/(f-n)),設結果為s和t,則
s=s/(zv-f/(f-n))
t=t/(zv-f/(f-n))
這樣就得到了透視正確的紋理座標(s,t)。
參考:
透視校正插值
當圖形處理器在螢幕上顯示乙個三角形時,是需要進行逐行的光柵化。三角形頂點除了含有位置資訊外,還包含顏色 紋理等屬性資訊,當然這類資訊也需要進行插值。由於投影平面上的相同步長隨著三角形面與相機距離的增加而在三角形面上產生更大的步長。圖形處理需要採用非線性插值方式來計算相關屬性資訊才能獲得正確的結果。如...
透視校正插值
在投影變換視口變換後,需要對投影到螢幕上的平面三角形頂點屬性進行線性插值,例如顏色,紋理,深度等。但對於投影前在3d空間的三角形來說,這個插值並不是線性的。下面來推導一下這個插值。假設螢幕空間的三角形的三個頂點分別為 v 0,v 1,v 2 v p 是位於三角形一邊上的點 v 0 t v 1 v 0...
透視紋理引發的對於插值的思考
插值還沒有系統的學過,最近在實現blackwalnut3d的紋理對映時,才慢慢發現3d中的插值和我們數學上的插值還是有點不同的。個人認為,插值可以和向量,矩陣一起稱為計算機圖形學中最最基本的數學基礎。在構造物體時,可以只設定幾個參考點,使用插值完成貝塞爾曲線的逼近。在進行裁剪時,為了獲得規範的,可以...