可編程管線
可編程管線的定制性高,開發(fā)者可以根據(jù)需要編寫頂點渲染與像素渲染中的幾個環(huán)節(jié),如下圖,藍色底的為可編程的,有屬于頂點渲染的頂點著色器,幾何著色器,細(xì)分著色器和屬于像素渲染的片元著色器(像素著色器),著色器可理解為一個小程序,一般我們開發(fā)者比較多也必須編寫的是頂點著色器和片元著色器,而幾何著色器和細(xì)分著色器是有默認(rèn)的,使用默認(rèn)的即可.
圖片來自:OpenGL超級寶典筆記----渲染管線

以下簡單介紹上圖中的幾個階段:
頂點著色器
它可以用于執(zhí)?自定義計算,實施新的變換,照明或者傳統(tǒng)的固定功能所不允許的基于頂點的效果,例如:
- 矩陣變換位置
- 計算光照公式生成逐頂點顏色
- ?成/變換紋理坐標(biāo)
下面是一段GLSL寫的頂點著色器代碼,需要我們手動編譯和鏈接,具體的語法規(guī)則和使用后面會講.
attribute vec4 position;//頂點坐標(biāo)
attribute vec2 textCoordinate;//紋理坐標(biāo)
uniform mat4 rotateMatrix;//變換矩陣
varying lowp vec2 varyTextCoord; //這個也是紋理坐標(biāo),通過這個屬性傳遞給片元著色器
void main()
{
varyTextCoord = textCoordinate;
vec4 vPos = position;
vPos = vPos * rotateMatrix;
gl_Position = vPos;
}
基本圖形組裝(圖元裝配)
這個不能被開發(fā)者改變,這個階段將頂點數(shù)據(jù)計算成一個個圖元(點,線,三角形).
幾何著色器
圖元組裝階段的輸出會傳遞給幾何著色器(geometry shader)。幾何著色器把基本圖形形成的一系列頂點的集合作為輸入,它可以通過產(chǎn)生新頂點構(gòu)造出新的(或是其他的)基本圖形來生成其他形狀。
細(xì)分著色器
細(xì)分著色器(tessellation shaders)擁有把給定基本圖形細(xì)分為更多小基本圖形的能力。這樣我們就能在物體更接近玩家的時候通過創(chuàng)建更多的三角形的方式創(chuàng)建出更加平滑的視覺效果。
光柵化(像素化)
在這個階段繪制對應(yīng)的圖元(點/線/三角形). 光柵化就是將圖元轉(zhuǎn)化成一組二維片段的過程.而這些轉(zhuǎn)化的片段將由片元著?器處理.這些?二維片段就是屏幕上可繪制的像素

像素著色器(片元著色器)
它可以用于圖片/視頻/圖形中每個像素的顏色填充(比如給視頻添加濾鏡,實際上就是將視頻中每個圖片的像素點顏色填充進行修改.)
- 計算顏?
- 獲取紋理值
- 往像素點中填充顏色值(紋理值/顏色值);
varying lowp vec2 varyTextCoord;
uniform sampler2D colorMap;
void main()
{
gl_FragColor = texture2D(colorMap, varyTextCoord);
}
測試與混合
這個階段檢測像素的相應(yīng)的深度(和stencil)值,使用這些來檢查這個像素是否在另一個物體的前面或后面,如此做到相應(yīng)取舍。這個階段也會查看alpha值(alpha值是一個物體的透明度值)和物體之間的混合(blend)。所以即使在像素著色器中計算出來了一個像素所輸出的顏色,最后的像素顏色在渲染多個三角形的時候也可能完全不同。
關(guān)于著色器編譯及鏈接,請戳:使用GLSL加載圖片
關(guān)于變換矩陣,請戳:變換矩陣
關(guān)于GLSL語法,請戳:GLSL語法
關(guān)于固定管線,請戳:固定管線