【從UnityURP開始探索遊戲渲染】專欄-直達
環境光的基本處理流程
$Cambient$
- 環境光采集:獲取場景環境光照信息
- 環境光遮蔽:計算環境光遮擋關係
- 環境光反射:根據材質屬性反射環境光
- 環境光混合:與其他光照成分合成最終顏色
主要環境光模型及實現
恆定環境光(Constant Ambient)
- 實現原理:
- $環境光 = 環境光顏色 × 環境光強度$
- 最簡單的環境光模型
- 全局統一的環境光值
- 不考慮任何空間變化
Unity URP應用:
-
早期移動設備的基礎方案
-
在URP中作為最低質量級別選項
-
實現示例:
hlsl half3 ambient = unity_AmbientSky * _AmbientScale;
球諧光照(Spherical Harmonics, SH)
實現原理:
- 使用低階球諧函數(通常3階9係數)編碼環境光
- 在頂點着色器中重建環境光
- 公式:
- $環境光 = Σ(球諧係數 × 基函數(N))$
特點:
- 低頻光照近似
- 內存佔用小(每個頂點9個float)
- 計算成本低
Unity URP選用方案:
-
URP默認環境光方案
-
從Light Probe或Lightmap採樣
-
實現核心:
hlsl half3 ambient = SampleSH(normalWS);
環境光遮蔽(Ambient Occlusion)
- 實現原理:
- $有效環境光 = 基礎環境光 × AO因子$
- AO因子通過預計算或實時計算
- 常見技術:
- SSAO (屏幕空間AO)
- HBAO (水平基準AO)
- GTAO (地面真實AO)
Unity URP實現:
-
內置SSAO後處理效果
-
通過_MainLightOcclusionProbes控制
-
實現示例:
hlsl half ao = SampleAmbientOcclusion(positionCS); ambient *= ao;
反射探針(Reflection Probes)
實現原理:
-
預先生成立方體貼圖(Cubemap)
-
根據表面粗糙度進行模糊採樣
-
公式:
$鏡面環境光 = textureLod(cubemap, R, roughness * MAX_MIP_LEVEL)$
Unity URP應用:
- 高質量環境反射方案
- 支持混合探針和平面反射
- 實現核心:
hlsl
half3 reflection = GlossyEnvironmentReflection(
reflect(-viewDir, normalWS),
perceptualRoughness,
ao
);
Unity URP的環境光系統架構
graph TD A[環境光源] --> B{質量等級} B -->|Low| C[恆定環境光] B -->|Medium| D[球諧光照+AO] B -->|High| E[反射探針+SH] C --> F[光照合成] D --> F E --> F F --> G[最終顏色]
URP環境光混合策略
hlsl
// URP環境光處理 (Lighting.hlsl)
half3 MixEnvironmentLighting(
half3 diffuse,
half3 specular,
half3 normalWS,
half3 viewDirWS,
half roughness,
half occlusion)
{
// 漫反射環境光
half3 sh = SampleSH(normalWS) * occlusion;
// 鏡面反射環境光
half3 reflection = GlossyEnvironmentReflection(
reflect(-viewDirWS, normalWS),
roughness,
occlusion
);
return diffuse * sh + specular * reflection;
}
方案選型原因分析
為什麼URP選擇混合環境光系統?
- 性能分級控制:
- 低端設備:恆定環境光(節省50%計算)
- 中端設備:球諧光照(平衡質量性能)
- 高端設備:完整PBR環境光(物理精確)
- 內存效率優化:
- 球諧係數僅佔用36字節/頂點
- 反射探針使用漸進式更新
- 美術工作流統一:
- 統一的環境光強度參數
- 自動探針混合過渡
技術對比數據
| 模型 | 內存佔用 | 計算成本 | 視覺保真度 |
|---|---|---|---|
| 恆定環境光 | 12B | 1週期 | 30% |
| 球諧光照 | 36B | 15週期 | 65% |
| 反射探針 | 2-10MB | 50週期 | 90% |
| URP混合方案 | 動態調整 | 20-80週期 | 75-95% |
實際項目建議
移動端優化:
hlsl
// 簡化環境光計算
half3 ambient = unity_AmbientSky * occlusion;
開放世界遊戲:
csharp
// 使用混合探針
reflectionProbe.blendDistance = 10.0f;
reflectionProbe.mode = ReflectionProbeMode.Blended;
室內場景:
hlsl
// 增強AO效果
ambient *= pow(occlusion, _AOPower);
Unity URP的環境光系統通過分層架構實現了跨平台的高效渲染,在保持物理合理性的同時,針對不同硬件能力提供最優解決方案。這種靈活的設計使開發者能夠在各種項目規模中取得理想的視覺效果與性能平衡。
【從UnityURP開始探索遊戲渲染】專欄-直達
(歡迎點贊留言探討,更多人加入進來能更加完善這個探索的過程,🙏)