本文轉載自 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程序發送數據到頂點處理器,每一個頂點中包含一個顏色信息和一個位置信息。
一個頂點shader能夠編寫代碼實現以下功能:
·使用模型視圖矩陣以及投影矩陣進行頂點變換
·法線變換及歸一化
·紋理座標生成和變換
·逐頂點或逐像素光照計算
·顏色計算
不必定要完成上面的全部操做,例如你的程序可能不使用光照。可是,一旦你使用了頂點shader,頂點處理器的全部固定功能都將被替換。因此你不能只編寫法線變換的shader而期望固定功能幫你完成紋理座標生成。
從上一節已經知道,頂點處理器並不知道鏈接信息,所以這裏不能執行拓撲信息有關的操做。好比頂點處理器不能進行背面剔除,它只是操做頂點而不是面。
頂點shader至少須要一個變量:gl_Position,一般要用模型視圖矩陣以及投影矩陣進行變換。頂點處理器能夠訪問OpenGL狀態,因此能夠用來處理材質和光照。最新的設備還能夠訪問紋理。
片段處理器
片段處理器能夠運行片段shader,這個單元能夠進行以下操做:
·逐像素計算顏色和紋理座標
·應用紋理
·霧化計算
·若是須要逐像素光照,能夠用來計算法線
片段處理器的輸入是頂點座標、顏色、法線等計算插值獲得的結果。在頂點shader中對每一個頂點的屬性值進行了計算,如今將對圖元中的每一個片段進行處理,所以須要插值的結果。
如同頂點處理器同樣,當你編寫片段shader後,全部固定功能將被取代,因此不能使用片段shader對片段材質化,同時用固定功能進行霧化。程序員必須編寫程序實現須要的全部效果。
片段處理器只對每一個片段獨立進行操做,並不知道相鄰片段的內容。相似頂點shader,咱們必須訪問OpenGL狀態,纔可能知道應用程序中設置的霧顏色等內容。
一個片段shader有兩種輸出:
·拋棄片段內容,什麼也不輸出
·計算片段的最終顏色gl_FragColor,當要渲染到多個目標時計算gl_FragData。
還能夠寫入深度信息,但上一階段已經算過了,因此沒有必要。
須要強調的是片段shader不能訪問幀緩存,因此混合(blend)這樣的操做只能發生在這以後。