【轉載】關於OpenGL的圖形流水線

 


 

本文轉載自 http://blog.csdn.net/racehorse/article/details/6593719 GLSL教程程序員


 

 

這是一些列來自lighthouse3d的GLSL教程,很是適合入門。我將邊學習邊翻譯該教程的內容,同時記錄在這裏,方便之後查詢。算法

 

流水線概述編程

下圖描述了一個簡化的圖形處理流水線,雖然簡略但仍然能夠展現着色器編程(shader programming)的一些重要概念。緩存

一個固定流水線包括以下功能:學習

頂點變換(Vertex Transformation)測試

這裏一個頂點是一個信息集合,包括空間中的位置、頂點的顏色、法線、紋理座標等。這一階段的輸入是獨立的頂點信息,固定功能流水線在這一階段一般進行以下工做:spa

·頂點位置變換.net

·爲每一個頂點計算光照翻譯

·紋理座標的生成與變換3d

圖元組合和光柵化(Primitive Assembly and Rasterization)

此階段的輸入是變換後的頂點和鏈接信息(connectivity information)。鏈接信息告訴流水線頂點如何組成圖元(三角形、四邊形等)。此階段還負責視景體(view frustum)裁剪和背面剔除。

光柵化決定了片段(fragment),以及圖元的像素位置。這裏的片段是指一塊數據,用來更新幀緩存(frame buffer)中特定位置的一個像素。一個片段除了包含顏色,還有法線和紋理座標等屬性,這些信息用來計算新的像素顏色值。

本階段的輸出包括:

·幀緩存中片段的位置

·在頂點變換階段計算出的信息對每一個片段的插值

這個階段利用在頂點變換階段算出的數據,結合鏈接信息計算出片段的數據。例如,每一個頂點包含一個變換後的位置,當它們組成圖元時,就能夠用來計算圖元的片段位置。另外一個例子是使用顏色,若是多邊形的每一個頂點都有本身的顏色值,那麼多邊形內部片段的顏色值就是各個頂點顏色插值獲得的。

片段紋理化和色彩化(Fragment Texturing and Coloring)

此階段的輸入是通過插值的片段信息。在前一階段已經經過插值計算了紋理座標和一個顏色值,這個顏色在本階段能夠用來和紋理元素進行組合。此外,這一階段還能夠進行霧化處理。一般最後的輸出是片段的顏色值以及深度信息。

光柵操做(Raster Operations)

此階段的輸入:

·像素位置

·片段深度和顏色值

在這個階段對片段進行一系列的測試,包括:

·剪切測試(scissor test)

·Alpha測試

·模版測試

·深度測試

若是測試成功,則根據當前的混合模式(blend mode)用片段信息來更新像素值。注意混合只能在此階段進行,由於片段紋理化和顏色化階段不能訪問幀緩存。幀緩存只能在此階段訪問。

一幅圖總結固定功能流水線(Visual Summary of the Fixed Functionality)

下圖直觀地總結了上述流水線的各個階段:

取代固定的功能(Replacing Fixed Functionality)

如今的顯卡容許程序員本身編程實現上述流水線中的兩個階段:

·頂點shader實現頂點變換階段的功能

·片段shader替代片段紋理化和色彩化的功能

 

頂點處理器

頂點處理器用來運行頂點shader(着色程序)。頂點shader的輸入是頂點數據,即位置、顏色、法線等。

下面的OpenGL程序發送數據到頂點處理器,每一個頂點中包含一個顏色信息和一個位置信息。

 

glBegin(...);
    glColor3f(0.2,0.4,0.6);
    glVertex3f(-1.0,1.0,2.0);
    glColor3f(0.2,0.4,0.8);
    glVertex3f(1.0,-1.0,2.0);
glEnd();

  

一個頂點shader能夠編寫代碼實現以下功能:

 

·使用模型視圖矩陣以及投影矩陣進行頂點變換

·法線變換及歸一化

·紋理座標生成和變換

·逐頂點或逐像素光照計算

·顏色計算

不必定要完成上面的全部操做,例如你的程序可能不使用光照。可是,一旦你使用了頂點shader,頂點處理器的全部固定功能都將被替換。因此你不能只編寫法線變換的shader而期望固定功能幫你完成紋理座標生成。

從上一節已經知道,頂點處理器並不知道鏈接信息,所以這裏不能執行拓撲信息有關的操做。好比頂點處理器不能進行背面剔除,它只是操做頂點而不是面。

頂點shader至少須要一個變量:gl_Position,一般要用模型視圖矩陣以及投影矩陣進行變換。頂點處理器能夠訪問OpenGL狀態,因此能夠用來處理材質和光照。最新的設備還能夠訪問紋理。

 

片段處理器

片段處理器能夠運行片段shader,這個單元能夠進行以下操做:

·逐像素計算顏色和紋理座標

·應用紋理

·霧化計算

·若是須要逐像素光照,能夠用來計算法線

片段處理器的輸入是頂點座標、顏色、法線等計算插值獲得的結果。在頂點shader中對每一個頂點的屬性值進行了計算,如今將對圖元中的每一個片段進行處理,所以須要插值的結果。

如同頂點處理器同樣,當你編寫片段shader後,全部固定功能將被取代,因此不能使用片段shader對片段材質化,同時用固定功能進行霧化。程序員必須編寫程序實現須要的全部效果。

片段處理器只對每一個片段獨立進行操做,並不知道相鄰片段的內容。相似頂點shader,咱們必須訪問OpenGL狀態,纔可能知道應用程序中設置的霧顏色等內容。

一個片段shader有兩種輸出:

·拋棄片段內容,什麼也不輸出

·計算片段的最終顏色gl_FragColor,當要渲染到多個目標時計算gl_FragData。

還能夠寫入深度信息,但上一階段已經算過了,因此沒有必要。

須要強調的是片段shader不能訪問幀緩存,因此混合(blend)這樣的操做只能發生在這以後。

相關文章
相關標籤/搜索