UPL9-14——光照探针

光照探针

上一篇提到的光照烘焙,主要是为静态物体服务的,静态物体的光照信息直接烘焙进了光照贴图中
而动态物体由于自身会不停移动,受光影响的结果是不能直接烘焙进贴图的,所以烘焙光照无法作用于动态物体上
如果需要让动态物体收到直接光照,可以将光源改为 Mixed 模式,不过动态物体依然不能受到间接光的影响

而光照探针(Light Probe)可以用于解决 烘焙光源产生的间接光不能作用于动态物体 的问题,它让动态物体在场景中通过插值获得周围环境的间接光信息

间接光照(Indirect Lighting)是由光线在场景中经过一次或多次反射后,再照射到物体表面的光照

举例:

  • 灯直接照在桌面上为 直接光照
  • 桌面反射的光线照亮了墙壁、天花板为 间接光照
  • 墙壁又反射出微弱的光照亮房间阴暗处为 多次间接光照

注意

光照探针只会烘焙间接光,这就意味着,如果一个动态物体希望受到某个光源(比如点光源)的直接光影响,那么我们需要将该光源设置为混合(Mixed)光源!
这样对于动态物体来说,该光源对它的直接光照,通过实时计算表现而间接光照通过光照探针计算
这样光照探针就优化了关于间接光照的表现和计算,而直接光源还是在 Shader 当中计算出颜色表现!

对于动态物体:

  1. 想要受光源直接光 → 光源设为 Mixed 或 Realtime
  2. 想要受间接光 → 启用 Light Probe

了解这一点非常重要,这样我们就可以根据我们的实际需求进行取舍!
光照探针只是间接光照的优化方案,用于让动态物体获得逼真的环境光效果,而无需实时全局光照计算。
不用再让 CPU / GPU 实时计算复杂的光线反射了!

例如如下场景:

image

添加探针并在场景中烘焙光照后,动态移动对象将根据场景中最近的探针接收间接光:

image

光照探针(Light Probe)的原理

  1. 烘焙阶段

    在场景中放置多个光照探针点,Unity 会对每个光照探针点计算来自周围的光照方向和强度分布
    这些光照数据不是用贴图存储,而是存储为 球谐函数(Spherical Harmonics, SH)系数

    球谐函数(Spherical Harmonics):

    是一族由同一个通用公式定义出来的函数,是一个模板公式,通过不同的参数生成许多具体的函数
    在图形学中的作用是把球面方向上的光照分布用有限个系数(基函数)近似表示出来
    利用球谐函数,我们能够根据表面法线方向,计算出该方向上的环境光照颜色

  2. 运行阶段

    对于每个动态物体,Unity在空间中找到它附近的光照探针
    根据物体所在位置,对这些光照探针的数据进行三维插值
    将插值计算得到的光照应用到物体上,模拟出真实的光照环境

总结:在场景中预先采样并用球谐函数记录各点的环境光分布,运行时通过插值这些数据让动态物体获得逼真的间接光照

优点:

  1. 几乎零运行时成本(插值 + Shader 乘法)
  2. 光照平滑过渡
  3. 能与烘焙光照无缝结合

缺点:

  1. 无法产生阴影(只是光照颜色变化)
  2. 光照数据是静态的(烘焙时固定)
  3. 探针过少时容易出现亮度跳变

光照探针(Light Probe)的使用

  1. 在场景中创建 Light Probe Group(光照探针组)

    场景上会出现很多黄色小球,一个小球就是一个探针点

    在 Hierarchy 窗口内右键选择 Light —— Light Probe Group 即可创建

    image

  2. 在 Scene 窗口中编辑探针点的位置

    注意:好的间接光表现,需要好的 Light Probe 布局,一般大场景中,光照探针点会有非常多!

    Unity 2022 版本以前需要在 Inspector 窗口内开启光照探针编辑:

    image

    • Show Wireframe:显示线框
    • Remove Ringing:消除振铃(默认开启即可)
    • Selected Probe Position:选定的探针位置,可以编辑位置
    • Add Probe:添加探针
    • Select All:全选探针
    • Delete Selected:删除选择的探针
    • Duplicate Selected:复制选择的探针

    Unity 6 版本后需要在 Scene 窗口内选择编辑光照探针模式:

    image

    两个版本的编辑选项都是一致的,这里不再阐述

  3. 编辑好后,在 Lighting 窗口中烘焙

    具体烘焙步骤和参数可见:UPL9-13——光照烘焙

    image

  4. 动态物体需要将其 Renderer 组件上的光照探针设置为 Blend Probes(混合探针)

    image

  5. 验证测试效果

    假设存在一个场景,平行光是 Mixed 光源,红色点光源是 Baked 光源,绿色点光源是 Realtime 光源,球体是动态物体,其他物体全都勾选 Contribute GI

    使用光照探针前:

    image

    使用光照探针后:

    image

    可以看到,球体收到的红色点光源的间接光影响,球体的颜色显然变红了(不过球体并没有受到红光的直接光关照,这是因为红色点光源不是 Mixed 光源)

布局主要思想:让光照探针足够密集地分布在光照变化明显的区域,以便动态物体在移动时获得平滑、准确的插值结果

尽量满足以下 3 点:

  1. 覆盖动态物体活动区域
  2. 在光照变化剧烈处密集
  3. 保持空间分布均匀、连续、不过度重叠