Flash3D學習計划(一)——3D渲染的一般管線流程


一:什么是渲染管線

渲染管線也稱為渲染流水線,是顯示芯片內部處理圖形信號相互獨立的並行處理單元。一個流水線是一序列可以並行和按照固定順序進行的階段。每個階段都從它的前一階段接收輸入,然后把輸出發給隨后的階段。就像一個在同一時間內,不同階段不同的汽車一起制造的裝配線,傳統的圖形硬件流水線以流水的方式處理大量的頂點、幾何圖元和片段。下圖顯示了當今圖形處理器所使用的圖形硬件流水線。

image 
三維應用程序傳給圖形處理器一序列的頂點組成不同的幾何圖元:典型的多邊形、線段和點。如下圖所示,有許多種方法來制定幾何圖元。

image

二:圖示化理解渲染過程

要可視化一個3D場景到屏幕,場景要轉換成2D圖形。這個處理過程叫渲染。如下圖

image

上述流程的一個實例描述。整個過程從頂點的變換和着色開始。下一步,圖元裝配解讀那從頂點創建三角形,如虛線所示。之后,光柵用片段填充三角形。最后,從頂點得到的值用來插值,然后用於貼圖和着色。注意僅僅從幾個頂點就產生了許多片段。

image

1. 頂點變換,頂點處理

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

image

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

世界空間:一個物體的物體空間和其它對象沒有空間上的關系。世界空間的目的是為在你的場景中的所有物體提供一個絕對的參考。一個世界空間坐標系如何建立可以任意選擇。例如:你可以決定世界空間的原點是你房間的中心。然戶,房間里的物體就可以相對房間的中心和某個比例和某個方向放置了。

建模變換:在物體空間中指定的物體被放置到世界空間的方法要依靠建模變換。例如:你也許需要旋轉、平移和縮放一個椅子的三維模型,以使椅子可以正確地放置在你的房間的世界坐標系統里。在同一個房間中的兩把椅子可以使用同樣的三維椅子模型,但使用不同的建模變換,以使每把椅子放在房間中不同的位置。

眼空間:最后,你要從一個特殊的視點(“眼睛”)觀看你的場景。在稱為眼空間(或視覺空間)的坐標系統里,眼睛位於坐標系統的原點。朝“上”的方向通常是軸正方向。遵循標准慣例,你可以確定場景的方向使眼睛是從z軸向下看。

視變換:從世界空間位置到眼空間位置的變換時視變換。典型的視變換結合了一個平移把眼睛在世界空間的位置移到眼空間的原點,然后適當地旋轉眼睛。通過這樣做,視變換定義了視點的位置和方向。我們通常把分別代表建模和視變換的兩個矩陣結合在一起,組成一個單獨的被稱為modelview的矩陣。你可以通過簡單地用建模矩陣乘以視矩陣把它們結合在一起。

剪裁空間:當位置在眼空間以后,下一步是決定什么位置是在你最終要渲染的圖像中可見的。在眼空間之后的坐標系統被稱為剪裁空間,在這個空間中的坐標系統稱為剪裁坐標。

投影變換:從眼空間坐標到剪裁空間的變換被稱為投影變換。投影變換定義了一個事先平截體(view frustum),代表了眼空間中物體的可見區域。只有在視線平截體中的多邊形、線段和點被光柵化到一幅圖形中時,才潛在的有可能被看得見。

標准化的設備坐標:剪裁坐標是齊次形式<x,y,z,w>的,但我們需要計算一個二維位置(一對x和y)和一個深度值(深度值是為了進行深度緩沖,一種硬件加速的渲染可見表面的方法)。

透視除法:用w除x,y和z能完成這項工作。生成的結果坐標被稱為標准化的設備坐標。現在所有的幾何數據都標准化為[-1,1]之間。

