對3D渲染管線(渲染流水線)的理解

對3D渲染管線(渲染流水線)的理解

http://www.cnblogs.com/He-Jing/p/3760106.html、

渲染管線的概念:

3D渲染管線也稱為渲染流水線,可以將其理解為一個流程,就是我們準備一些資料,讓GPU對這些資料做一些處理,最後得出一張二維影象,渲染流程主要分為幾個大的階段:資料準備階段,頂點處理階段,光柵操作階段,畫素著色階段。

一、資料準備階段

該階段主要是根據使用者提供的頂點及索引資訊,構建多邊形,主要有點,線段,三角形。資料填充允許我們提交我們想要的資料,這些資料包括頂點資料(位置,法線,顏色,紋理座標)和常量(世界矩陣,觀察矩陣,投影矩陣,紋理因子等);

二、頂點處理階段(頂點著色階段)

這是一個可程式設計階段,可以完全由程式設計師自己來實現,這個階段的核心是為模型的各種空間變化:

《One》3D中有以下幾種空間:

1,模型空間

模型空間也叫本地空間或者建模空間,這是我們定義物體三角形的座標系,當一個美工人員建立一個物體的三維模型的時候,他選擇了一個方便的方向、比例和位置來儲存模型的組成頂點,物體的模型、空間和其他模型沒用任何關係;

2,世界空間

世界空間的目的就是給你的場景中的物體提供一個絕對的參考。

3,視覺空間

以攝像機為基準,以攝像機的位置為原點,攝像機朝向Z軸正方向,右邊X軸為正方向,上邊為Y軸正方向,之所以設定這個座標系,主要是為了方便投影及裁剪操作。

4,攝影,裁剪空間

該空間即世界空間的物體被投影到相應的投影上面之後,繼而進行的裁剪操作所在的空間。

《Second》幾種空間之間的變換

1,模型空間——–> 世界空間

建模變換: 在物體空間中指定的物體被放置到世界空間的方法要依靠建模變換。如:你將一張桌子放置的一個房間裡面,你需要旋轉,平移,縮放等操作,才能使桌子按照你的要求放置的房間的準確位置,在同一間房間裡面我們可以放置同樣的桌子模型,使用不同的建模變換,可以使桌子在房間的不同位置,不同的方向放置。

2,世界空間——>視角空間

     視變換:從世界空間到視角空間通過相應的視角矩陣來實現,所謂視角空間,我們可以這裡理解,就是以攝像機為原點,由視線方向,視角和遠近平面共同組成的一個梯形體。也被稱之為視錐體,其由近平面和遠平面組成。近平面,是梯形體較小的矩形面,同時  也是靠近攝像機的平面。遠平面,就是梯形體較大的矩形,作為投影平面,在這個梯形體的內部的資料是可見的,超出部分會被剔除,也叫視錐裁剪。在遊戲中,螢幕的內容隨攝像機的移動而變化,是因為GPU將物體的頂點座標從世界空間轉換為視角空間。

3,視角空間——>投影,裁剪空間

  投影變換:從視角空間到投影,裁剪空間依靠投影矩陣來實現,投影有兩種:正交投影和透視投影,在大多數遊戲中用到的都是透視投影,因為這種投影方式與人觀察物體的方式是一致的這個過程其實就是一個投影,裁剪,對映 的過程,因為在一個不規則的視  錐體內裁剪是一件非常困難的事情,所以將裁剪安排在一個單位立方體中進行,這個立方體被成為規範立方體。關於投影變換,要注意的 一點是,很多人誤以為投影即是把三維頂點投影到二維平面上,投影變換後頂點的Z座標被拋棄,只剩下X,Y座標用於後面螢幕  變換,實際上,投影變換後Z座標並沒有消失,位於[0,1]之間,螢幕座標的變換不再使用Z座標,但Z座標在後面的輸出管理階段用於深度比較時會發揮重要作用。這個過程是由三個步驟組成:

    3.1,用透視變換矩陣把頂點從視錐體變換到規範化立方體中

    3.2,在規範化立方體內進行裁剪

    3.3,將經過前面兩步得到的座標對映到螢幕座標系上(螢幕對映)

