【光照】Unity[光照烘焙]的原理與具體流程
【從UnityURP開始探索游戲渲染】專欄-直達
URP光照烘焙介紹
Unity通用渲染管線(URP)的光照烘焙系統是用于預計算全局光照(GI)的核心技術,它將靜態光源的光照效果預先計算并存儲在光照貼圖(Lightmap)中,運行時直接采樣使用以提高性能。URP支持三種光源模式:
- ?Realtime實時模式?:
- 完全動態計算,不生成光照貼圖,適用于高頻移動光源或需要實時互動的場景。
- ?Baked烘焙模式?:
- 完全離線烘焙到光照貼圖中,運行時無實時計算,適合靜態環境光。
- ?Mixed混合模式?:
- 結合烘焙與實時計算的優勢,包括三種子模式:
- Baked Indirect:烘焙間接光照,直接光和陰影實時計算
- Subtractive:烘焙直接光和陰影,動態物體通過Light Probe接收光照
- Shadowmask:烘焙間接光+陰影貼圖,實時計算直接光
歷史發展
URP的光照烘焙技術源自Unity傳統的Enlighten和Progressive光照系統,經過多次迭代:
- 早期版本主要依賴Enlighten光照系統
- 2018年后引入Progressive光照烘焙器(CPU/GPU)
- URP 7.x版本開始支持StructuredBuffer優化光源處理
- 最新版本支持Shadowmask混合模式,平衡效果與性能
內部實現原理與數學公式
光照烘焙核心算法
光照烘焙主要基于輻射度算法(Radiosity)和光子映射(Photon Mapping),核心數學公式包括:
?輻射傳輸方程?:
$L_o(x,ω_o) = L_e(x,ω_o) + ∫_Ω f_r(x,ω_i,ω_o)L_i(x,ω_i)(n·ω_i)dω_i$
其中:
- $L_o$:出射輻射度
- $L_e$:自發光輻射度
- $f_r$:雙向反射分布函數(BRDF)
- $L_i$:入射輻射度
- $(n·ω_i)$:余弦項
?光照貼圖采樣?:
float3 SampleLightMap(float2 lightMapUV) {
#if defined(LIGHTMAP_ON)
return SampleSingleLightmap(TEXTURE2D_ARGS(unity_Lightmap, samplerunity_Lightmap),
lightMapUV, float4(1.0, 1.0, 0.0, 0.0),
#if defined(UNITY_LIGHTMAP_FULL_HDR)
false,
#elsetrue,
#endif
float4(LIGHTMAP_HDR_MULTIPLIER, LIGHTMAP_HDR_EXPONENT, 0.0, 0.0));
#elsereturn 0.0;
#endif
}
動態物體光照處理
動態物體通過Light Probe接收烘焙光照,采樣使用球諧函數(SH):
float3 SampleLightProbe(Surface surfaceWS) {
#if defined(LIGHTMAP_ON)
return 0.0;
#elseif(unity_ProbeVolumeParams.x) {
return SampleProbeVolumeSH4(TEXTURE3D_ARGS(unity_ProbeVolumeSH, samplerunity_ProbeVolumeSH),
surfaceWS.position, surfaceWS.normal, unity_ProbeVolumeWorldToObject,
unity_ProbeVolumeParams.y, unity_ProbeVolumeParams.z,
unity_ProbeVolumeMin.xyz, unity_ProbeVolumeSizeInv.xyz);
} else {
float4 coefficients[7];
coefficients[0] = unity_SHAr;
coefficients[1] = unity_SHAg;
coefficients[2] = unity_SHAb;
coefficients[3] = unity_SHBr;
coefficients[4] = unity_SHBg;
coefficients[5] = unity_SHBb;
coefficients[6] = unity_SHC;
return max(0.0, SampleSH9(coefficients, surfaceWS.normal));
}
#endif
}
具體流程與手動計算示例
光照烘焙流程
- ?場景準備?:
- 標記靜態物體(勾選Static)
- 生成光照貼圖UV(Generate Lightmap UVs)
- 設置光源模式(Baked/Mixed)
- ?烘焙參數設置?:
- 間接光反彈次數(Max Bounces,通常設為5)
- 光照貼圖分辨率
- 啟用環境光遮蔽(AO)
- ?執行烘焙?:
- CPU或GPU漸進式烘焙
- 降噪處理
- 生成光照貼圖和光照探針
手動計算示例
假設一個簡單場景,計算某點P的烘焙光照:
?直接光照計算?:
$L_direct = I * max(0, n·l) / (d2 + 1)$
其中:
- I:光源強度
- n:表面法線
- l:光源方向
- d:距離光源的距離
?間接光照計算?:
$L_{indirect} = Σ (L_{bounce} * albedo / π)$
其中:
- $L_{bounce}$:來自其他表面的反射光
- albedo:表面反射率
?最終光照?:
$L_{final} = L_{direct} + L_{indirect} + L_{emission}$
常見問題與優化
- ?黑斑問題?:因模型沒有光照貼圖坐標或UV重疊導致,需勾選Generate Lightmap UVs并調整Pack Margin。
- ?硬邊問題?:因UV在光照圖中比例太小,需調大Scale In Lightmap參數。
- ?性能優化?:
- 使用Shadowmask模式平衡效果與性能
- 控制附加光源數量(PC平臺最多8個)
- 合理設置陰影距離(Shadow Distance)
URP的光照烘焙系統通過結合預計算和實時計算,在保持良好視覺效果的同時顯著提升了渲染性能,特別適合移動端和中低端硬件平臺
【從UnityURP開始探索游戲渲染】專欄-直達
(歡迎點贊留言探討,更多人加入進來能更加完善這個探索的過程,??)

Unity URP光照烘焙系統通過預計算全局光照(GI)將靜態光源效果存儲在光照貼圖中,運行時直接采樣以提升性能。支持實時、烘焙和混合三種模式,其中混合模式結合烘焙與實時計算優勢。核心技術基于輻射度算法和光子映射,通過光照貼圖采樣和光照探針對動態物體進行處理。優化方案包括調整UV參數、使用Shadowmask模式和控制附加光源數量等。該技術源自Unity傳統光照系統,經過多次迭代,在移動端和中低端硬件平臺能有效平衡視覺效果與性能表現。
浙公網安備 33010602011771號