继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

SmalBox
关注TA
已关注
手记 47
粉丝 0
获赞 1

环境光的基本处理流程

CambientCambientCambient

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

主要环境光模型及实现

恒定环境光(Constant Ambient)

  • 实现原理‌:
    • KaTeX parse error: Expected 'EOF', got '环' at position 1: 环̲境光 = 环境光颜色 × 环境…
  • 最简单的环境光模型
  • 全局统一的环境光值
  • 不考虑任何空间变化

Unity URP应用‌:

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

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

  • 实现示例:

    hlsl
    half3 ambient = unity_AmbientSky * _AmbientScale;
    

球谐光照(Spherical Harmonics, SH)

实现原理‌:

  • 使用低阶球谐函数(通常3阶9系数)编码环境光
  • 在顶点着色器中重建环境光
  • 公式:
    • KaTeX parse error: Expected 'EOF', got '环' at position 1: 环̲境光 = Σ(球谐系数 × 基…

特点‌:

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

Unity URP选用方案‌:

  • URP默认环境光方案

  • 从Light Probe或Lightmap采样

  • 实现核心:

    hlsl
    half3 ambient = SampleSH(normalWS);
    

环境光遮蔽(Ambient Occlusion)

  • 实现原理‌:
    • KaTeX parse error: Expected 'EOF', got '有' at position 1: 有̲效环境光 = 基础环境光 × …
  • AO因子通过预计算或实时计算
  • 常见技术:
    • SSAO (屏幕空间AO)
    • HBAO (水平基准AO)
    • GTAO (地面真实AO)

Unity URP实现‌:

  • 内置SSAO后处理效果

  • 通过_MainLightOcclusionProbes控制

  • 实现示例:

    hlsl
    half ao = SampleAmbientOcclusion(positionCS);
    ambient *= ao;
    

反射探针(Reflection Probes)

实现原理‌:

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

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

  • 公式:

    KaTeX parse error: Expected 'EOF', got '镜' at position 1: 镜̲面环境光 = textureL…

Unity URP应用‌:

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

Unity URP的环境光系统架构

Low
Medium
High
环境光源
质量等级
恒定环境光
球谐光照+AO
反射探针+SH
光照合成
最终颜色

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


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

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP