【從UnityURP開始探索遊戲渲染】專欄-直達
Lit Shader的作用與原理
Lit Shader是Unity通用渲染管線(URP)中的核心着色器,專門用於實現基於物理的渲染(PBR)效果。它能以照片級質量渲染真實世界的表面材質,如石頭、木材、玻璃、塑料和金屬,使光照和反射在各種光照條件下(如明亮的陽光或黑暗的洞穴)都能呈現逼真效果。
工作原理
Lit Shader採用物理正確的光照模型,考慮了能量守恆和微表面理論。它通過以下核心參數控制材質表現:
- 金屬度Metallic: 控制材質是金屬(1)還是非金屬(0),金屬材質具有更強烈的鏡面反射
- 光滑度Smoothness: 決定表面粗糙程度,影響高光反射的擴散範圍
- 法線貼圖Normal Map: 增加表面微觀細節的視覺表現
- 環境光遮蔽Ambient Occlusion: 模擬表面縫隙和凹陷處的陰影效果
URP中的Lit Shader通過SubShader和多個Pass實現渲染,每個Pass都有特定用途(如主光源、附加光源、陰影等)。與內置渲染管線不同,URP不需要為每個附加光源創建額外Pass,而是通過優化後的單Pass前向渲染實現高效多光源處理。
發展歷史
Lit Shader隨着Unity渲染管線的發展經歷了幾個關鍵階段:
- 內置渲染管線時期:Unity最初提供標準着色器(Standard Shader),採用類似PBR的工作流程,但性能開銷較大
- LWRP階段:Unity推出輕量級渲染管線(LWRP),包含簡化版的Lit Shader,專注於移動平台優化
- URP階段:LWRP升級為通用渲染管線(URP),Lit Shader成為核心着色器,支持更廣泛平台並優化性能
- 持續優化:Unity不斷改進Lit Shader,增加功能如透明混合模式、雙面渲染等,同時保持高性能
具體使用方法
基本設置步驟
- 在項目中創建或選擇材質
- 在材質檢查器窗口中選擇Shader為"Universal Render Pipeline > Lit"
-
配置材質屬性:
Surface Options: - 表面類型(不透明/透明) - 渲染面(正面/雙面) - 混合模式(Alpha/Premultiply/Additive/Multiply) Surface Inputs: - 基礎顏色 - 金屬度 - 光滑度 - 法線貼圖 - 高度圖等
示例:創建金屬材質
- 新建材質並應用Lit Shader
- 設置Surface Type為Opaque
- 調整Base Color為金屬色調(如銀灰色)
- 將Metallic滑塊調至1(完全金屬)
- 調整Smoothness控制反射清晰度
- 添加法線貼圖增加表面細節
Shader Graph中的應用
雖然Lit Shader本身是代碼實現的,但可以在Shader Graph中創建類似效果:
示例:在Shader Graph中創建PBR材質
- 創建新的Shader Graph,選擇URP模板
-
添加以下節點:
- PBR Master節點(核心光照模型)
- Sample Texture 2D節點(基礎貼圖)
- Normal From Texture節點(法線貼圖)
- Slider節點(控制金屬度和光滑度)
-
連接節點:
- 基礎貼圖連接到Albedo
- 法線連接到Normal
- 金屬度和光滑度滑塊連接到相應輸入
- 導出為Shader並應用到材質
高級示例
透明玻璃效果
- 在Shader Graph中設置PBR Master的Surface Type為Transparent
- 設置Blend Mode為Alpha
- 添加Fresnel Effect節點模擬玻璃邊緣反射
- 使用Vertex Position節點驅動折射效果
- 通過Time節點添加動態反射變化
基礎配置
-
創建材質並選擇Lit Shader
在材質Inspector中選擇Shader路徑為
Universal Render Pipeline > Lit,這是URP下實現物理渲染的基礎着色器。 -
設置表面類型為透明
在
Surface Options中將Surface Type從默認的Opaque改為Transparent,此時會激活Blending Mode選項。 -
選擇混合模式
- Alpha模式:適用於普通半透明效果,通過Alpha值控制透明度(0完全透明,1不透明),計算公式為
OutputRGBA = (SourceRGB × SourceAlpha) + DestinationRGB × (1 − SourceAlpha)。 - Premultiply模式:適合保留高光和反射的透明材質(如玻璃),可減少邊緣偽影。
- Alpha模式:適用於普通半透明效果,通過Alpha值控制透明度(0完全透明,1不透明),計算公式為
進階調整
-
深度寫入與雙Pass優化
若出現透明物體內部穿模問題,可通過雙Pass解決:第一個Pass僅寫入深度(
ZWrite On+ColorMask 0),第二個Pass關閉深度寫入並啓用混合(ZWrite Off+Blend SrcAlpha OneMinusSrcAlpha)。 -
折射效果增強
使用
GrabPass捕獲屏幕紋理,結合模型UV偏移模擬折射。示例代碼片段:hlsl GrabPass { "_GrabTexture" } sampler2D _GrabTexture; float4 frag(v2f i) : SV_Target { float2 offset = /* 基於法線或高度的偏移計算 */; return tex2D(_GrabTexture, i.uvgrab + offset); }此方法需配合透明材質和混合模式使用。
-
菲涅爾效應
在片元着色器中加入視角相關透明度變化,增強邊緣高光:
hlsl float NDotV = saturate(dot(worldNormal, viewDir)); float fresnel = pow(1 - NDotV, _FresnelPower); alpha *= fresnel;通過調整
_FresnelPower控制效果強度。
性能注意事項
- 透明渲染會禁用Early-Z優化,建議控制透明物體數量。
- 複雜效果(如折射)可能需自定義Shader變體,URP Lit的
Surface Type和Blending Mode已覆蓋多數基礎需求
金屬材質
- 工作流模式:選擇"Metallic"模式,通過調整Metallic滑塊控制金屬度(1.0為全金屬效果)
- 光滑度:增加Smoothness值(0.8-1.0)可獲得鏡面反射效果
- 基礎貼圖:使用帶有金屬質感的基礎顏色貼圖,建議配合法線貼圖增強細節
頭髮材質
- 多層結構:使用兩個材質球(Front+Transparent)組合,Transparent材質需開啓Alpha混合和雙面渲染
-
參數配置:
- Front材質:Surface Type=Opaque, Render Face=Front
- Transparent材質:Alpha=0.3-0.5, Render Face=Both
雪地材質
- 世界法線混合:通過法線貼圖的Y軸值作為蒙版,混合雪地與原材質
-
參數設置:
- BaseMap:使用雪地紋理
- Smoothness:0.4-0.6模擬濕雪反光
- Normal Map:增強表面凹凸細節
岩石/混凝土
- 工作流模式:選擇"Specular"模式更易控制非金屬反射
-
表面細節:
- 使用高對比度法線貼圖
- Smoothness=0.1-0.3保持粗糙質感
- 開啓Height Map實現視差遮擋
動態效果實現
-
對於火焰/水球等特效,建議通過ShaderGraph擴展Lit Shader:
- UV擾動:使用Voronoi噪點+Time節點驅動UV動畫
- 進度控制:通過腳本動態調整Cutoff參數實現填充效果
-
關鍵參數組位置:
- Surface Options:定義材質基礎類型和渲染方式
- Surface Inputs:配置紋理和物理屬性
- Advanced Options:控制渲染優化選項
【從UnityURP開始探索遊戲渲染】專欄-直達
(歡迎點贊留言探討,更多人加入進來能更加完善這個探索的過程,🙏)