【GLSL教程】(一)圖形流水線

vampirem發表於2013-09-17
這是一些列來自lighthouse3d的GLSL教程,非常適合入門。我將邊學習邊翻譯該教程的內容,同時記錄在這裡,方便以後查詢。


流水線概述

下圖描述了一個簡化的圖形處理流水線,雖然簡略但仍然可以展示著色器程式設計(shader programming)的一些重要概念。


一個固定流水線包括如下功能:

頂點變換(Vertex Transformation)

這裡一個頂點是一個資訊集合,包括空間中的位置、頂點的顏色、法線、紋理座標等。這一階段的輸入是獨立的頂點資訊,固定功能流水線在這一階段通常進行如下工作:

·頂點位置變換

·為每個頂點計算光照

·紋理座標的生成與變換

圖元組合和光柵化(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程式傳送資料到頂點處理器,每個頂點中包含一個顏色資訊和一個位置資訊。

  1. glBegin(...);  
  2.     glColor3f(0.2,0.4,0.6);  
  3.     glVertex3f(-1.0,1.0,2.0);  
  4.     glColor3f(0.2,0.4,0.8);  
  5.     glVertex3f(1.0,-1.0,2.0);  
  6. glEnd();  
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)這樣的操作只能發生在這之後。


相關文章