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

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

相关推荐
nnsix14 小时前
Unity 贴图压缩格式 笔记
笔记·unity·贴图
ysn111111 天前
搭建状态同步框架的实践心得
unity·架构
weixin_441940011 天前
【Unity教程】使用vuforia创建简单的AR实例
unity·游戏引擎·ar
郝学胜-神的一滴1 天前
[简化版 GAMES 101] 计算机图形学 12:可见性与 Z‑Buffer 深度缓存
unity·godot·图形渲染·three.js·opengl·unreal
游乐码2 天前
Unity基础(十一 )资源同步加载
unity·游戏引擎
LONGZETECH2 天前
汽车仿真教学软件技术实现深度解析:从三维建模到学情数据闭环
c语言·3d·unity·架构·汽车
游乐码2 天前
unity基础(九)协程原理
unity·游戏引擎
winlife_2 天前
全程用 AI 做一款商业级手游 · EP0 立项:能做到吗、怎么做、边界在哪
人工智能·unity·ai编程·游戏开发·商业化·mcp·funplay
nnsix2 天前
Unity Texture2D的 Read/Write 选项
unity·游戏引擎
winlife_3 天前
全程用 AI 做一款商业级手游 · EP1 地基:先搭框架层,不急着写玩法
unity·ai编程·游戏架构·mcp·框架设计·funplay