渲染管線--可編程管線

可編程管線

可編程管線的定制性高,開發(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)于固定管線,請戳:固定管線

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容