窗口坐標:最后一步是取每個頂點的標准化的設備坐標,然后把它們轉換為使用像素度量x和x的最后的坐標系統。這一步驟命名為視圖變換,它為圖形處理器的光柵器提供數據。然后光柵器從頂點組成點、線段或多邊形,並生成決定最后圖像的片段。另一個被稱為深度范圍變換的變換,縮放頂點的z值到在深度緩沖中使用的深度緩存的范圍內。

2. 圖元裝配(Primitive Assembly)和光柵化(Rasterization)

經過變換的頂點流按照順序被送到下一個被稱為圖元裝配和光柵化的階段。首先,在圖元裝配階段根據伴隨頂點序列的幾何圖元分類信息把頂點裝配成幾何圖元。這將產生一序列的三角形、線段和點。這些圖元需要經過裁剪到可視平截體(三維空間中一個可見的區域)和任何有效地應用程序指定的裁剪平面。光柵器還可以根據多邊形的朝前或朝后來丟棄一些多邊形。這個過程被稱為挑選(culling)。

經過裁剪和挑選剩下的多邊形必須被光柵化。光柵化是一個決定哪些像素被幾何圖元覆蓋的過程。多邊形、線段和點根據為每種圖元指定的規則分別被光柵化。光柵化的結果是像素位置的集合和片段的集合。當光柵化后,一個圖元擁有的頂點數目和產生的片段之間沒有任何關系。例如,一個由三個頂點組成的三角形占據整個屏幕,因此需要生成上百萬的片段。片段和像素之間的區別變得非常重要。術語像素(Pixel)是圖像元素的簡稱。一個像素代表幀緩存中某個指定位置的內容,例如顏色,深度和其它與這個位置相關聯的值。一個片段(Fragment)是更新一個特定像素潛在需要的一個狀態。

之所以術語片段是因為光柵化會把每個幾何圖元(例如三角形)所覆蓋的像素分解成像素大小的片段。一個片段有一個與之相關聯的像素位置、深度值和經過插值的參數,例如顏色,第二(反射)顏色和一個或多個紋理坐標集。這些各種各樣的經過插值的參數是來自變換過的頂點,這些頂點組成了某個用來生成片段的幾何圖元。你可以把片段看成是潛在的像素。如果一個片段通過了各種各樣的光柵化測試(在光柵操作將做討論),這個片段將被用於更新幀緩存中的像素。

下圖顯示了一個三角形的光柵化處理

image

3. 插值、貼圖和着色

(這個階段的處理單元是圖元,即按圖元進行處理)當一個圖元被光柵化為一個或多個片段后,插值、貼圖和着色階段就根據片段屬性進行插值,執行一系列的貼圖和數學操作,為每個片段確定一個最終的顏色。除了確定片段的最終顏色,這個階段還確定一個新的深度,或者甚至丟棄這個片段以避免更新幀緩存對應的像素。允許這個階段可能丟棄片段,這個階段為它接收到的每個輸入片段產生一個或不產生着過色的片段。

4. 光柵操作(Raster Operations)

光柵操作階段在最后更新幀緩存之前,執行最后一系列的針對每個片段的操作。這些操作是OpenGL和Direct3D的一個標准組成部分。在這個階段,隱藏面通過一個被稱為深度測試的過程而消除。其它一些效果,例如混合和基於模板的陰影也發生在這個階段。光柵操作階段根據許多測試來檢查每個片段,這些測試包括剪切、alpha、模板和深度等測試。這些測試涉及了片段最后的顏色或深度,像素的位置和一些像素值(像素的深度值和模板值)。如果任何一項測試失敗了,片段就會在這個階段被丟棄,而更新像素的顏色值(雖然一個模板寫入的操作也許會發生)。通過了深度測試就可以用片段的深度值代替像素深度值了。在這些測試之后,一個混合操作將把片段的最后顏色和對應像素的顏色結合在一起。最后,一個幀緩存寫操作用混合的顏色代替像素的顏色。

光柵操作階段本身實際上也是一個流水線,下圖展示了該操作的詳細流程。實際上,所有之前介紹的階段都可以被進一步分解成子過程。

image

三. 可編程圖形流水線

image


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com