OpenGL ES 3.0實現了具有可編程著色功能的圖形管線,如下圖所示頂點著色器和片元著色器是OpenGL ES 3.0中管線的可編程階段。
OpenGL ES 圖形管線
頂點著色器
- 頂點著色器輸入:
- 著色器程序 --- 描述頂點上執行操作的頂點著?器程序源代碼/可執行文件
- 頂點著色器輸入(屬性) --- 用頂點數組提供每個頂點的數據
- 統一變量(uniform) --- 頂點/?元著色器使用的不變數據
- 采樣器 --- 代表頂點著?器使用紋理的特殊統一變量類型
頂點著色器
-
頂點著?器業務:
- 矩陣變換位置
- 計算光照公式生成逐頂點顏色
- ?成/變換紋理坐標
總結: 它可以用于執行?定義計算,實施新的變換,照明或者傳統的固定功能所不允許的基于頂點的效果
頂點著色器GLSL代碼案例:
attribute vec4 position;
attribute vec2 textCoordinate;
uniform mat4 rotateMatrix;
varying lowp vec2 varyTextCoord;
void main()
{
varyTextCoord = textCoordinate;
vec4 vPos = position;
vPos = vPos * rotateMatrix;
gl_Position = vPos;
}
圖元裝配
頂點著?器之后,下一個階段就是圖元裝配。
- 圖元(Primitive): 點,線,三?形等幾何對象。
圖元裝配: 將頂點數據計算成一個個圖元.在這個階段會執行裁剪、透視分割和Viewport變換操作。
圖元類型和頂點所確定將被渲染的單獨圖元。對于每個單獨圖元及其對應的頂點,圖元裝配階段執行的操作包括:將頂點著?器的輸出值執行裁剪、透視分割、視?變換后進?光柵化階段。
光柵化
在這個階段繪制對應的圖元(點/線/三角形). 光柵化就是將圖元轉化成一組二維片段的過程.?這些轉化的片段將由片元著?器處理.這些二維片段就是屏幕上可繪制的像素.
?段著?器/?元著?器
- ?元著色器/?段著?器輸入:
- 著?器程序—--描述片段上執行操作的片元著?器程序源代碼/可執行文件
- 輸?變量--—光柵化單元用插值為每個片段生成的頂點著?器輸出
- 統?變量(uniform)—--頂點/片元著?色器使用的不變數據
- 采樣器—--代表頂點著?器使用紋理的特殊統一變量類型
?元著?器
- ?元著?器業務:
- 計算顏色
- 獲取紋理值
- 往像素點中填充顏色值(紋理值/顏色值)
總結: 它可以用于圖片/視頻/圖形中每個像素的顏色填充(比如給視頻添加濾鏡,實際上就是將視頻中每個圖片的像素點顏色填充進行修改.)
- 片元著色器GLSL代碼案例:
varying lowp vec2 varyTextCoord;
uniform sampler2D colorMap;
void main()
{
gl_FragColor = texture2D(colorMap, varyTextCoord);
}
逐片段操作
逐片段操作
- 像素歸屬測試: 確定幀緩存區中位置(Xw,Yw)的像素?前是不是歸屬于OpenGL ES所有. 例如,如果一個顯示OpenGL ES幀緩存區View被另外?個View所遮蔽.則窗口系統可以確定被遮蔽的像素不屬于OpenGL ES上下文.從而不全顯示這些像素.而像素歸屬測試是OpenGL ES的?部分,它不由開發者開人為控制,而是由OpenGL ES內部進行.
- 裁剪測試: 裁剪測試確定(Xw,Yw)是否位于作為OpenGL ES狀態的一部分裁剪矩形范圍內.如果該?段位于裁剪區域之外,則被拋棄.
- 深度測試: 輸?片段的深度值進行?較,確定片段是否拒絕測試
- 混合: 將新生成的?段顏色與保存在幀緩存的位置的顏?值組合起來.
- 抖動: 抖動可?于最小化因為使用有限精度在幀緩存區中保存顏色值?產生的偽像。