OpenGL ES 3.0實現(xiàn)了具有可編程著色功能的圖形管線,如下圖所示頂點著色器和片元著色器是OpenGL ES 3.0中管線的可編程階段。

OpenGL ES 圖形管線
頂點著色器
- 頂點著色器輸入:
- 著色器程序 --- 描述頂點上執(zhí)行操作的頂點著?器程序源代碼/可執(zhí)行文件
- 頂點著色器輸入(屬性) --- 用頂點數(shù)組提供每個頂點的數(shù)據(jù)
- 統(tǒng)一變量(uniform) --- 頂點/?元著色器使用的不變數(shù)據(jù)
- 采樣器 --- 代表頂點著?器使用紋理的特殊統(tǒng)一變量類型

頂點著色器
-
頂點著?器業(yè)務(wù):
- 矩陣變換位置
- 計算光照公式生成逐頂點顏色
- ?成/變換紋理坐標(biāo)
總結(jié): 它可以用于執(zhí)行?定義計算,實施新的變換,照明或者傳統(tǒng)的固定功能所不允許的基于頂點的效果
頂點著色器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): 點,線,三?形等幾何對象。
圖元裝配: 將頂點數(shù)據(jù)計算成一個個圖元.在這個階段會執(zhí)行裁剪、透視分割和Viewport變換操作。
圖元類型和頂點所確定將被渲染的單獨圖元。對于每個單獨圖元及其對應(yīng)的頂點,圖元裝配階段執(zhí)行的操作包括:將頂點著?器的輸出值執(zhí)行裁剪、透視分割、視?變換后進(jìn)?光柵化階段。
光柵化
在這個階段繪制對應(yīng)的圖元(點/線/三角形). 光柵化就是將圖元轉(zhuǎn)化成一組二維片段的過程.?這些轉(zhuǎn)化的片段將由片元著?器處理.這些二維片段就是屏幕上可繪制的像素.
?段著?器/?元著?器
- ?元著色器/?段著?器輸入:
- 著?器程序—--描述片段上執(zhí)行操作的片元著?器程序源代碼/可執(zhí)行文件
- 輸?變量--—光柵化單元用插值為每個片段生成的頂點著?器輸出
- 統(tǒng)?變量(uniform)—--頂點/片元著?色器使用的不變數(shù)據(jù)
- 采樣器—--代表頂點著?器使用紋理的特殊統(tǒng)一變量類型

?元著?器
- ?元著?器業(yè)務(wù):
- 計算顏色
- 獲取紋理值
- 往像素點中填充顏色值(紋理值/顏色值)
總結(jié): 它可以用于圖片/視頻/圖形中每個像素的顏色填充(比如給視頻添加濾鏡,實際上就是將視頻中每個圖片的像素點顏色填充進(jìn)行修改.)
- 片元著色器GLSL代碼案例:
varying lowp vec2 varyTextCoord;
uniform sampler2D colorMap;
void main()
{
gl_FragColor = texture2D(colorMap, varyTextCoord);
}
逐片段操作

逐片段操作
- 像素歸屬測試: 確定幀緩存區(qū)中位置(Xw,Yw)的像素?前是不是歸屬于OpenGL ES所有. 例如,如果一個顯示OpenGL ES幀緩存區(qū)View被另外?個View所遮蔽.則窗口系統(tǒng)可以確定被遮蔽的像素不屬于OpenGL ES上下文.從而不全顯示這些像素.而像素歸屬測試是OpenGL ES的?部分,它不由開發(fā)者開人為控制,而是由OpenGL ES內(nèi)部進(jìn)行.
- 裁剪測試: 裁剪測試確定(Xw,Yw)是否位于作為OpenGL ES狀態(tài)的一部分裁剪矩形范圍內(nèi).如果該?段位于裁剪區(qū)域之外,則被拋棄.
- 深度測試: 輸?片段的深度值進(jìn)行?較,確定片段是否拒絕測試
- 混合: 將新生成的?段顏色與保存在幀緩存的位置的顏?值組合起來.
- 抖動: 抖動可?于最小化因為使用有限精度在幀緩存區(qū)中保存顏色值?產(chǎn)生的偽像。