【光照】[环境光ambient]以UnityURP为例

【从UnityURP开始探索游戏渲染】专栏-直达

环境光的基本处理流程

Cambient

  • 环境光采集‌:获取场景环境光照信息
  • 环境光遮蔽‌:计算环境光遮挡关系
  • 环境光反射‌:根据材质属性反射环境光
  • 环境光混合‌:与其他光照成分合成最终颜色

主要环境光模型及实现

恒定环境光(Constant Ambient)

  • 实现原理 ‌:
    • 环境光 = 环境光颜色 × 环境光强度
  • 最简单的环境光模型
  • 全局统一的环境光值
  • 不考虑任何空间变化

Unity URP应用‌:

  • 早期移动设备的基础方案

  • 在URP中作为最低质量级别选项

  • 实现示例:

    c 复制代码
    hlsl
    half3 ambient = unity_AmbientSky * _AmbientScale;

球谐光照(Spherical Harmonics, SH)

实现原理‌:

  • 使用低阶球谐函数(通常3阶9系数)编码环境光
  • 在顶点着色器中重建环境光
  • 公式:
    • 环境光 = Σ(球谐系数 × 基函数(N))

特点‌:

  • 低频光照近似
  • 内存占用小(每个顶点9个float)
  • 计算成本低

Unity URP选用方案‌:

  • URP默认环境光方案

  • 从Light Probe或Lightmap采样

  • 实现核心:

    c 复制代码
    hlsl
    half3 ambient = SampleSH(normalWS);

环境光遮蔽(Ambient Occlusion)

  • 实现原理 ‌:
    • 有效环境光 = 基础环境光 × AO因子
  • AO因子通过预计算或实时计算
  • 常见技术:
    • SSAO (屏幕空间AO)
    • HBAO (水平基准AO)
    • GTAO (地面真实AO)

Unity URP实现‌:

  • 内置SSAO后处理效果

  • 通过_MainLightOcclusionProbes控制

  • 实现示例:

    c 复制代码
    hlsl
    half ao = SampleAmbientOcclusion(positionCS);
    ambient *= ao;

反射探针(Reflection Probes)

实现原理‌:

  • 预先生成立方体贴图(Cubemap)

  • 根据表面粗糙度进行模糊采样

  • 公式:

    镜面环境光 = textureLod(cubemap, R, roughness \* MAX_MIP_LEVEL)

Unity URP应用‌:

  • 高质量环境反射方案
  • 支持混合探针和平面反射
  • 实现核心:
c 复制代码
hlsl
half3 reflection = GlossyEnvironmentReflection(
    reflect(-viewDir, normalWS),
    perceptualRoughness,
    ao
);

Unity URP的环境光系统架构

graph TD A[环境光源] --> B{质量等级} B -->|Low| C[恒定环境光] B -->|Medium| D[球谐光照+AO] B -->|High| E[反射探针+SH] C --> F[光照合成] D --> F E --> F F --> G[最终颜色]

URP环境光混合策略

c 复制代码
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%

实际项目建议

移动端优化‌:

c 复制代码
hlsl
// 简化环境光计算
half3 ambient = unity_AmbientSky * occlusion;

开放世界游戏‌:

csharp 复制代码
csharp
// 使用混合探针
reflectionProbe.blendDistance = 10.0f;
reflectionProbe.mode = ReflectionProbeMode.Blended;

室内场景‌:

c 复制代码
hlsl
// 增强AO效果
ambient *= pow(occlusion, _AOPower);

Unity URP的环境光系统通过分层架构实现了跨平台的高效渲染,在保持物理合理性的同时,针对不同硬件能力提供最优解决方案。这种灵活的设计使开发者能够在各种项目规模中取得理想的视觉效果与性能平衡。


【从UnityURP开始探索游戏渲染】专栏-直达

(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)

相关推荐
一步一个foot-print11 小时前
【Unity】Light Probe 替代点光源给环境动态物体加光照
unity·游戏引擎
@LYZY12 小时前
Unity 中隐藏文件规则
unity·游戏引擎·游戏程序·vr
霜绛14 小时前
C#知识补充(二)——命名空间、泛型、委托和事件
开发语言·学习·unity·c#
Sator117 小时前
使用Unity ASE插件设置数值不会生效的问题
unity·游戏引擎
程序猿追19 小时前
轻量级云原生体验:在OpenEuler 25.09上快速部署单节点K3s
人工智能·科技·机器学习·unity·游戏引擎
B0URNE19 小时前
【Unity基础详解】(7)Unity核心:动画系统
unity·游戏引擎
我的golang之路果然有问题19 小时前
mac M系列芯片 unity 安装会遇到的错误以及解决
经验分享·学习·macos·unity·游戏引擎
Hody912 天前
【XR开发系列】2025 年 XR 开发入门,我该选择 Unity 还是 Unreal Engine?
unity·xr·虚幻
DvLee10242 天前
UnityGLTF 材质创建与赋值流程
unity·材质
HahaGiver6662 天前
从0到1做一个“字母拼词”Unity小游戏(含源码/GIF)- 字母拼词正确错误判断
unity·游戏引擎·游戏程序