1. 程式人生 > >Unity&Shader高階篇-渲染路徑(Rendering Paths)

Unity&Shader高階篇-渲染路徑(Rendering Paths)

一、前言

在Unity的Camera中常常會看到一個Rendering Paths的選項,裡面有5個選項,其中兩個比較重要的選項分別是“Deferred Shading”和“Forward Rendering”,在我還是初學Unity的時候,並沒有在意太多。如今隨著學習Shader的深入慢慢領會到了這兩個渲染路徑的重要性。下面就這兩個渲染路徑的區別和優缺點做一個學習記錄。主要參考文獻

在介紹這兩個渲染路徑的開始不得不先介紹一下現在的圖形渲染管線,如圖所示為一個現代GPU的渲染過程。因為,硬體的限制,我們不能改變如何繪製單個的畫素,只能通過給硬體輸送不同的紋理來進行改變。自從有了可程式設計影象管線,我們現在可以通過程式碼來修改頂點,或扭曲或移動來改變畫素的外觀,至此從本質上改變圖形硬體如何渲染目標物體。


首先要介紹的就是常用的延遲著色渲染(Deferred Shading)

二、延遲著色渲染(Deferred Shading)

1、介紹 在計算機3D圖形學中,延遲渲染技術是一種在螢幕座標空間渲染的技術。所謂延遲渲染,即在頂點和片段著色器中的第一個通道中沒有真正的渲染被執行,而是延遲到第二個通道中被渲染。 在第一個通道中,僅僅是收集渲染所需的計算資料。每個表面的位置、法線和材質資訊被渲染到幾何緩衝區(G-Buffer)中,這種渲染技術被重圍渲染到紋理技術。之後,片段著色器使用貼圖緩衝資訊在螢幕座標空間為每一個畫素計算直接或間接的光照。螢幕座標空間方向的遮擋能作為延遲渲染管道的一部分,給物體的陰影和相互之間的光照反射提供方向性。如圖所示為延遲著色的渲染過程

1.1、漫反射顏色幾何緩衝區


1.2、深度緩衝區(Z-buffering)


1.3、表面法線幾何緩衝區

1.4、最後的合成效果(圖中還含有陰影,

因此計算陰影對映和陰影

卷必須和延遲渲染一起使用)

2、優點 延遲著色的主要優點是場景幾何面的渲染和光照渲染的解耦只需要一個幾何通道,並且每個光源只計算它實際影響的那些畫素。這為GPU在場景中有多個光源的渲染減少了效能上的開銷。還有一些附加在這個上面的優點,如,對複雜的光源管理更為方便、其他的著色器資源也易於管理以及簡化軟體渲染流水線。 3、缺點 延遲渲染的關鍵缺點就是它不能處理演算法內的透明度雖然這個問題在Z緩衝(深度緩衝)場景中是一個常見的問題,通常的處理方法都是採用將場景中的透明部分進行排序和延遲。深度剝離在延遲渲染中可以被用來實現順序無關的透明度,但是付出的代價就是增加幾何緩衝區(G-Buffer)和附加批次的大小。

支援DirectX 10以及更高版本的現代GPU顯示硬體通常能夠足夠快的執行批次處理,以保持互動式幀率的穩定。當需要產生順序無關的透明度時(通常在一些遊戲中),延遲渲染並不會比正向渲染使用相同的技術有效。

(注:延遲渲染在正交攝像機模式下也是不支援的,如果攝像機切換到了正交模式之後就會預設使用正向渲染)

       延遲著色中的實時渲染開銷與由光照射的畫素的數量成比例,並且不依賴於場景複雜度。因此,小小的點光源和聚光源都是開銷非常小的渲染,特別是不會穿過攝像機的近平面的點光源和聚光源,渲染開銷就更小。另外,帶陰影的光源比不帶陰影的光源開銷要更高。因為在延遲渲染中,陰影投射到的物體上需要為每個陰影投射光渲染一次或多次。

