【從UnityURP開始探索遊戲渲染】專欄-直達
URP 光照陰影 使用 陰影貼圖 (Shadow Maps) 和 陰影級聯 (Shadow Cascades)。屏幕空間陰影渲染器功能 (Screen Space Shadows Renderer Feature),使 URP 通過單一渲染紋理計算並繪製主方向光的陰影,而不是使用多個陰影級聯貼圖。
URP陰影系統核心機制
-
陰影貼圖Shadow Maps
- 通過光源視角的深度渲染生成_MainLightShadowmapTexture
- 使用ShadowCaster Pass(需聲明LightMode標籤)生成深度數據
- 通過_ShadowBias參數解決自陰影問題(含深度/法線偏移)
-
陰影級聯Cascaded Shadow Maps
- 將視錐體分割為近/中/遠多級區域(默認4級)
- 不同級聯使用_MainLightShadowmapTexture的不同區域
- 通過MainLightShadowCasterPass.cs動態計算級聯邊界
-
屏幕空間陰影Screen Space Shadows
- 基於_CameraDepthTexture和陰影貼圖實時混合計算
- 相比級聯方案減少紋理採樣但增加GPU計算負擔
- 適合移動端等需要減少帶寬的場景
關鍵實現原理
-
陰影生成流程
- 深度圖渲染階段:執行ShadowCaster Pass生成光源空間深度
- 陰影比較階段:通過_MainLightWorldToShadow矩陣轉換座標
- 最終混合階段:根據陰影強度(Shadow Strength)混合光照結果
Shader示例展示陰影比較邏輯:
hlsl float4 shadowCoord = mul(_MainLightWorldToShadow, float4(worldPos, 1.0)); float shadow = SampleShadowmap(shadowCoord); // 採樣ShadowMap float lightAttenuation = shadow > 0 ? 1.0 : 0.0; // 陰影判斷 -
優化參數體系
參數 作用域 典型值 分辨率 全局/光源級 1024-4096 級聯分割 方向光 2-4級 深度偏移 材質/光源 0.001-0.1 法線偏移 材質/光源 0.01-0.5 -
性能敏感操作
- 陰影距離(Shadow Distance):控制最大生成範圍
- 軟陰影濾波(Soft Shadows):增加PCSS濾波開銷
- 動態批處理:影響ShadowCaster Pass執行效率
陰影貼圖(Shadow Maps)
實現原理是從光源視角渲染場景深度到紋理(_MainLightShadowmapTexture),通過比較當前像素深度與ShadowMap值判斷陰影區域。關鍵步驟包括:
- ShadowCaster Pass生成深度圖,需聲明LightMode="ShadowCaster"標籤和對應宏
- 深度比較時使用_MainLightWorldToShadow矩陣轉換座標到光源空間
- 通過_ShadowBias參數調整深度/法線偏移防止陰影失真
陰影級聯(Cascaded Shadow Maps)
將視錐體分割為多個區域(通常2×2圖集),近處使用高精度貼圖,遠處使用低精度,解決大場景陰影鋸齒問題。URP通過MainLightShadowCasterPass.cs管理級聯:
- GetShadowCasterBounds()計算影響範圍
- 不同級聯區域對應_MainLightShadowmapTexture的不同部分
屏幕空間陰影(Screen Space Shadows)
替代傳統級聯的方案,工作流程:
- 生成_CameraDepthTexture和_MainLightShadowmapTexture
- 重建世界座標後轉換到陰影空間生成_ScreenSpaceShadowmapTexture
- 相比級聯方案減少紋理採樣次數但增加深度預處理開銷
關鍵參數優化
| 參數 | 作用 | 示例 |
|---|---|---|
| 分辨率 | 影響陰影精度 | 2048x2048適合中端設備 |
| 圖集 | 存儲多級聯/多光源陰影 | _MainLightShadowmapTexture為2×2圖集 |
| 深度偏移 | 防止自陰影 | _ShadowBias.x調整深度值 |
| 法線偏移 | 解決Peter Panning | _ShadowBias.y沿法線偏移 |
| 近裁剪面 | 控制陰影生成範圍 | Light組件中Cascade Split設置 |
技術對比
| 方案 | 優點 | 缺點 |
|---|---|---|
| 傳統級聯 | 精度可控 | 帶寬佔用高 |
| 屏幕空間 | 節省帶寬 | 邊緣鋸齒明顯 |
| 混合方案 | 平衡性能/質量 | 實現複雜度高 |
文檔中特別強調:URP 14.1版本後優化了陰影圖集分配策略,減少了約20%的顯存佔用。建議開發者通過Frame Debugger驗證陰影生成各階段的實際效果。
性能優化建議:
- 靜態物體使用光照貼圖烘焙陰影
- 動態物體根據距離調整陰影分辨率
- 屏幕空間陰影適合移動端(減少採樣),PC端推薦級聯陰影
- 硬陰影(Hard Shadow)比軟陰影節省30% GPU開銷
-
移動端適配
- 推薦使用屏幕空間陰影+中等分辨率(1024)
- 關閉非必要級聯(如保留2級)
- 靜態物體烘焙光照貼圖
-
PC端高精度方案
- 4級級聯+2048分辨率
- 啓用PCSS軟陰影濾波
- 動態調整陰影距離(建議30-100米)
-
常見問題解決
- 陰影鋸齒:提高分辨率或啓用軟陰影
- Peter Panning:增加法線偏移值
- 性能瓶頸:使用Debugger分析ShadowCaster耗時
【從UnityURP開始探索遊戲渲染】專欄-直達
(歡迎點贊留言探討,更多人加入進來能更加完善這個探索的過程,🙏)