4,投影,裁剪空間——>螢幕空間

  檢視變換:最後一步是取每個頂點的標準化的裝置座標,然後把它們轉換為使用畫素度量X和Y的最後的座標系統,它為圖形處理器的光柵器提供資料。然後光柵器從頂點組成點,線段或多邊形,並生成最後影象的片段。另一個被稱為深度範圍變換的變換,縮放頂點的Z值到在深度緩衝中使用的深度快取的範圍內。<頂點著色階段到此結束>

備註:幾何著色階段,這個是D3D11中加入的新特性,為可選階段。在這個階段中,輸入為一個完整的多邊形,點、線段或三角形。這個階段直接對輸入的多邊形進行操作,可以把其消滅,不再往下一個階段傳輸;也可以衍生出新的多邊形出來。總之,該階段操作的物件是完整的多邊形,相比於頂點著色階段,其操作的物件是單個的頂點。幾何著色階段由兩部分組成:圖元裝配,三角形處理。到目前為止我們得到了一堆的頂點資料,這一步就是是根據這些頂點資料連線關係還原出網路結構,網路由頂點和索引組成,這個階段就是根據索引將頂點連線到一起,組成線,面單元,然後進行裁剪,如果一個三角形超出螢幕以外,例如兩個頂點在螢幕內,一個頂點在螢幕外,這時我們在螢幕上看到的就是一個四邊形,然後把這個四邊形切成兩個小的三角形。

三:光柵操作階段

  這個階段屬於不可程式設計階段,即完全由硬體實現,主要包括以下幾個方面:

  1,視口變換 即把投影變換後的頂點X,Y座標,根據使用者設定的視口引數,變換到螢幕上對應的座標。

  2,隱藏面消除 即使經過了裁剪操作,對於每個物體,攝像機只能看到正對著攝像機的一面,對背對著攝像機的一面是看不到的。這一步的任務就是把看不到的這一面消除掉,以免繼續處理,影響計算機的效能和效率。為了確定一個多邊形

  是正對著還是背對著攝像機,就要用到我們在輸入集合階段指定多邊形時的頂點順序了,預設情況下,D3D規定按順時針指定的三角形屬於正面,逆時針為背面。確定順時針還是逆時針,可以用如下方法:

  給出兩個向量:E0=V1-V0 E1=V2-V0 對E0和E1進行叉乘操作N=E0XE1  如果N指向攝像機,則為正面 ,否則為背面。

  3,頂點屬性的插值計算 在輸入集合階段,使用者指定的僅僅是一系列的多邊形,以三角形為例,每個三角形由三個頂點組成,每個頂點包含一系列的屬性,如座標,法線,紋理座標等等,在經過頂點著色階段,視口變換後,這個頂點在螢幕上

  都有對應的座標。但為了顯示該三角形,僅僅三個頂點顯然是不夠的,為了計算該三角形所覆蓋的螢幕上每個畫素的屬性,要進行正確的插值計算。

四:畫素著色階段

  畫素處理階段是一個最耗時,但也是最能夠使你的渲染效果品質更高的地方,畫素最終的樣子會在此決定,你可以進行紋理對映,紋理混合,模糊,擴散等效果。這個階段也是完全可程式設計的一個階段,也是跟頂點著色階段一樣十分重要的階段。

  因為在D3D11中,頂點著色階段和畫素著色階段是程式設計師實現的兩個最基本的階段,畫素著色器,叢名字也可以看出,是在畫素級別上進行的計算。對於三維空間中投影到螢幕上的每一個多邊形,針對其在螢幕上所覆蓋每一個畫素,逐個進行

  畫素著色計算。這一階段接受的資料是經過插值計算後的頂點屬性。輸出的是顏色值,以提供給下一階段處理。畫素著色器給程式設計師提供了相當多的靈活性和自由度,通過各種不同的演算法來計算片段顏色以實現各種特效。

  備註:畫素的一些額外處理與輸出 當畫素經過畫素著色階段處理後,並不能都有機會輸出到螢幕上,因為它們還要經過深度測試和模板測試,Alpha測試,經過這些測試後,還要經過Alpha混合,這是於目標緩衝區的混合,就能夠實現變透明效果。

  虛擬世界中的五光十色就是因為這個變透明效果而更加生動。