3D圖形渲染管線 (轉)

 

什麼是渲染(Rendering)
    渲染簡單的理解可能可以是這樣:就是將三維物體或三維場景的描述轉化爲一幅二維圖像,生成的二維圖像能很好的反應三維物體或三維場景(如圖1):

    圖1:Rendering


什麼是渲染管線
    渲染管線也稱爲渲染流水線,是顯示芯片內部處理圖形信號相互獨立的的並行處理單元。一個流水線是一序列可以並行和按照固定順序進行的階段。每個階段都從它的前一階段接收輸入,然後把輸出發給隨後的階段。就像一個在同一時間內,不同階段不同的汽車一起製造的裝配線,傳統的圖形硬件流水線以流水的方式處理大量的頂點、幾何圖元和片段。
    圖2顯示了當今圖形處理器所使用的圖形硬件流水線。三維應用程序傳給圖形處理器一序列的頂點組成不同的幾何圖元:典型的多邊形、線段和點。正如圖3所示,有許多種方法來制定幾何圖元。
   
圖2:圖形硬件渲染管線

圖3:幾何圖形的類型

一.頂點變換(Vertex Transformation):
    頂點變換是圖形硬件渲染管線種的第一個處理階段。頂點變換在每個頂點上執行一系列的數學操作。這些操作包括把頂點位置變換到屏幕位置以便光柵器使用,爲貼圖產生紋理座標,以及照亮頂點以決定它的顏色。
頂點變換中的一些座標:

座標系統:



圖4:用於頂點處理的座標系統和變換
物體空間:
    應用程序在一個被稱爲物體空間(也叫模型空間)的座標系統裏指定頂點位置。當一個美工人員創建了一個物體的三維模型的時候,他選擇了一個方便的方向、比例和位置來放置模型的組成頂點。一個物體的物體空間可以與其它物體的物體空間沒有任何關係。
世界空間:

    一個物體的物體空間和其它對象沒有空間上的關係。世界空間的目的是爲在你的場景中的所有物體提供一個絕對的參考。一個世界空間座標系如何建立可以任意選擇。例如:你可以決定世界空間的原點是你房間的中心。然戶,房間裏的物體就可以相對房間的中心和某個比例和某個方向放置了。
建模變換:
    在物體空間中指定的物體被放置到世界空間的方法要依靠建模變換。例如:你也許需要旋轉、平移和縮放一個椅子的三維模型,以使椅子可以正確地放置在你的房間的世界座標系統裏。在同一個房間中的兩把椅子可以使用同樣的三維椅子模型,但使用不同的建模變換,以使每把椅子放在房間中不同的位置。
眼空間:
    最後,你要從一個特殊的視點(“眼睛”)觀看你的場景。在稱爲眼空間(或視覺空間)的座標系統裏,眼睛位於座標系統的原點。朝“上”的方向通常是軸正方向。遵循標準慣例,你可以確定場景的方向使眼睛是從z軸向下看。
視變換:
    從世界空間位置到眼空間位置的變換時視變換。典型的視變換結合了一個平移把眼睛在世界空間的位置移到眼空間的原點,然後適當地旋轉眼睛。通過這樣做,視變換定義了視點的位置和方向。
    我們通常把分別代表建模和視變換的兩個矩陣結合在一起,組成一個單獨的被稱爲modelview的矩陣。你可以通過簡單地用建模矩陣乘以視矩陣把它們結合在一起。
剪裁空間:
    當位置在眼空間以後,下一步是決定什麼位置是在你最終要渲染的圖像中可見的。在眼空間之後的座標系統被稱爲剪裁空間,在這個空間中的座標系統稱爲剪裁座標。
投影變換:
    從眼空間座標到剪裁空間的變換被稱爲投影變換。投影變換定義了一個事先平截體(view frustum),代表了眼空間中物體的可見區域。只有在視線平截體中的多邊形、線段和點背光柵化到一幅圖形中時,才潛在的有可能被看得見。
標準化的設備座標:
    剪裁座標是齊次形式<x,y,z,w>的,但我們需要計算一個二維位置(一對x和y)和一個深度值(深度值是爲了進行深度緩衝,一種硬件加速的渲染可見表面的方法)。
透視除法:
    用w除x,y和z能完成這項工作。生成的結果座標被稱爲標準化的設備座標。現在所有的幾何數據都標準化爲[-1,1]之間。
窗口座標:
    最後一步是取每個頂點的標準化的設備座標,然後把它們轉換爲使用像素度量x和x的最後的座標系統。這一步驟命名爲視圖變換,它爲圖形處理器的光柵器提供數據。然後光柵器從頂點組成點、線段或多邊形,並生成決定最後圖像的片段。另一個被稱爲深度範圍變換的變換,縮放頂點的z值到在深度緩衝中使用的深度緩存的範圍內。



