【从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 TDA[环境光源] --> B{质量等级}B -->|Low| C[恒定环境光]B -->|Medium| D[球谐光照+AO]B -->|High| E[反射探针+SH]C --> F[光照合成]D --> FE --> FF --> 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开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)
本文由博客一文多发平台 OpenWrite 发布!