動態

詳情 返回 返回

【光照】[漫反射]UnityURP蘭伯特能量守恆嗎? - 動態 詳情

【從UnityURP開始探索遊戲渲染】專欄-直達

蘭伯特漫反射的能量守恆性

‌能量守恆基本原理‌

在物理正確的渲染中,能量守恆要求:

  1. 表面反射的光能總量 ≤ 入射光能
  2. 漫反射+高光反射 ≤ 1.0
  3. 沒有能量憑空產生或消失

‌經典蘭伯特模型的能量守恆問題‌

傳統蘭伯特漫反射公式:

$漫反射 = 表面反照率 × max(0, N·L)$

不守恆的原因‌:

  • 缺乏歸一化因子‌:
    • 半球積分結果應為π,但蘭伯特模型直接使用N·L
    • 正確公式應為:$漫反射 = 表面反照率 / π × max(0, N·L)$
  • 反射率超標‌:
    • 當反照率(albedo)設為1.0時,反射率可能超過100%
    • 例如:N·L=1時反射率為100%,但實際應有吸收損失
  • 恆定反射率‌:
    • 對所有入射角使用相同反射率
    • 現實中菲涅爾效應導致掠射角反射率增加

‌URP中的修正方案‌

Unity URP採用改進的蘭伯特模型:

hlsl
// URP實際實現(Lighting.hlsl)
half diffuseTerm = saturate(dot(normal, lightDir));
half3 diffuse = albedo * lightColor * diffuseTerm * INV_PI;

其中:

  • INV_PI ≈ 0.31831 (1/π)
  • 通過除以π實現能量歸一化

PBR工作流兼容性分析

‌兼容性類型‌

兼容維度 支持情況 説明
數據輸入 ✅ 完全兼容 使用相同的albedo貼圖輸入
光照計算 ⚠️ 部分兼容 缺乏物理反射特性
材質工作流 ✅ 完全兼容 支持標準材質參數
後期處理 ✅ 完全兼容 兼容HDR/Bloom等效果
全局光照 ⚠️ 有限兼容 需要特殊處理

‌完全兼容的方面‌

  • 材質參數統一‌:
    • 使用相同的albedo紋理和顏色參數
    • 支持相同的法線貼圖格式
  • HDR管線整合‌:
    • 支持線性顏色空間
    • 兼容HDR渲染和自動曝光
  • 後期處理協同‌:
    • 與Bloom效果無縫配合
    • 支持屏幕空間環境光遮蔽(SSAO)

‌有限兼容的方面‌

  • 能量守恆缺口‌:

    graph LR A[入射光能量] --> B[經驗模型] B --> C[漫反射輸出] C --> D{能量總和} D --> |100%| E[違反守恆] D --> |物理模型<90%| F[正確守恆]
  • 金屬度工作流問題‌:

    • 金屬表面應無漫反射,但蘭伯特模型無法正確處理
    • 需要額外代碼屏蔽金屬表面的漫反射
  • 菲涅爾效應缺失‌:

    • 掠射角反射率無增強
    • 影響邊緣光照的真實性
  • 全局光照不一致‌:

    • 與基於物理的GI系統配合時可能出現能量不匹配
    • 需要手動調整間接光照強度

‌URP中的兼容性實現‌

  • URP採用混合方案實現兼容:
hlsl
// URP的BRDF處理(BRDF.hlsl)
half3 BRDF_lambert(half3 albedo)
{
    return albedo * INV_PI;
}

#if defined(_PBR_ENABLED)
    // 物理正確的漫反射計算
    half3 diffuse = BRDF_lambert(albedo) * saturate(NdotL);
#else
    // 傳統蘭伯特計算
    half3 diffuse = albedo * saturate(NdotL);
#endif

結論與建議

‌能量守恆結論‌

  • 原始蘭伯特模型不守恆‌:缺乏歸一化因子,反射率可能超標
  • 修正版可基本守恆‌:通過添加1/π因子實現能量平衡
  • URP實現部分守恆‌:在標準着色器中已包含修正因子

‌PBR兼容性結論‌

  • ✅ ‌美術工作流兼容‌:可使用相同材質和紋理
  • ️ ‌物理精度侷限‌:無法完全匹配物理反射特性
  • ️ ‌工程實用方案‌:適合風格化/性能優先項目

‌實際開發建議‌

  • 移動端項目‌:

    hlsl
    // 使用優化版蘭伯特(包含能量修正)
    half3 diffuse = albedo * saturate(NdotL) * 0.31831;
    
  • PC/主機項目‌:

    hlsl
    // 使用完整PBR漫反射(Disney模型)
    half3 diffuse = albedo * (1 / PI) * (1 - metallic) * saturate(NdotL);
    
  • 風格化渲染‌:

    hlsl
    // 藝術導向的增強版
    half3 diffuse = albedo * pow(saturate(NdotL), _RampPower) * _Intensity;
    

在URP中,經驗模型與PBR工作流可通過條件編譯實現無縫切換,開發者可根據目標平台和藝術需求選擇最適合的模型,在物理準確性和性能之間取得最佳平衡。


【從UnityURP開始探索遊戲渲染】專欄-直達

(歡迎點贊留言探討,更多人加入進來能更加完善這個探索的過程,🙏)

Add a new 評論

Some HTML is okay.