OpenGL/3D圖形渲染管線
阿新 • • 發佈:2019-01-05
http://blog.csdn.net/shenzi/article/details/5417488
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. 網路