【《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最常見的前向渲染(= =手遊無光,且不用考慮硬體問題)
感謝閱讀:)