【光照】[环境光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开始探索游戏渲染】专栏-直达

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

相关推荐
mxwin6 小时前
Unity Shader 渲染队列 (Render Queue):控制 Geometry、Transparent、Overlay 等队列确保半透明物体渲染正确
unity·游戏引擎
mxwin6 小时前
Unity Shader Alpha Test 与 Alpha Blend:透明度测试与混合的实现及排序问题
unity·游戏引擎
小贺儿开发6 小时前
Unity3D 拼图互动游戏
游戏·unity·人机交互·2d·拼图·互动
mxwin7 小时前
Unity Mask 贴图:用一张纹理的 RGBA 通道分别控制 PBR 材质参数
unity·材质·贴图
FairGuard手游加固8 小时前
FairGuard支持HybridCLR热更DLL加密
游戏·unity·游戏引擎
海海不瞌睡(捏捏王子)8 小时前
Unity GUI优化
unity·游戏引擎
心前阳光10 小时前
Unity之Luban表格配置
unity
mascon11 小时前
unity mcp 使用
unity·游戏引擎
心前阳光12 小时前
Unity之语音提问,语音答复
unity·游戏引擎
mxwin13 小时前
Unity Shader UV 坐标与纹理平铺Tiling & Offset 深度解析
unity·游戏引擎·shader·uv