博客 / 詳情

返回

【URP】Unity光照陰影Light shadow

【從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開始探索遊戲渲染】專欄-直達
(歡迎點贊留言探討,更多人加入進來能更加完善這個探索的過程,🙏)
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.