OpenGL ES 30 管線幾個階段
兩個規範組成:
- OpenGL ES 3.0 API 規範(OpenGL ES API)
- OpenGL ES 着色器語音3.0規範(OpenGL ES SL)
下圖展示兩OpenGL ES 3.0 圖形管線。 帶有陰影的方框表示OpenGL ES 3.0 中管線可編程階段
頂點着色器
頂點着色器的輸入
-
着色器程序
描述頂點上執行操作的頂點着色器程序源代碼或者可執行文件
-
頂點着色器輸入(屬性)
用頂點數組提供的每個頂點數據
-
統一變量(uniform)
頂點(或者片段)着色器使用的不變數據
-
採樣器
代表頂點着色器使用紋理的特殊統一變量類型
頂點着色器的輸出
頂點着色器的輸出變量,在圖元光柵化階段,爲每個生成的片段計算頂點着色器輸出值,並作爲輸入傳遞給片段着色器。用於從分配給每個圖元頂點的頂點着色器輸出生成每個片段值的機制成爲插值(Interpolation)。此外,OpenGL ES 3.0增加一個新功能--變換反饋,使得頂點着色器輸出可以選擇性的寫入一個輸出緩衝區(除了傳遞給片段着色器之外,也可能代替這種傳遞)。
頂點着色器的輸入和輸出如下圖:
頂點着色器示例
<pre><code>#version 300 es //matrix to convert a_position from momdel space to //normalized device space uniform mat4 u_mvpMatrix; //attributes input to the vertex shader in vec4 a_position; //position value in vec4 a_color; //input vertex color; //output of the vertex shader - input to fragment shader out vec4 v_color; void main() { v_color = a_color; gl_Position = u_mvpMatrix * a_position; } </code></pre>
圖元裝配
頂點着色器之後, OpenGL ES 3.0 圖形管線的下一個階段是圖元裝配。
圖元 Primitive
圖元是三角形,直線,或者點精靈等幾何對象
對於每個圖元,必須確定圖元是否位於視錐體(屏幕可見的3D空間區域)內。如果圖元沒有完全在視錐體內,則可能需要進行裁剪。若完全在視錐體外,則會被拋棄。裁剪之後,頂點位置被轉換爲屏幕座標。
也可以執行一次淘汰操作,根據圖元面向前方或者後方來確定是否拋棄它們。
光柵化
光柵化階段繪製對應的圖元。光柵化是將圖元轉化爲一組二維片段的過程,然後,這些片段由片段着色器處理。這些二維片段代表可在屏幕上繪製的像素。
片段着色器
對光柵化階段生成的每一個片段執行這個着色器。採用如下輸入:
-
着色器程序
描述片段上所執行操作的片段着色器程序源代碼或者可執行文件
-
輸入變量
光柵化單元用插值爲每個片段生成的頂點着色器輸出
-
統一變量
片段着色器使用的不變數據
-
採樣器
代表片段着色器所用紋理的特殊統一變量類型
片段着色器可以拋棄片段,也可以生成一個或者多個顏色值作爲輸出。一般的,除來渲染到多重渲染目標之外,片段着色器只輸出一個顏色值;在多重渲染目標的情況下,爲每個渲染目標輸出一個顏色值。
光柵化階段生成的顏色,深度,模板和屏幕座標位置變成OpengGL ES 3.0管線逐片段操作階段的輸入。
片段着色器示例
<pre><code>#version 300 es precision mediump float; //默認的精度限定符號 in vec4 v_color; //input vertex color from vertex shader out vec4 fragColor; //output fragment color void main(){ fragColor = v_color; } </code></pre>
逐片段操作
在片段着色器之後,下階段就是逐片段操作。
在逐片段操作階段,在每個片段上執行如下功能和測試
-
像素歸屬測試
像素歸屬測試是OpenGL ES的一部分,但是它實在OpenGL ES內部進行,不能控制
-
裁剪測試
測試是否位於裁剪區域之內
-
模板和深度測試
這些測試在輸入片段的模板和深度值上進行,以確定片段是否應該被拒絕
-
混合
混合將新生成的片段顏色值與保存在幀緩衝區位置的顏色值進行組合
-
抖動
寫入片段顏色,深度和模版值取決於啓用的相應寫入掩碼。寫入掩碼可以更精細的控制寫入相關緩衝區的顏色,深度,模版值。例如,可以設置顏色緩衝區的寫入掩碼,使得任何紅色值都不被寫入顏色緩衝區