3D渲染管線也稱為渲染流水線,通俗的講可以理解為一個流程,就是我們準備一些數據,讓GPU按照我們的要求,對這些數據進行處理,最後得到一張二維圖像。渲染流程主要包括以下幾個大的階段:數據準備階段、頂點處理階段、光柵化操作階段、像素着色階段。
一、數據準備階段
這個階段主要是根據用户提供的頂點及索引信息,構建多邊形,主要有點、線段和三角形 。數據填充允許我們提交我們想要的數據,這些數據包括了頂點數據(位置、法線、顏色、紋理)和一些常量(世界矩陣、觀察矩陣、投影矩陣、紋理因子等)
二、頂點處理階段(頂點着色階段)
這是一個可編程階段,可以完全由程序員自己來實現,這個階段的核心是為模型做各種空間變化。
3D中主要以下幾種空間:
(1)模型空間:模型空間也叫本地空間或建模空間,這是我們定義物體時物體自身的座標系,當一個美工人員創建一個物體的三維模型的時候,他選擇了一個方便的方向,比例和位置來保存模型的組成頂點,物體的模型空間和其他模型沒用任何關係
(2)世界空間:物體的模型空間和其他物體的模型空間是沒用任何關係的,而世界空間的主要目的就是給你的場景中的物體提供一個絕對的參考。
(3)視角空間:這個座標是以攝像機為基準的,以攝像機的位置為原點,攝像機的朝向為Z軸正方向,右邊為X軸正方向,上邊為Y軸正方向,之所以設置這個座標系,主要是為了方便投影以及裁剪操作。
(4)投影裁剪空間:這個空間就是世界空間的物體被投影到相應的投影面上之後,繼而進行的裁剪操作所在的空間。
上面説到,3D渲染管線的第二步是頂點着色階段,主要內容為對模型做各種空間變化,空間變化包括一些幾個方面:
1.模型空間變化為世界空間:在物體空間中指定的物體被放置到世界空間的方法要依靠建模變換。如:你將一張桌子放置的一個房間裏面,你需要旋轉,平移,縮放等操作,才能使桌子按照你的要求放置的房間的準確位置,在同一間房間裏面我們可以放置同樣的桌子模型,使用不同的建模變換,可以使桌子在房間的不同位置,不同的方向放置。
2.世界空間變化為視角空間:從世界空間到視角空間通過相應的視角矩陣來實現,所謂視角空間,我們可以這裏理解,就是以攝像機為原點,由視線方向,視角和遠近平面共同組成的一個梯形體。也被稱之為視錐體,其由近平面和遠平面組成。近平面,是梯形體較小的矩形面,同時也是靠近攝像機的平面。遠平面,就是梯形體較大的矩形,作為投影平面,在這個梯形體的內部的數據是可見的,超出部分會被剔除,也叫視錐裁剪。在遊戲中,屏幕的內容隨攝像機的移動而變化,是因為GPU將物體的頂點座標從世界空間轉換為視角空間。
3.視角空間變換為投影裁剪空間:
從視角空間到投影,裁剪空間依靠投影矩陣來實現,投影有兩種:正交投影和透視投影,在大多數遊戲中用到的都是透視投影,因為這種投影方式與人觀察物體的方式是一致的。這個過程其實就是一個投影,裁剪,映射的過程,因為在一個不規則的視錐體內裁剪是一件非常困難的事情,所以將裁剪安排在一個單位立方體中進行,這個立方體被成為規範立方體。關於投影變換,要注意的 一點是,很多人誤以為投影即是把三維頂點投影到二維平面上,投影變換後頂點的Z座標被拋棄,只剩下X,Y座標用於後面屏幕 變換,實際上,投影變換後Z座標並沒有消失,位於[0,1]之間,屏幕座標的變換不再使用Z座標,但Z座標在後面的輸出管理階段用於深度比較時會發揮重要作用。這個過程是由三個步驟組成:
3.1,用透視變換矩陣把頂點從視錐體變換到規範化立方體中
3.2,在規範化立方體內進行裁剪
3.3,將經過前面兩步得到的座標映射到屏幕座標系上(屏幕映射)
4.投影裁剪空間變換為屏幕空間:最後一步是取每個頂點的標準化的設備座標,然後把它們轉換為使用像素度量X和Y的最後的座標系統,它為圖形處理器的光柵器提供數據。然後光柵器從頂點組成點,線段或多邊形,並生成最後圖像的片段。另一個被稱為深度範圍變換的變換,縮放頂點的Z值到在深度緩衝中使用的深度緩存的範圍內。
<頂點着色階段到此結束>
備註:幾何着色階段。Direcet11加入的新特性,為可選階段。在這個階段中,輸入為一個完整的多邊形,點、線段或三角形。這個階段直接對輸入的多邊形進行操作,可以把其消滅,不再往下一個階段傳輸;也可以衍生出新的多邊形出來。總之,該階段操作的對象是完整的多邊形,相比於頂點着色階段,其操作的對象是單個的頂點。幾何着色階段由兩部分組成:圖元裝配,三角形處理。到目前為止我們得到了一堆的頂點數據,這一步九是根據這些頂點數據連接關係還原出網絡結構,網絡由頂點和索引組成,這個階段九是根據索引將頂點連接到一起,組成線,面單元,然後進行裁剪,如果一個三角形超出屏幕以外,例如兩個頂點在屏幕內,一個頂點在屏幕外,這時我們在屏幕上看到的就是一個四邊形,然後把這個四邊形切成兩個小的三角形。
三、光柵操作階段
這個階段屬於不可編程階段,完全由硬件實現,主要包括以下幾個方面:
1.視口變換 即把投影變換後的頂點X,Y座標,根據用户設定的視口參數,變換到屏幕上對應的座標。
2.隱藏面消除 即使經過了裁剪操作,對於每個物體,攝像機只能看到正對着攝像機的一面,對背對着攝像機的一面是看不到的。這一步的任務就是把看不到的這一面消除掉,以免繼續處理,影響計算機的性能和效率。為了確定一個多邊形
是正對着還是背對着攝像機,就要用到我們在輸入集合階段指定多邊形時的頂點順序了,默認情況下,D3D規定按順時針指定的三角形屬於正面,逆時針為背面。確定順時針還是逆時針,可以用如下方法:給出兩個向量:E0=V1-V0 E1=V2-V0 對E0和E1進行叉乘操作N=E0XE1 如果N指向攝像機,則為正面 ,否則為背面。
3.頂點屬性的插值計算 在輸入集合階段,用户指定的僅僅是一系列的多邊形,以三角形為例,每個三角形由三個頂點組成,每個頂點包含一系列的屬性,如座標,法線,紋理座標等等,在經過頂點着色階段,視口變換後,這個頂點在屏幕上都有對應的座標。但為了顯示該三角形,僅僅三個頂點顯然是不夠的,為了計算該三角形所覆蓋的屏幕上每個像素的屬性,要進行正確的插值計算。
四、像素着色階段
像素處理階段是一個最耗時,但也是最能夠使你的渲染效果品質更高的地方,像素最終的樣子會在此決定,你可以進行紋理映射,紋理混合,模糊,擴散等效果。這個階段也是完全可編程的一個階段,也是跟頂點着色階段一樣十分重要的階段。
因為在D3D11中,頂點着色階段和像素着色階段是程序員實現的兩個最基本的階段,像素着色器,從名字也可以看出,是在像素級別上進行的計算。對於三維空間中投影到屏幕上的每一個多邊形,針對其在屏幕上所覆蓋每一個像素,逐個進行像素着色計算。這一階段接受的數據是經過插值計算後的頂點屬性。輸出的是顏色值,以提供給下一階段處理。像素着色器給程序員提供了相當多的靈活性和自由度,通過各種不同的算法來計算片段顏色以實現各種特效。
備註:像素的一些額外處理與輸出 當像素經過像素着色階段處理後,並不能都有機會輸出到屏幕上,因為它們還要經過深度測試和模板測試,Alpha測試,經過這些測試後,還要經過Alpha混合,這是於目標緩衝區的混合,就能夠實現變透明效果。
虛擬世界中的五光十色就是因為這個變透明效果而更加生動。