1. 程式人生 > >【《Unity Shader入門精要》 提煉總結】(十五)第十五章·光照系統進階教程&Unity的渲染路徑介紹&前向渲染路徑&頂點照明渲染路徑&延遲渲染路徑

【《Unity Shader入門精要》 提煉總結】(十五)第十五章·光照系統進階教程&Unity的渲染路徑介紹&前向渲染路徑&頂點照明渲染路徑&延遲渲染路徑

 

 

 

本文由@唐三十胖子出品,轉載請註明出處。  
文章連結:https://blog.csdn.net/iceSony/article/details/84887592

 

 

 

這篇文章將總結和提煉《Unity Shader入門精要》的第十章“高階紋理”的內容。

通過這篇文章,你可以知道

1)Unity的渲染路徑介紹

2)前向渲染路徑

3)頂點照明渲染路徑

4)延遲渲染路徑

一.Unity的渲染路徑介紹

之前章節用到的是單一平行光(大多數手遊就是如此)

但PC實現光照往往更加複雜,處理的數目與種類更多的光源。

Unity的渲染路徑

渲染路徑:決定光照如何應用到shader中,寫在Pass/Tags中的LightMode中

Unity在5.0版本自帶三種渲染模式:前向渲染、延遲渲染、頂點照明渲染

但在5.0版本之後頂點照明渲染被拋棄,有了新的延遲渲染機制,但都對舊有程式碼的相容

在Unity調整預設渲染路徑(事實上在博主用的5.6.5版本這個選項已經被剔除了)

Edit->Porject Settings->Player->Other Settings->Rendering Path中選擇專案所需的渲染路徑。

這是一種預設的設定方式,我們還可以通過設定攝像機的Rendering Path來修改不同的方式

上面使用的是預設的渲染路徑,當你的顯示卡不支援該渲染路徑,Unity會自動使用更低一級的渲染路徑。比如當GPU不支援延遲渲染,就會替換為前向渲染。

 

事實上在Shader中這三種渲染路徑仍可以細分

除了我們一直用的forwardbase,還有其他型別如下表

接下來我們將一一講解

二.前向渲染路徑:最常見的渲染路徑

前向渲染的原理:當進行逐片元的渲染,利用深度緩衝判斷當前片元是否可見,如果可見就更新顏色緩衝區的顏色

對於每個逐畫素的光源,我們都要進行上述的完整渲染流程。

如果物體處在多個逐畫素光源影響區域,那麼該物體需要執行多個Pass,每個Pass計算一個逐畫素光源的光照結果。

最後在幀緩衝中(每幀結束資料處理的區域)混合得到最終的顯示顏色。

為了減少Pass數目,Unity渲染時會限制物體的逐畫素光照數目。

前向渲染對光照的處理

分三類處理光照:逐頂點處理、逐畫素處理、球諧函式處理

逐頂點處理/SH處理:光源Render Mode設定為Not Important

逐畫素處理:場景中最亮的平行光;光源RenderMode設定為Important;逐畫素光源數量小於QualitySetting中的逐畫素光源數量,那麼原本採用逐頂點處理/SH處理的會自動變成逐畫素處理

在之後的前向渲染Shader編寫中,往往包含兩個Pass:一個Pass僅僅執行一次,另一個會根據逐畫素光源數目多次呼叫

內建的光照變數和函式

三.頂點照明渲染路徑:效能最高、效果最差

頂點照明渲染原理:通常為一個Pass,計算所有光線照明。

在本質上頂點照明渲染是前向渲染的子集,除了不支援陰影、法線對映、高光對映等

所以在現在的版本這個已經被剔除了= =

四.延遲渲染路徑:適用於大量光源

比起前向渲染的顏色與深度緩衝區,還新增一個Geometry緩衝來儲存表面資訊,包含法線、位置、材質等

原理:兩個Pass,第一個Pass計算片元是否可見,可見就儲存到G緩衝區

第二個Pass利用緩衝區片元資訊,進行光照計算

Unity中的延遲渲染

分為舊版與新版,且不支援抗鋸齒,不能處理半透明物體,對顯示卡有要求。

除去深度緩衝&模板緩衝,預設的G緩衝區包含:

RT0:格式為ARGB32,RGB儲存漫反射顏色,A通道沒用到

RT1:格式為ARGB32,RGB儲存高光反射顏色,A通道儲存高光反射的指數

RT2:格式為ARGB2101010,RGB儲存法線,A通道沒用到

RT3:格式為ARGB32(非HDR),用於儲存自發光+lightmap+反射探針

可用的內建變數與函式

 

之後的文章我們將重點講解Unity最常見的前向渲染(= =手遊無光,且不用考慮硬體問題)

 

感謝閱讀:)