在基于物理的渲染(PBR)中,环境光的实现遵循一套系统化的流程,确保场景中的物体能够自然地与周围光照环境交互。该流程主要包括以下几个关键步骤:
- 环境贴图采样:从预处理的环境贴图中获取周围空间的辐照度信息。
- 漫反射计算:用于模拟非金属材质对环境光的散射响应。
- 镜面反射计算:处理金属或高光表面的环境反射效果。
- 环境光遮蔽:结合几何结构信息,增强阴影区域的真实感,体现局部遮挡影响。
- 最终混合:将上述各部分与其他光源贡献进行合成,形成完整的环境光照结果。
主流环境光实现模型分析
1. 球谐光照(Spherical Harmonics)
原理说明:
通过球谐函数将复杂的环境光照场投影到低维系数空间,利用低阶多项式近似表示全局光照分布。
核心公式:
$L(θ,?)≈\sum_{l=0}^{n}\sum_{m=-l}^{l}c_{lm}Y_{lm}(θ,?)$
主要特点:
- 内存占用极小
- 实时计算效率高
- 非常适合动态变化的场景和移动平台应用
2. 预计算辐照度贴图(Precomputed Radiance Transfer)
原理说明:
提前对环境光在不同材质属性下的响应进行离线计算,并以纹理形式存储,供运行时快速查询。
实现方式:
- 漫反射部分:使用经过卷积处理的低频辐照度立方体贴图
- 镜面反射部分:采用按粗糙度分层过滤的反射探针数据(Glossy Environment Probe)
3. 屏幕空间反射(Screen Space Reflection, SSR)
原理说明:
直接在屏幕坐标系内追踪视线方向的反射路径,实时生成反射内容。
特性总结:
- 无需依赖预处理资源
- GPU开销较高
- 只能呈现当前帧缓冲中可见的反射对象,存在视锥限制
Unity URP 中的环境光实施方案
URP(Universal Render Pipeline)采用了一种兼顾性能与视觉质量的混合策略,其核心由反射探针 + 球谐光照共同构成。
核心着色代码实现
// 环境漫反射:基于球谐函数采样
half3 ambientDiffuse = SampleSH(normalWS) * surfaceData.albedo;
// 计算反射向量并获取镜面反射
half3 reflectVector = reflect(-viewDirectionWS, normalWS);
half3 ambientSpecular = GlossyEnvironmentReflection(
reflectVector,
positionWS,
surfaceData.roughness,
1.0
);
// 最终环境光混合:根据金属度插值漫反射与镜面反射
half3 ambient = ambientDiffuse * (1 - surfaceData.metallic) +
ambientSpecular * surfaceData.metallic;
方案选择依据
- 性能与质量平衡:
- 球谐提供高效且平滑的漫反射环境照明
- 反射探针负责高质量、具象化的镜面反射表现
- 支持动态场景:
- 反射探针可设置为实时更新模式
- 球谐系数可在运行时动态重算,适应光照变化
- 移动端优化策略:
// 移动端简化版本:跳过复杂反射调用
half3 ambient = SampleSH(normalWS) * surfaceData.albedo;
half3 specular = surfaceData.metallic * SAMPLE_TEXTURECUBE_LOD(
_GlossyEnvironmentCube,
sampler_GlossyEnvironmentCube,
reflectVector,
surfaceData.roughness * UNITY_SPECCUBE_LOD_STEPS
);
- 艺术家友好性:
- 可通过编辑器直观布置反射探针位置
- 球谐光照自动生成,无需手动配置
关键技术细节实现
反射探针系统设计
- 对立方体贴图进行预过滤处理,分离不同粗糙度层级
- 使用多级mipmap存储滤波结果,支持PBR材质的LOD匹配
- 支持多个探针之间的权重融合,避免突变过渡
球谐光照计算机制
- 采用三阶球谐展开(共9个系数),在精度与成本间取得良好平衡
- 场景主环境光可通过烘焙转换为球谐系数
- 动态物体也可实时接收来自球谐编码的间接光照
环境光遮蔽集成方式
ambient *= lerp(1.0, occlusion, _AmbientOcclusionParam.w);
通过参数控制AO对环境光的衰减强度,实现更真实的接触阴影效果。
性能分级处理机制
#if defined(_ENVIRONMENTREFLECTIONS_OFF)
half3 ambientSpecular = 0;
#else
// 执行完整镜面反射计算逻辑
#endif
根据目标平台自动启用或禁用高开销功能,提升跨设备兼容性。
不同模型性能对比表
| 模型 | 内存占用 | GPU消耗 | 动态支持 | 视觉质量 |
|---|---|---|---|---|
| 球谐光照 | 极低 | 极低 | ★★★★★ | ★★☆☆☆ |
| 反射探针 | 中-高 | 中 | ★★★☆☆ | ★★★★☆ |
| SSR | 低 | 高 | ★★★★☆ | ★★★★☆ |
| URP混合方案 | 中 | 中 | ★★★★☆ | ★★★★☆ |
Unity URP 环境光方案的优势总结
- 支持分级渲染:
- 高端设备启用完整反射探针+球谐光照组合
- 移动端切换至轻量级球谐方案,保障帧率稳定
- 具备良好的场景适应能力:
- 室内封闭空间:部署高密度反射探针以捕捉细节反射
- 开放世界场景:以球谐为主,关键区域辅以探针补充
- 支持动态全局光照:
- 可与光照探针系统协同工作
- 允许运行时更新环境光照状态
- 扩展性强:
- 易于集成SSR、光线追踪等后处理增强效果
- 支持自定义环境光遮蔽通道输入
综上所述,Unity URP 的环境光架构通过精心设计的混合方法,在保证实时性能的前提下提供了足够逼真的全局光照体验,特别适用于需要跨平台发布的项目。随着硬件能力不断提升,URP也逐步整合了如Enlighten、GPU Lightmapper等更先进的GI技术,但其基础环境光处理理念始终保持一致,确保了架构的稳定性与可维护性。


雷达卡


京公网安备 11010802022788号