二.圖元裝配(Primitive Assembly)和光柵化(Rasterization)
    經過變換的頂點流按照順序被送到下一個被稱爲圖元裝配和光柵化的階段。首先,在圖元裝配階段根據伴隨頂點序列的幾何圖元分類信息把頂點裝配成幾何圖元。這將產生一序列的三角形、線段和點。這些圖元需要經過裁剪到可視平截體(三維空間中一個可見的區域)和任何有效地應用程序指定的裁剪平面。光柵器還可以根據多邊形的朝前或朝後來丟棄一些多邊形。這個過程被稱爲挑選(culling)。
    經過裁剪和挑選剩下的多邊形必須被光柵化。光柵化是一個決定哪些像素被幾何圖元覆蓋的過程。多邊形、線段和點根據爲每種圖元指定的規則分別被光柵化。光柵化的結果是像素位置的集合和片段的集合。當光柵化後,一個圖元擁有的頂點數目和產生的片段之間沒有任何關係。例如,一個由三個頂點組成的三角形佔據整個屏幕,因此需要生成上百萬的片段。
    片段和像素之間的區別變得非常重要。術語像素(Pixel)是圖像元素的簡稱。一個像素代表幀緩存中某個指定位置的內容,例如顏色,深度和其它與這個位置相關聯的值。一個片段(Fragment)是更新一個特定像素潛在需要的一個狀態。
    之所以術語片段是因爲光柵化會把每個幾何圖元(例如三角形)所覆蓋的像素分解成像素大小的片段。一個片段有一個與之相關聯的像素位置、深度值和經過插值的參數,例如顏色,第二(反射)顏色和一個或多個紋理座標集。這些各種各樣的經過插值的參數是來自變換過的頂點,這些頂點組成了某個用來生成片段的幾何圖元。你可以把片段看成是潛在的像素。如果一個片段通過了各種各樣的光柵化測試,這個片段將被用於更新幀緩存中的像素。


三.插值、貼圖和着色
    當一個圖元被光柵化爲一堆零個或多個片段的時候,插值、貼圖和着色階段就在片段屬性需要的時候插值,執行一系列的貼圖和數學操作,然後爲每個片段確定一個最終的顏色。除了確定片段的最終顏色,這個階段還確定一個新的深度,或者甚至丟棄這個片段以避免更新幀緩存對應的像素。允許這個階段可能丟棄片段,這個階段爲它接收到的每個輸入片段產生一個或不產生着過色的片段。


四.光柵操作(Raster Operations)
    光柵操作階段在最後更新幀緩存之前,執行最後一系列的針對每個片段的操作。這些操作是OpenGL和Direct3D的一個標準組成部分。在這個階段,隱藏面通過一個被稱爲深度測試的過程而消除。其它一些效果,例如混合和基於模板的陰影也發生在這個階段。
    光柵操作階段根據許多測試來檢查每個片段,這些測試包括剪切、alpha、模板和深度等測試。這些測試涉及了片段最後的顏色或深度,像素的位置和一些像素值(像素的深度值和模板值)。如果任何一項測試失敗了,片段就會在這個階段被丟棄,而更新像素的顏色值(雖然一個模板寫入的操作也許會發生)。通過了深度測試就可以用片段的深度值代替像素深度值了。在這些測試之後,一個混合操作將把片段的最後顏色和對應像素的顏色結合在一起。最後,一個幀緩存寫操作用混合的顏色代替像素的顏色。
    圖5顯示了光柵操作階段本身實際上也是一個流水線。實際上,所有之前介紹的階段都可以被進一步分解成子過程。

圖5:標準OpenGL和Direct3D光柵操作


五.形象化圖形流水線
   圖6描寫了圖形流水線的各個階段。在本圖中,兩個三角形被光柵化了。整個過程從頂點的變換和着色開始。下一步,圖元裝配解讀那從頂點創建三角形,如虛線所示。之後,光柵用片段填充三角形。最後,從頂點得到的值被用來插值,然後用於貼圖和着色。注意僅僅從幾個頂點就產生了許多片段。

圖6:形象化圖形流水線


可編程圖形流水線
    當今圖形硬件設計上最明顯的趨勢是在圖形處理器內提供更多的可編程性。圖7顯示了一個可編程圖形處理器的流水線中的頂點處理器和片元(像素)處理器。
    圖7比圖2展示了更多的細節,更重要的是它顯示了頂點和片段處理被分離成可編程單元。可編程頂點處理器和片段處理器是圖形硬件中執行Vertex Shader和Pixel Shader的硬件單元。

圖7:可編程圖形流水線
參考資料:
    1.《Cg教程》(The Cg Tutorial)
    2.《OpenGL編程指南》
    3. 網絡
 
 

發佈了17 篇原創文章 · 獲贊 4 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章