透視校正插值

2021-09-07 08:11:18 字數 1446 閱讀 5694

當圖形處理器在螢幕上顯示乙個三角形時,是需要進行逐行的光柵化。三角形頂點除了含有位置資訊外,還包含顏色、紋理等屬性資訊,當然這類資訊也需要進行插值。由於投影平面上的相同步長隨著三角形面與相機距離的增加而在三角形面上產生更大的步長。圖形處理需要採用非線性插值方式來計算相關屬性資訊才能獲得正確的結果。

如下圖所示,\(x-z\) 平面上存在一條與三角形的某乙個掃瞄線對應的線段,假如該線段不通過原點,則該線段方程可以表達為:

\[ax + bz = c , c \neq 0 \]

對於該條直線上的一點\((x,z)\),從做座標原點發出的光線到該點,通過計算可以獲得投影平面的交點,這個交點的\(z\)座標固定為\(e\),假設其\(x\)座標為\(p\),通過幾何關係可以計算出\((x,z)\)與\(p\)的關係

\[\frac = \frac \rightarrow x = -\fracz \]

將公式帶入帶線段方程可得:

\[(-\frac + b)z = c \rightarrow \frac = -\frac + \frac\]

考慮線段上兩個端點\((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 =-\frac + \frac \\ = -\frac + \frac \\ = (-\frac + \frac )(1-t) +(-\frac + \frac )t \\ = \frac (1-t) + \frac t \]

也就是說三角形表面上插值點的座標值倒數是線性關係。二維螢幕上的插值點的可以通過\(\frac\)$ 計算獲得

當對三角形進行光柵化時,三角形中任意一點的屬性都是需要相鄰頂點屬性進行插值獲得。假設線段兩個端點的深度值\(z_1\) , \(z_2\) , 分別包含屬性 \(b_1\) 、\(b_2\), 則插值屬性\(b_3\)與插值點的關係:

\[\frac = \frac\]

將\(z_3\)帶入公式可以獲得:

\[b_3 = \frac \\ = z_3 [ \frac (1-t) + \frac t] \\ \\ \longrightarrow \frac = \frac (1-t) + \frac t \]

也就是說三角形屬性插值與\(z\)倒數的乘積是線性插值。所以在光柵化的時候圖形處理器先計算\(\frac\)的線性插值,然後再計算的頂點屬性的插值結果

[2]: (mathematics.for.3d.game.programming.and.computer.graphics.3ed) [

[3]: 部落格文章

[4]: 關於光柵化的簡單介紹

透視校正插值

在投影變換視口變換後,需要對投影到螢幕上的平面三角形頂點屬性進行線性插值,例如顏色,紋理,深度等。但對於投影前在3d空間的三角形來說,這個插值並不是線性的。下面來推導一下這個插值。假設螢幕空間的三角形的三個頂點分別為 v 0,v 1,v 2 v p 是位於三角形一邊上的點 v 0 t v 1 v 0...

透視校正插值 OpenGL

在3d渲染中,輸入資料是一些primitive資訊,包括頂點位置 顏色 紋理座標等等。在光柵化階段,primitive 一般為三角形 被轉化成一系列的fragment 或者稱為畫素 這些fragment接下來要做ps操作,此時每個fragment都有位置 顏色 紋理座標這些屬性資訊,這些屬性資訊通過...

深度插值與透視紋理對映插值

在模型空間,世界空間,相機空間和剪裁空間中三角面上的紋理座標與空間座標是線性關係,按空間座標進行線性插值即可求得紋理座標。但在透視投影模式下在歸一化裝置空間和視口空間中紋理座標與空間座標就不再是線性關係了,要在歸一化裝置空間或視口空間插值計算紋理座標,需要進行非線性插值。其原因就在於透視投影模式下由...