天天看點

透視矯正插值

1、介紹

我們将推導(并證明)一種在螢幕空間通過線性插值實作透視校正插值的方法。線上性圖形基元(如直線和多邊形)的光栅化過程中,直接的螢幕空間頂點屬性線性插值通常不會産生正确的透視結果。

在傳統的光栅圖形中,顔色、紋理坐标和法向量等屬性通常與圖形基元的頂點相關聯[1,2]。在三維空間中,每個屬性的值在每個圖形基元中都是線性變化的,在三維頂點通過透視投影投影到二維圖像平面(或螢幕)之後,三維空間中屬性值的這種線性變化不會轉化為螢幕空間中類似的線性變化。是以,如果對螢幕空間中的這些屬性值應用直接的線性插值,通常會在圖像中得到錯誤的結果。圖1顯示了這樣一個例子。

透視矯正插值

圖1:螢幕空間(或圖像平面)中屬性值的直接線性插值并不總是産生透視正确的結果。

為了便于說明,圖1僅顯示了二維空間中投影到一維圖像平面上的一條直線,但相同的參數也可以應用于投影到二維圖像平面上的三維線性幾何圖元。圖中,二維空間中AB線的A點和B點分别投影到一維圖像平面中的A點和B點上。頂點處的屬性值是強度值。在A處,強度值為0.0,在B處,強度值為1.0。是以,a和b處的強度值分别為0.0和1.0。假設c是圖像平面中a和b之間的中點。如果我們在圖像平面(或螢幕空間)線性插值a和b處的強度值,則c處的強度值為0.5。但是,如果我們将點c“取消投影”到AB線上的點C上,我們可以看到C不必是A和B之間的中點。由于強度值在A到B之間呈線性變化(在3D空間中),如果C不是A和B之間的中點,則C處的強度值不應為0.5。

盡管如此,仍然可以通過在螢幕空間中進行線性插值來獲得透視校正結果。這可以通過插值屬性的某些函數的值來實作,而不是直接插值屬性。然後,每個插值結果由另一個函數(逆函數)進行變換,以獲得螢幕空間中所需點的最終屬性值。您将看到這些函數使用頂點的z值

2、插值z值

在透視投影将基本體的三維頂點投影到二維圖像平面上之前,許多圖形渲染系統假定虛拟攝影機已經位于三維空間的原點,并沿-z或+z方向進行觀察。這定義了一個稱為相機坐标系的坐标系。相機的固定觀察方向還允許我們始終有一個垂直于z軸的圖像平面,這大大簡化了透視投影計算。在不喪失一般性的情況下,我們假設錄影機正朝+z方向看,并且圖像平面在錄影機前面的距離d處(見圖2)。

許多光栅圖形渲染系統使用z緩沖區[1,2]來執行隐藏曲面移除。這要求在螢幕上投影基本體的每個像素處,必須知道基本體上相應3D點的z坐标(z值)。但是,由于實際隻投影基本體的頂點,是以它們在螢幕空間中對應的2D圖像點是螢幕空間中已知z值的唯一位置。為了更快的光栅化,我們希望使用已知的頂點圖像點的z值來導出其他像素的z值。

z值可以被視為一個屬性,其值在3D線性基本體中線性變化。與我們在圖1中看到的示例一樣,螢幕空間中z值的直接線性插值并不總是産生透視正确的結果。但是,我們将在下面看到,我們實際上可以線性插值z值的倒數,以獲得正确的結果。

與圖1類似,圖2顯示了二維相機坐标系中投影到一維圖像平面上的一條線。标題解釋了我們将在公式推導中使用的符号。在圖中,s是圖像平面上的插值參數,t是基本體上的插值參數。

透視矯正插值

圖2:虛拟錄影機在錄影機坐标系中以+z方向觀察。圖像平面在相機前面距離d處。A、 B和C分别是基本體上屬性值為I1、I2和It的點,它們在圖像平面上的圖像分别是A、B和C。s和t是用于線性插值的參數。

我們的目标是導出公式,以便在螢幕空間中正确地插值z值。同樣的推導可以直接應用于投影到二維圖像平面上的三維線性基本體的情況。參照圖2,通過相似的三角形,我們得到

透視矯正插值

通過在圖像平面(或螢幕空間)中進行線性插值,我們得到

透視矯正插值

通過對錄影機坐标系中的基元進行線性插值,我們得到

透視矯正插值

将(4)和(5)代入(3),

透視矯正插值

将(1)和(2)代入(7),

透視矯正插值

将(6)代入(8),

透視矯正插值

可以簡化為

透視矯正插值

把(10)帶入(6),我們得到,

透視矯正插值
透視矯正插值

方程(12)告訴我們,隻要在1/Z1和1/Z2之間進行線性插值,就可以正确地導出圖像平面中c點的z值,然後計算插值結果的倒數。對于z緩沖區,甚至不需要計算最終的倒數,因為我們隻需要在z值比較期間反轉比較操作。

3、插值屬性值

在這裡,我們希望導出公式,以便在螢幕空間中正确地插值其他屬性值。請再次參考圖2。通過在錄影機坐标系中的基元上對屬性值進行線性插值,我們得到

透視矯正插值

把(10)帶入(13),我們得到,

透視矯正插值

可以重新排列成

透視矯正插值

從(12),我們可以看到(15)中的分母是1/Zt。是以,

透視矯正插值

(16)的意思是,隻需在I1/Z1和I2/Z2之間進行線性插值,就可以正确地導出圖像平面中c點的屬性值,然後将插值結果除以1/Zt,其本身可以通過螢幕空間中的線性插值導出,如(12)所示。

參考文獻

[1]詹姆斯福利,安德裡斯範達姆,史蒂文費納和約翰休斯。計算機圖形學:原理與實踐,第二版。Addison Wesley,1990。[2]Mason Woo,Jackie Neider,Tom Davis,Dave Shreiner(OpenGL架構評審委員會)。OpenGL程式設計指南,第三版:學習OpenGL的官方指南,1.2版。艾迪森·韋斯利,1999年。