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

原文:http://www.manew.com/thread-97939-1-1.html

一、前言

在的Camera中常常會看到一個Rendering Paths的選項,裏面有5個選項,其中兩個比較重要的選項分別是“Deferred Shading”和“Forward Rendering”,在我還是初學Unity的時候,並沒有在意太多。如今隨着學習Shader的深入慢慢領會到了這兩個渲染路徑的重要性。下面就這兩個渲染路徑的區別和優缺點做一個學習記錄。主要參考文獻
維基百科:Deferred_shading
https://zh.wikipedia.org/wiki/%E5%BB%B6%E6%9C%9F%E7%9D%80%E8%89%B2
Unity官網:Deferred shading rendering path、Forward Rendering vs. Deferred Rendering
https://docs.unity3d.com/ScriptReference/index.html
在介紹這兩個渲染路徑的開始不得不先介紹一下現在的圖形渲染管線,如圖所示爲一個現代GPU的渲染過程。因爲,硬件的限制,我們不能改變如何繪製單個的像素,只能通過給硬件輸送不同的紋理來進行改變。自從有了可編程圖像管線,我們現在可以通過代碼來修改頂點,或扭曲或移動來改變像素的外觀,至此從本質上改變圖形硬件如何渲染目標物體。
這裏寫圖片描述
首先要介紹的就是常用的延遲着色渲染(Deferred Shading)

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

1、介紹
在計算機3D圖形學中,延遲渲染技術是一種在屏幕座標空間渲染的技術。所謂延遲渲染,即在頂點和片段着色器中的第一個通道中沒有真正的渲染被執行,而是延遲到第二個通道中被渲染。
在第一個通道中,僅僅是收集渲染所需的計算數據。每個表面的位置、法線和材質信息被渲染到幾何緩衝區(G-Buffer)中,這種渲染技術被重圍渲染到紋理技術。之後,片段着色器使用貼圖緩衝信息在屏幕座標空間爲每一個像素計算直接或間接的光照。屏幕座標空間方向的遮擋能作爲延遲渲染管道的一部分,給物體的陰影和相互之間的光照反射提供方向性。如圖所示爲延遲着色的渲染過程:
1.1、漫反射顏色幾何緩衝區
1.1、漫反射顏色幾何緩衝區
1.2、深度緩衝區(Z-buffering)
1.2、深度緩衝區(Z-buffering)
1.3、表面法線幾何緩衝區
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個。第一個通道覆蓋了場景幾何體,僅僅將計算每個像素照明所必需的屬性寫入幾何緩衝區。在屏幕空間,“延遲”通道然後輸出僅僅漫反射和高光反射光數據信息,因此,必須在場景上進行第二遍,以回讀光照信息和最終輸出的逐像素渲染。延遲光照最明顯的優點是動態的減少了幾何緩衝區的大小。最明顯的成本就是需要渲染場景幾何體兩次而不是一次。另外一個額外的消耗是在延遲光照的延遲通道必須單獨輸遊戲蠻牛2017出漫反射和鏡面反射,然而延遲渲染的延遲通道僅僅需要輸出一個兩者組合的輻射值。
由於幾何緩衝區的大小的減少技術,部分克服了延遲着色的一個嚴重缺點—多個材質。
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)
這是隨着.0遺留下來的延遲光照特性,新的工程都應該考慮使用前面講的延遲渲染。
2、頂點光照渲染(Vertex Lit Rendering Path Detail)
頂點光照渲染通常渲染每一個物體都在一個通道上,計算在物體每個頂點上的所有光源的光。這是最快的渲染方式,並且有着最爲廣泛的硬件支持。(當然不能工作在控制檯上)。因爲,所有的光照計算都發生在頂點着色器上,因此這個渲染方式不能計算許多逐像素的效果,比如,陰影、法線映射以及光源Cookies.


好了,感謝原作者的分享。

每天進步一點點!!!

發佈了40 篇原創文章 · 獲贊 7 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章