【从UnityURP开始探索游戏渲染】专栏-直达
光照探针的作用
光照探针(Light Probes)是Unity中用于解决动态物体间接光照问题的核心技术,主要作用包括:
- 为动态物体提供间接光照:在静态场景中,动态物体无法直接使用烘焙光照贴图,光照探针通过存储空间中的光照信息,让动态物体也能获得与静态环境一致的间接光照效果。
- 提升视觉一致性:通过插值计算,使移动中的物体能够平滑过渡不同区域的光照氛围,避免光照突变带来的不协调感。
- 优化性能:相比全实时全局光照计算,光照探针使用预计算数据,运行时只需简单插值,性能消耗极低。
- 支持复杂光照效果:能捕捉颜色渗色、柔和阴影等高级光照现象,提升场景真实感。
发展历史
光照探针技术在Unity中的演进可分为三个阶段:
- 传统光照探针组Light Probe Group:早期版本中需要手动放置探针点,形成三维网格覆盖动态物体活动区域。
- 自适应探针体积Adaptive Probe Volumes:在URP中引入的自动化解决方案,根据场景几何密度自动生成探针网格,支持大规模开放世界(Unity6 URP开始支持)。
- URP探针体积系统:进一步优化存储和加载机制,支持流式传输和动态光照切换(如昼夜循环)。
内部实现原理
光照探针的核心技术实现包括以下方面:
- 数据采集与存储
- 使用球谐函数(SH)编码存储光照信息,通常采用三阶SH以平衡精度和性能。
- 每个探针点记录来自各个方向的入射光信息(主要是间接光)。
- 数据以"砖块"(Brick)结构组织,高密度区域使用4x4x4小网格(间距1-3米),低密度区域使用大网格(间距9-27米)。
- 运行时插值机制
- 动态物体的包围盒位置确定其所在的四面体,从四个顶点探针插值获取光照。
- URP使用每像素8探针采样和三线性插值,消除传统方法的接缝问题。
- 插值权重基于物体到各探针的距离和相对位置计算。
- 技术限制
- 不适合大面积平坦或凹面物体,可能产生光照异常。
- 无法表现高频光照细节(受SH阶数限制)。
- 动态物体不会贡献间接光到环境中。
自适应探针体积(APV)
自适应探针体积(Adaptive Probe Volumes)是Unity URP渲染管线中用于优化间接光照烘焙的核心技术,它通过自动化生成探针网格,动态适配场景几何密度,实现高效的光照数据采样与存储。
核心特性
- 自动生成探针网格:基于场景几何密度自动生成规则排列的探针点,无需手动放置
- 自适应密度控制:高密度区域(如室内细节)使用小间距探针(1-3米),低密度区域(如开放地形)使用大间距探针(9-27米)
- 高质量光照采样:每像素从8个最近探针采样数据,通过三线性插值混合结果,消除传统光照探针组的接缝问题
- 流式加载支持:支持运行时动态加载/卸载探针数据,适用于开放世界场景
与传统光照探针的对比
特性 | APV探针体积 | 传统Light Probe Group |
---|---|---|
生成方式 | 自动基于几何密度生成 | 手动放置 |
采样精度 | 每像素8探针采样,无接缝 | 按物体插值,可能产生接缝 |
内存管理 | 自适应优化,支持流式加载 | 固定密度,内存占用不可控 |
适用场景 | 大开放世界、动态物体 | 小型场景、静态布局 |
具体使用方法
基础设置流程
- 启用APV系统 :
- 在URP配置文件中(LightProbeSystem)选择APV选项
- 或通过代码:
LightProbeSystem.current = new AdaptiveProbeVolumeSystem();
- 创建探针体积 :
- 在场景中创建AdaptiveProbeVolume对象
- 调整其范围覆盖需要照明的区域
- 设置MinProbeSpacing控制最小探针密度(提高精度)
- 烘焙光照 :
- 打开Window > Rendering > Lighting面板
- 点击Generate Lighting进行烘焙
- 启用Skycclusion以获得环境光照影响
高级配置技巧
- 光源设置 :
- 将光源设置为混合或烘焙模式
- 确保动态物体不标记为Static
- 性能优化 :
- 使用Probe Volumes的流式加载功能减少内存占用
- 对移动物体采用"潜在可见集增量更新"策略
- 动态光照切换 :
- 通过Lighting Scenes实现昼夜循环等动态光照切换
- 使用脚本控制探针数据的加载/卸载
实际应用示例
示例1:室内场景光照设置
csharp
csharp
// 创建自适应探针体积
AdaptiveProbeVolume apv = new GameObject("APV_Indoor").AddComponent<ProbeVolumes>();
apv.minProbeSpacing = 1.5f;// 设置高密度探针间距
apv.bounds = new Bounds(transform.position, new Vector3(20, 10, 20));// 设置体积范围// 烘焙光照
LightProbeSystem.current.BakeProbes();
示例2:开放世界流式加载
csharp
csharp
// 设置流式加载参数
AdaptiveProbeVolumeSystem system = LightProbeSystem.current as AdaptiveProbeVolumeSystem;
system.streamingDistance = 100f;// 设置流式加载距离
system.streamingPriority = 0.8f;// 设置加载优先级// 动态加载/卸载探针数据
void OnEnable() {
system.LoadProbesInRange(transform.position, 50f);
}
void OnDisable() {
system.UnloadProbesInRange(transform.position, 50f);
}
常见问题解决方案
- 光照接缝问题 :
- 确保MinProbeSpacing设置合理,高变化区域增加探针密度
- 检查物体是否完全包含在探针体积范围内
- 性能优化 :
- 使用Probe Volumes的流式加载功能
- 对静态物体使用光照贴图,动态物体使用APV
- 动态物体光照异常 :
- 确保动态物体不标记为Static
- 检查探针体积是否覆盖动态物体活动区域
URP中的光照探针实现示例
基本设置流程
- 创建光照探针组 :
- 在Hierarchy中右键 > Light > Light Probe Group。
- 或通过代码:
GameObject.AddComponent<LightProbeGroup>()
。
- 布置探针点 :
- 手动模式:在Scene视图中移动、添加或删除探针点。
- 自动模式:使用脚本根据场景几何自动生成探针布局。
- 烘焙光照 :
- 确保动态物体不标记为Static。
- 打开Window > Rendering > Lighting面板,点击Generate Lighting。
- 验证效果 :
- 选择动态物体,Scene视图会显示影响它的探针点(黄色连线)。
- 移动物体观察光照平滑过渡效果。
高级配置技巧
-
探针密度优化:
- 高变化区域(如墙角、门窗附近)增加探针密度。
- 开放空间减少探针数量以节省内存。
-
混合光照模式:
csharpcsharp // 在Shader中结合直接光和探针间接光 UnityLight light; light.color = _LightColor0.rgb * atten; light.dir = lightDirection; // 获取探针光照 light.indirect = ShadeSH9(float4(worldNormal,1)); // 最终光照计算 half4 c = UNITY_BRDF_PBS(albedo, specular, oneMinusReflectivity, smoothness, worldNormal, viewDir, light, indirectLight);
-
性能优化:
- 使用Light Probe Proxy Volume处理大型动态物体。
- 启用Probe Volumes的流式加载功能减少内存占用。
与传统光照探针的对比
特性 | URP探针体积 | 传统Light Probe Group |
---|---|---|
生成方式 | 自动基于几何密度生成 | 手动放置 |
采样精度 | 每像素8探针采样,无接缝 | 按物体插值,可能产生接缝 |
内存管理 | 自适应优化,支持流式加载 | 固定密度,内存占用不可控 |
适用场景 | 大开放世界、动态物体 | 小型场景、静态布局 |
光照探针技术是Unity URP管线中实现高质量动态光照的关键组件,通过合理配置可以显著提升场景的视觉一致性和运行效率
【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)