另外一個比較嚴重的缺點是使用多材質比較困難。要使用多材質不是不可能,需要在幾何緩衝區儲存更多的資料,這就需要更大的記憶體寬頻。

       一個更致命的缺點是,由於光照和幾何渲染的分離,導致抗鋸齒變得不穩定,主要是因為這種分離會導致內插子樣本會產生不穩定的位置、法線和切線屬性。克服這種限制的常用方法是在最終的影象上使用邊緣檢測,然後在邊緣上使用模糊處理。而且,如今有更高階的邊緣平滑處理技術,如MLAA(Efficiently MovingAntialiasing from the GPU to the CPU,https://software.intel.com/sites/default/files/m/d/4/1/d/8/MLAA.pdf),時間反混疊法(Temporal anti-aliasing https://en.wikipedia.org/wiki/Temporal_anti-aliasing用在虛幻引擎中),儘管它不是一個完全的邊緣平滑處理技術,但是能使得給定的邊緣一個平滑的表面。

4、延遲光照(內容有爭議)

       延遲光照是延遲渲染的修訂。這個技術在延遲渲染的時候使用了3個通道,而不是2個。第一個通道覆蓋了場景幾何體,僅僅將計算每個畫素照明所必需的屬性寫入幾何緩衝區。在螢幕空間,“延遲”通道然後輸出僅僅漫反射和高光反射光資料資訊,因此,必須在場景上進行第二遍,以回讀光照資訊和最終輸出的逐畫素渲染。延遲光照最明顯的優點是動態的減少了幾何緩衝區的大小。最明顯的成本就是需要渲染場景幾何體兩次而不是一次。另外一個額外的消耗是在延遲光照的延遲通道必須單獨輸出漫反射和鏡面反射,然而延遲渲染的延遲通道僅僅需要輸出一個兩者組合的輻射值。

       由於幾何緩衝區的大小的減少技術,部分克服了延遲著色的一個嚴重缺點—多個材質。

5、Unity中的延遲渲染

       當使用延遲渲染,影響一個遊戲物體的光照的光源數量沒有限制。所有光源都是逐畫素評估,這就意味著它們都與法線貼圖進行正確的互動。另外,所有光源都有Cookies和陰影。

       它要求顯示卡具有MRT(多渲染目標),渲染模型3.0或者更高,並且支援深度渲染紋理。在2006年之後的PC顯示卡都支援延遲渲染技術,如GeForce 8xxx、Radeon x2400和Intel G45。在手機端,延遲渲染是不支援的。

(注:延遲渲染在正交攝像機模式下也是不支援的,如果攝像機切換到了正交模式之後就會預設使用正向渲染)

       延遲著色中的實時渲染開銷與由光照射的畫素的數量成比例,並且不依賴於場景複雜度。因此,小小的點光源和聚光源都是開銷非常小的渲染,特別是不會穿過攝像機的近平面的點光源和聚光源,渲染開銷就更小。另外,帶陰影的光源比不帶陰影的光源開銷要更高。因為在延遲渲染中,陰影投射到的物體上需要為每個陰影投射光渲染一次或多次。

三、延遲著色渲染(Forward Rendering)

1、介紹

   正向渲染是標準的多數引擎使用的白箱渲染技術,給圖形渲染硬體提供幾何圖形資料,最後轉換並分割為片段或畫素,在傳遞到螢幕之前進行最終渲染。它是線性的,幾何圖形一個一個的傳遞到管線中以產生最終影象。

       正向渲染對一個物件會在多個通道上進行渲染,並且渲染取決於影響物體的光源。光源本身也會根據其設定和強度在進行正向渲染的時候進行不同的處理。

2、Unity中使用它

       在正向渲染中,影響每個物件的一些數量的最亮的光源以完全每個畫素光照模式渲染。然而,每個頂點最多計算4個點光源。其他光源被計算成球面諧波(Spherical Harmonics),這是更快,但只是一個近似。一個光源是否進行逐畫素光照主要依靠以下幾點:

●當光源的渲染模式被渲染成Not Important,則光源是進行逐頂點計算或者SH

●最亮的直光源是總是逐畫素

●光源渲染模式設定為Important總是逐畫素光照

●如果在Quality Setting裡面設定的光源數量在上述設定中超過了,那麼超過的光源按照亮度的順序逐畫素的渲染。

比如,如果一個物體的渲染被如圖2.1所示的A—H的光源影響。假設A到H的光源都有同樣的顏色和強度並且渲染模式都是Auto,那麼這些光源將按照距離遠近的順序進行排序最後渲染。最近的光源,也即是最亮的光源將被作為逐頂點渲染

如圖2.2所示為各個光源的渲染模式。

(注意:光源的重疊)

2.1:影響遊戲物件的周圍光源


2.2:影響遊戲物件的周圍光源的渲染

3、效能

●正向渲染是計算物體的頂點而不是畫素,這就意味著它們不支援光源Cookies和法線貼圖對映。

●球諧波是非常低頻的方法。你不能用球諧波渲染進行快速的轉換。它們也僅僅影響漫反射光源以及非常低頻的高光反射。

●球諧波不是區域性的;點或者聚光源靠近一些表面的時候會產生混亂和模糊。

總得來說,球諧波是非常適合一些動態的物體。

四、Unity中其他的渲染路徑

1、傳統延遲光照渲染(Legacy Deferred LightingRendering Path)

       這是隨著Unity5.0遺留下來的延遲光照特性,新的工程都應該考慮使用前面講的延遲渲染。

2、頂點光照渲染(Vertex Lit Rendering Path Detail)

       頂點光照渲染通常渲染每一個物體都在一個通道上,計算在物體每個頂點上的所有光源的光。這是最快的渲染方式,並且有著最為廣泛的硬體支援。(當然不能工作在控制檯上)。因為,所有的光照計算都發生在頂點著色器上,因此這個渲染方式不能計算許多逐畫素的效果,比如,陰影、法線對映以及光源Cookies