Cg 程式設計/逐片段操作
逐片段操作是 圖形管道 的一部分,通常包含一系列測試和操作,這些測試和操作可以在片段著色器生成的片段顏色寫入幀緩衝區中對應的畫素之前修改它。如果任何測試失敗,則該片段將被丟棄。(此規則的一個例外是模板測試,它可以配置為即使片段未透過模板和/或深度測試,也可以更改畫素的模板值。)
在逐片段操作的概述中,藍色方框代表資料,灰色方框代表可配置的逐片段操作。
| 片段資料(顏色和深度) | 片段著色器的輸出 | |||
| ↓ | ||||
| 畫素所有權測試 | 通常不能由應用程式自定義 | |||
| ↓ | ||||
| 剪下測試 | 如果片段位於指定(剪下)矩形之外,則失敗 | |||
| ↓ | ||||
| Alpha 測試 | 不在 OpenGL ES 2.x 中;結果取決於片段的 alpha 值(不透明度)、參考 alpha 值和配置的 alpha 測試 | |||
| ↓ | ||||
| 模板測試 | 結果取決於相應畫素在模板緩衝區中的值和配置的模板測試 | |||
| ↓ | ||||
| 深度測試 | 結果取決於片段的深度、相應畫素在深度緩衝區中的深度以及配置的深度測試 | |||
| ↓ | ||||
| 混合 | 結果取決於片段顏色(包括其不透明度)、幀緩衝區中相應畫素的顏色以及配置的混合方程 | |||
| ↓ | ||||
| 抖動 | 通常不能由應用程式自定義 | |||
| ↓ | ||||
| 邏輯運算 | 不在 OpenGL ES 2.x 中;結果取決於片段的顏色、幀緩衝區中相應畫素的顏色以及配置的邏輯(按位)運算 | |||
| ↓ | ||||
| 幀緩衝區(顏色、深度和模板值) | 可以停用對幀緩衝區的寫入,以針對各個通道 | |||
一些逐片段操作特別重要,因為它們有已建立的應用程式
- 深度測試用於以正確的遮擋渲染不透明的圖元(例如三角形)。這是透過將片段的深度與先前渲染的最前端片段的深度進行比較來實現的,該深度儲存在深度緩衝區中。如果片段更遠,則深度測試失敗,該片段將被丟棄。否則,該片段將成為新的最前端片段,其深度將儲存在深度緩衝區中。
- 混合用於透過混合(即合成)片段的顏色與已儲存在幀緩衝區中的顏色來渲染半透明圖元(玻璃、火焰、光暈等)。這通常與停用寫入深度緩衝區相結合,以避免半透明圖元遮擋其他圖元。
- 模板測試通常用於將渲染限制在螢幕的某些區域,例如鏡子、視窗或 3D 場景中更一般的“門戶”。它在某些演算法中也有更高階的用途,例如陰影體積。
有關特定逐片段操作的更多詳細資訊,請參閱特定於平臺的教程,因為它取決於平臺以及操作的配置方式。
雖然 OpenGL 和 Direct3D 等 API 的規範對逐片段操作施加了特定的順序,但 GPU 可以在不改變結果的情況下更改這些操作的順序。事實上,只要有可能,GPU 會在執行片段著色器之前執行許多測試。在這種情況下,對於已透過其中一項測試失敗的片段,不會執行片段著色器。(一個例子是所謂的“早期深度測試”。)這可以帶來可觀的效能提升。
逐片段操作通常是可配置的,但不可程式設計,即可以以多種方式配置各種測試,但不能編寫程式來計算這些測試。但是,這種情況正在發生變化。例如,OpenGL ES 2.0 不提供 alpha 測試,因為可以在片段著色器中透過條件丟棄操作實現相同的功能,這實際上是一個可程式設計的 alpha 測試。
OpenGL ES 2.0 的逐片段操作在“OpenGL ES 2.0.x 規範”第 4 章中進行了詳細定義,可在 “Khronos OpenGL ES API 登錄檔” 中獲取。
Aaftab Munshi、Dan Ginsburg 和 Dave Shreiner 在 Addison-Wesley 出版的一本書“OpenGL ES 2.0 程式設計指南”第 11 章中給出了更易於理解的描述(請參閱 其網站)。
< Cg 程式設計