GLSL 程式設計/OpenGL ES 2.0 管道
OpenGL ES 2.0 管道對於 OpenGL ES 2.0 和 WebGL 中的 GLSL 著色器非常重要。它也與 OpenGL 2.0 管道非常相似,只是缺少了在 OpenGL 的較新版本中被棄用的許多功能。因此,OpenGL ES 2.0 管道不僅對於使用 OpenGL ES 2.0 進行移動圖形程式設計和使用 WebGL 進行基於 Web 的 3D 圖形程式設計的程式設計師來說高度相關,而且也是學習使用 OpenGL 進行基於桌面的 3D 圖形程式設計(包括 Blender、Unity 和 Torque 3D 等遊戲引擎中的 3D 圖形)的很好起點。
GPU 是高度並行的處理器。這是它們效能的主要原因。事實上,它們實現了兩種並行性:垂直並行和水平並行。

- **垂直並行**描述了在管道不同**階段**的並行處理。這個概念在福特汽車公司的流水線發展中也至關重要:許多工人可以在相當簡單的任務上並行工作。這使得大規模生產(因此也使得大規模消費)成為可能。在 GPU 處理單元的背景下,簡單任務對應於不太複雜的處理單元,這節省了成本和功耗。

- **水平並行**描述了在**多個管道**中處理工作的可能性。這允許比單個管道中的垂直並行實現更多的並行。同樣,這個概念也應用於福特汽車公司和許多其他行業。在 GPU 的背景下,圖形管道的水平並行是實現現代 GPU 效能的重要特徵。
下圖顯示了垂直並行(用方框表示的階段處理)和水平並行(用方框之間的多個箭頭表示的每個階段的多個處理單元)的說明。
| 頂點資料 | 例如,由 3D 建模工具提供的三角形網格 | |||
| ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ | 許多頂點並行處理 | |||
| 頂點著色器 | 一個小的 GLSL 程式應用於每個頂點 | |||
| ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ | ||||
| 圖元裝配 | 設定圖元,例如三角形、線和點 | |||
| ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ | 許多圖元並行處理 | |||
| 光柵化 | 對圖元(例如三角形)覆蓋的所有畫素進行資料插值 | |||
| ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ | 許多片段(對應於畫素)並行處理 | |||
| 片段著色器 | 一個小的 GLSL 程式應用於每個片段(即覆蓋的畫素) | |||
| ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ | ||||
| 每個片段的操作 | 對每個片段(即覆蓋的畫素)進行可配置操作 | |||
| ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ | 許多片段的結果並行寫入幀緩衝區 | |||
| 幀緩衝區 | 儲存計算的片段顏色的畫素陣列 | |||
在下圖中,任何兩個階段之間只有一個箭頭。但是,應該理解,GPU 通常使用大規模的水平並行來實現圖形管道。只有 OpenGL 的軟體實現,例如 Mesa 3D (參見維基百科條目),通常實現單個管道。
OpenGL ES 1.x 和核心 OpenGL 1.x 的管道是可配置的固定功能管道,即沒有包含程式的可能性。在 OpenGL(ES)2.0 中,管道的兩個階段(頂點著色器和片段著色器階段)是可程式設計的,即在這些階段中應用了用 GLSL 編寫的微小程式(著色器)。在下圖中,可程式設計階段用綠色方框表示,固定功能階段用灰色方框表示,資料用藍色方框表示。
| 頂點資料 | 例如,由 3D 建模工具提供的三角形網格 | |||
| ↓ | ||||
| 頂點著色器 | 一個小的 GLSL 程式應用於每個頂點 | |||
| ↓ | ||||
| 圖元裝配 | 設定圖元,例如三角形、線和點 | |||
| ↓ | ||||
| 光柵化 | 對圖元覆蓋的所有畫素進行資料(例如顏色)插值 | |||
| ↓ | ||||
| 片段著色器 | 一個小的 GLSL 程式應用於每個片段(即覆蓋的畫素) | |||
| ↓ | ||||
| 每個片段的操作 | 對每個片段(即覆蓋的畫素)進行可配置操作 | |||
| ↓ | ||||
| 幀緩衝區 | 儲存計算的片段顏色的畫素陣列 | |||
頂點著色器和片段著色器階段將在特定平臺教程中進行更詳細的討論。光柵化階段在“光柵化”部分中討論,每個片段的操作在“每個片段的操作”部分中討論。
圖元裝配階段主要包括將圖元裁剪到視錐體(螢幕上可見的空間部分)以及可選地剔除正面和/或背面圖元。這些可能性將在特定平臺教程中進行更詳細的討論。
為了程式設計 GLSL 頂點和片段著色器,理解每個著色器的輸入和輸出非常重要。為此,理解資料如何在 OpenGL 管道的所有階段之間傳遞也很有用。這在下圖中說明
| 頂點資料 | ||||
| ↓ | 屬性(通常是位置、顏色、法線向量和紋理座標) | |||
| 頂點著色器 | ← | 制服(常量);(可選的紋理資料,但在大多數 OpenGL ES 2.0 實現中沒有) | ||
| ↓ | 變化量(在頂點),頂點位置和點大小 | |||
| 圖元裝配 | ||||
| ↓ | 變化量(在頂點),頂點位置和點大小 | |||
| 光柵化 | ||||
| ↓ | 變化量(現在在畫素上插值),片段座標,點座標,正面標誌 | |||
| 片段著色器 | ← | 制服(常量)和紋理資料(影像) | ||
| ↓ | 片段顏色和片段深度 | |||
| 每個片段的操作 | ||||
| ↓ | 片段顏色和片段深度 | |||
| 幀緩衝區 | ||||
**屬性**(或頂點屬性,或屬性變數)是根據頂點資料定義的。屬性中的頂點位置位於物件座標中,即這是在 3D 建模工具中指定的 位置。
**制服**(或制服變數)對於渲染特定圖元(例如三角形)時執行的所有頂點著色器和所有片段著色器具有相同的值。但是,它們可以針對其他圖元進行更改。通常,頂點變換、光源和材質的規範等作為制服指定。
**變化量**(或變化量變數)必須由頂點著色器和片段著色器一致地定義(即頂點著色器必須定義與片段著色器相同的變化量變數)。通常,變化量定義用於顏色、法線向量和/或紋理座標。
**紋理資料**包括一個制服取樣器,它指定紋理取樣單元,而紋理取樣單元反過來指定從中獲取顏色的紋理影像。
其他資料將在特定平臺的教程中描述。
OpenGL ES 2.0 管道在“OpenGL ES 2.0.x 規範”和“OpenGL ES 著色語言 1.0.x 規範”中進行了全面詳細的定義,這些規範可在“Khronos OpenGL ES API 登錄檔”中獲得。
Addison-Wesley 出版了 Aaftab Munshi、Dan Ginsburg 和 Dave Shreiner 撰寫的《OpenGL ES 2.0 程式設計指南》一書的第 1 章,其中對 OpenGL ES 2.0 管道進行了更易於理解的描述(參見其網站)。