
如你所見(jiàn),圖形渲染管線包含很多部分,每個(gè)部分都將在轉(zhuǎn)換頂點(diǎn)數(shù)據(jù)到最終像素這一過(guò)程中處理各自特定的階段。我們會(huì)概括性地解釋一下渲染管線的每個(gè)部分,讓你對(duì)圖形渲染管線的工作方式有個(gè)大概了解。
首先,我們以數(shù)組的形式傳遞3個(gè)3D坐標(biāo)作為圖形渲染管線的輸入,用來(lái)表示一個(gè)三角形,這個(gè)數(shù)組叫做頂點(diǎn)數(shù)據(jù)(Vertex Data);頂點(diǎn)數(shù)據(jù)是一系列頂點(diǎn)的集合。一個(gè)頂點(diǎn)(Vertex)是一個(gè)3D坐標(biāo)的數(shù)據(jù)的集合。而頂點(diǎn)數(shù)據(jù)是用頂點(diǎn)屬性(Vertex Attribute)表示的,它可以包含任何我們想用的數(shù)據(jù),但是簡(jiǎn)單起見(jiàn),我們還是假定每個(gè)頂點(diǎn)只由一個(gè)3D位置(譯注1)和一些顏色值組成的吧。
圖形渲染管線的第一個(gè)部分是頂點(diǎn)著色器(Vertex Shader),它把一個(gè)單獨(dú)的頂點(diǎn)作為輸入。頂點(diǎn)著色器主要的目的是把3D坐標(biāo)轉(zhuǎn)為另一種3D坐標(biāo)(后面會(huì)解釋),同時(shí)頂點(diǎn)著色器允許我們對(duì)頂點(diǎn)屬性進(jìn)行一些基本處理。
圖元裝配(Primitive Assembly)階段將頂點(diǎn)著色器輸出的所有頂點(diǎn)作為輸入(如果是GL_POINTS,那么就是一個(gè)頂點(diǎn)),并所有的點(diǎn)裝配成指定圖元的形狀;本節(jié)例子中是一個(gè)三角形。
圖元裝配階段的輸出會(huì)傳遞給幾何著色器(Geometry Shader)。幾何著色器把圖元形式的一系列頂點(diǎn)的集合作為輸入,它可以通過(guò)產(chǎn)生新頂點(diǎn)構(gòu)造出新的(或是其它的)圖元來(lái)生成其他形狀。例子中,它生成了另一個(gè)三角形。
幾何著色器的輸出會(huì)被傳入光柵化階段(Rasterization Stage),這里它會(huì)把圖元映射為最終屏幕上相應(yīng)的像素,生成供片段著色器(Fragment Shader)使用的片段(Fragment)。在片段著色器運(yùn)行之前會(huì)執(zhí)行裁切(Clipping)。裁切會(huì)丟棄超出你的視圖以外的所有像素,用來(lái)提升執(zhí)行效率。
OpenGL中的一個(gè)片段是OpenGL渲染一個(gè)像素所需的所有數(shù)據(jù)。
片段著色器的主要目的是計(jì)算一個(gè)像素的最終顏色,這也是所有OpenGL高級(jí)效果產(chǎn)生的地方。通常,片段著色器包含3D場(chǎng)景的數(shù)據(jù)(比如光照、陰影、光的顏色等等),這些數(shù)據(jù)可以被用來(lái)計(jì)算最終像素的顏色。
在所有對(duì)應(yīng)顏色值確定以后,最終的對(duì)象將會(huì)被傳到最后一個(gè)階段,我們叫做Alpha測(cè)試和混合(Blending)階段。這個(gè)階段檢測(cè)片段的對(duì)應(yīng)的深度(和模板(Stencil))值(后面會(huì)講),用它們來(lái)判斷這個(gè)像素是其它物體的前面還是后面,決定是否應(yīng)該丟棄。這個(gè)階段也會(huì)檢查alpha值(alpha值定義了一個(gè)物體的透明度)并對(duì)物體進(jìn)行混合(Blend)。所以,即使在片段著色器中計(jì)算出來(lái)了一個(gè)像素輸出的顏色,在渲染多個(gè)三角形的時(shí)候最后的像素顏色也可能完全不同。
可以看到,圖形渲染管線非常復(fù)雜,它包含很多可配置的部分。然而,對(duì)于大多數(shù)場(chǎng)合,我們只需要配置頂點(diǎn)和片段著色器就行了。幾何著色器是可選的,通常使用它默認(rèn)的著色器就行了。
在現(xiàn)代OpenGL中,我們必須定義至少一個(gè)頂點(diǎn)著色器和一個(gè)片段著色器(因?yàn)镚PU中沒(méi)有默認(rèn)的頂點(diǎn)/片段著色器)。出于這個(gè)原因,剛開(kāi)始學(xué)習(xí)現(xiàn)代OpenGL的時(shí)候可能會(huì)非常困難,因?yàn)樵谀隳軌蜾秩咀约旱牡谝粋€(gè)三角形之前已經(jīng)需要了解一大堆知識(shí)了。在本節(jié)結(jié)束你最終渲染出你的三角形的時(shí)候,你也會(huì)了解到非常多的圖形編程知識(shí)。


