Cg 程式設計/光柵化
光柵化是圖形管道中確定由圖元(例如三角形)覆蓋的畫素併為每個覆蓋畫素插值頂點著色器輸出引數(尤其是深度)的階段。然後將插值後的輸出引數傳遞給片段著色器。(從更廣泛的意義上講,“光柵化”也包括片段著色器的執行和每片段操作。)
通常,Cg 程式設計師不需要比上一段中描述的更多地瞭解光柵化階段。但是,瞭解一些細節有助於理解透視正確插值等特性以及由頂點著色器計算的頂點位置的第四個分量的作用。對於計算機圖形學中的一些高階演算法,也需要了解光柵化過程的一些細節。
光柵化的兩個主要部分是
- 確定由圖元(例如三角形)覆蓋的畫素
- 對所有覆蓋畫素進行頂點著色器輸出引數和深度的線性插值

在 OpenGL(ES)中,幀緩衝區的畫素被定義為如果畫素的中心被圖元覆蓋,則被圖元覆蓋,如右側的圖所示。
當畫素的中心恰好在圖元的邊界上時,有一些規則。這些規則確保兩個相鄰的三角形(即共享一條邊的三角形)從不共享任何畫素(除非它們實際上重疊)並且從不漏掉沿邊的任何畫素;即,沿兩個相鄰三角形之間邊的每個畫素都被其中一個三角形覆蓋,但不會被兩個三角形覆蓋。這對於避免孔洞和(在半透明三角形的情況下)對同一畫素進行多次光柵化非常重要。但是,這些規則是特定於 GPU 實現的。此外,除 OpenGL 之外的其他 API 可能會指定不同的規則。因此,它們在這裡不會被討論。

一旦確定了所有覆蓋畫素,就會為每個畫素插值頂點著色器的輸出引數。為簡單起見,我們只討論三角形的情況。(一條線就像一個頂點位置相同的三角形。)
對於每個三角形,頂點著色器計算三個頂點的位置。在右側的圖中,這些位置標記為 ,,和 。頂點著色器還計算每個頂點的輸出引數值。我們將其中一個表示為 ,,和 。注意,這些值指的是在不同頂點計算的同一個輸出引數。我們要插值輸出引數的畫素中心的座標在圖中用 表示。
我們希望計算一個新的插值值 在畫素中心 ,從三個頂點的值 ,,和 中進行插值。有多種方法可以做到這一點。一種是使用重心座標 ,,和 ,它們是以這種方式計算的
三角形區域 ,, 和 也在圖中顯示。在三維空間(或二維空間加一個額外維度)中,三個點 ,, 之間的三角形的面積,可以計算為向量叉積長度的一半
使用重心座標 , 和 ,在點 處對 進行插值,使用三個頂點上的值 , 和 ,非常容易
這樣,所有輸出引數都可以對所有覆蓋的畫素進行線性插值。

引數的透視正確插值
[edit | edit source]如果將上一節中描述的插值應用於使用透視投影的場景,可能會導致某些失真。對於透視正確的插值,視點到頂點的距離被放在三個頂點位置的第四個分量(,和)中,並使用以下公式進行插值
因此,頂點位置的第四個分量對於輸出引數的透視正確插值非常重要。因此,在頂點著色器中不執行透視除法(將此第四個分量設定為 1)也很重要,否則在透視投影的情況下插值將不正確。(此外,在某些情況下,裁剪也會失敗。)
需要注意的是,圖形管道實際實現不太可能實現完全相同的過程,因為存在更有效的技術。但是,所有透視正確的線性插值方法都會導致相同的插值結果。
有關 OpenGL ES 光柵化的所有詳細資訊在“Khronos OpenGL ES API 登錄檔”“Khronos OpenGL ES API Registry”上提供的“OpenGL ES 2.0.x 規範”的第 3 章中完整定義。
< Cg 程式設計