【从UnityURP开始探索游戏渲染】专栏-直达
漫反射辐照的核心作用
漫反射辐照(Diffuse Irradiance)在URP PBR中用于模拟环境光对物体表面的均匀散射效果,通过预计算环境立方体贴图的低频光照信息,为动态物体提供间接漫反射光照。其核心公式为:
$L_d=\frac{c}{\pi}\int_\Omega L_i(\omega_i)(n\cdot\omega_i)d\omega_i$
其中c为反照率,$L_i$为环境光强度。
其核心是将环境立方体贴图卷积为球谐系数(SH)或光照探针数据。计算过程遵循Lambertian反射模型.
技术演进关键节点
- Unity 5.x时代
首次引入标准PBR管线,但依赖内置渲染管线,环境光计算需全分辨率立方体贴图,内存消耗大。
- URP 7.x 2020
采用三层球谐基函数压缩环境光数据,内存占用降低90%以上,同时支持动态光照探针混合,实现移动端高效运行。
- URP 2022
引入HDR环境贴图支持,提升高动态范围场景下漫反射辐照的精度,通过RGBM编码解决LDR贴图亮度失真问题。
解决的问题与方案优势
传统问题
- 动态物体无法复用静态光照贴图,导致场景光照不连贯。
- 实时积分计算环境光性能开销过高,尤其在移动端。
URP方案选择原因
<ul>球谐函数压缩:用9个系数(三层SH)近似环境光分布,相比立方体贴图减少90%内存占用。
球谐系数(SH)卷积计算原理
- 环境立方体贴图到球谐系数的转换过程分为两步:
- 首先对立方体贴图进行蒙特卡洛积分,计算各阶球谐基函数的投影系数;
- 然后在运行时通过法线向量重建光照。
- 核心公式为:
$c_{l,m}=\int_\Omega L_i(\omega)Y_{l,m}(\omega)d\omega$
其中$Y_{l,m}$为球谐基函数,$L_i$为环境光强度。Unity采用三阶SH(9个系数),仅需存储RGB三个通道的9个浮点数,相比立方体贴图内存占用减少99.8%。
具体实现步骤
<ul>预计算阶段
对立方体贴图的每个纹素进行半球积分,计算0-2阶球谐系数:
[code]hlsl// 伪代码:立方体贴图投影到SHfor each texel in cubemap { float3 dir = normalize(texelDirection); float3 color = SampleCubemap(texel); for (int l=0; l |