Version: 2017.3
光照:技术信息和术语
混合光照

实时光照

实时光源是 Mode 属性设置为 Realtime光源组件

对于需要更改属性或在游戏过程中通过脚本生成的光源,请使用 Realtime 模式。Unity 在运行时每帧计算并更新这些光源的光照。这些光源不会因为玩家所采取的动作或场景中发生的事件而更改。例如,您可以将这些光源设置为打开和关闭(如闪烁光源),更改其变换(如带着穿过暗室的火炬),或更改其视觉属性(如颜色和强度)。

实时光源在静态和动态游戏对象上产生光照并投射逼真的阴影。这些光源在__阴影距离 (Shadow Distance)(在 Edit__ > Project Settings > Quality 中定义)内投射阴影。

还可将实时光源与__实时全局光照__(__实时 GI__)组合在一起,从而为静态和动态游戏对象提供间接光照。

实时光照与实时 GI 结合使用

实时光照与__实时 GI__ 的组合是 Unity 中最灵活且逼真的光照方案。要启用实时 GI,请打开 Lighting 窗口(菜单:__Window__ > Lighting > Settings__),然后勾选 Realtime Global Illumination__。

启用__实时 GI__ 后,实时光源会为场景提供间接光照以及直接光照。如果光源会缓慢变化并对场景具有很高的视觉影响(例如在天空中移动的太阳,或者在封闭的走廊中缓慢闪烁的光源),请使用此组合方案。对于快速变化的光源或对于特殊效果,不需要使用__实时 GI__,因为系统的延迟使这样的开销不值得。

请注意,与不太复杂的__烘焙 GI__ 相比,__实时 GI__ 将使用大量的系统资源。全局光照由 Unity 中的一个名为 Enlighten 的中间件进行管理;此中间件有其自身的开销(系统内存和 CPU 周期)。请参阅有关全局光照的文档以了解更多信息。

实时 GI 适用于面向中端到高端 PC 系统的游戏以及面向 PS4 和 Xbox One 等最新款游戏主机的游戏。一些高端移动设备也可能足够强大到能够使用此功能,但应保持场景较小且实时光照贴图的分辨率较低,从而节省系统资源。

要禁用__实时 GI__ 对特定光源的影响,请选择光源游戏对象,然后在光源组件中将 Indirect Multiplier 设置为 0。这意味着该光源不会提供任何间接光。要完全禁用__实时 GI__,请打开 Lighting 窗口(菜单:__Window__ > Lighting > Settings__),然后取消勾选 Realtime Global Illumination__。

实时光照与实时 GI 结合使用的缺点

  • 由于需要使用额外的一组低分辨率实时光照贴图来存储由 Enlighten 光照系统计算的实时间接反弹光线,因此增加了内存需求。

  • 由于需要采样额外的一组实时光照贴图并使用探针来存储由 Enlighten 光照系统计算的实时间接反弹光线,因此增加了着色器计算需求。

  • 间接光照会随着时间的推移而收敛,因此属性变化不能太突然。自适应 HDR 色调映射可能有助于隐藏此问题;要了解更多信息,请参阅 Unity 后期处理栈 (Asset Store)。

技术细节

对于实时光源(即 Mode 设置为 Realtime 的光源组件),不会预先计算从表面到光源的最后一段发射光线(或路径段)。这意味着光源可在场景中移动,并改变颜色和强度等视觉属性。请参阅在 Unity 中使用 Enlighten (Using Enlighten in Unity) 的相关文档,了解有关路径段的更多信息。

如果光源也投射阴影,则场景中的动态和静态游戏对象都会渲染到光源的阴影贴图中。此阴影贴图由静态和动态游戏对象的材质着色器进行采样,以便它们相互投射实时阴影。阴影距离 (Shadow Distance)(菜单:__Edit__ > Project Settings > Quality > __Shadows__)控制阴影开始淡出和完全消失的最大距离,从而影响性能和图像质量。

如果未启用__实时 GI__,则实时光源仅计算动态和静态游戏对象上的直接光照。如果启用__实时 GI__,则 Unity 将使用 Enlighten 预先计算静态游戏对象的表面到表面光路。

预计算实时 GI (Precomputed Realtime GI) 模式:Unity 仅预先计算表面到表面的信息

最后一个路径段(即从表面到光发射器的路径段)不是预计算的一部分。存储的唯一信息是,如果表面接受光照,则随后的表面和探针也接受光照,还有各种光照的强度。有一组独立的低分辨率实时光照贴图由 Enlighten 在运行时使用实时光源的信息在 CPU 上进行迭代更新。因为这一迭代过程是计算密集型任务,所以分成多个帧。换句话说,此过程需要多个帧,直到光线完全反射到场景中的静态元素上,并且实时光照贴图和光照探针已经收敛到最终结果。

对于属性缓慢变化的光源(例如在天空中移动的发光的太阳),这不会造成问题。但是,对于属性快速变化的光源(例如闪烁的灯泡),__实时 GI__ 的迭代特性可能证明不合适。属性快速变化不会明显记录到发射光系统中,因此将它们包含在计算中是没有意义的。

有几种方法可以解决这个问题。一种方法是降低实时光照贴图分辨率。因为这样做会使运行时计算量减少,所以光照会收敛得更快。另一种方法是为__实时 GI__ 运行时增大 CPU 使用率 (CPU Usage) 设置。通过增加 CPU 时间,运行时收敛得更快。副作用当然是其他系统完成工作的 CPU 时间减少。这是否可以接受取决于每个项目。请注意,由于这是根据每个场景而定的设置,因此可根据项目中每个场景的复杂程度来专门指定或多或少的 CPU 时间。

即使__实时 GI__ 是根据每个场景针对所有实时光源启用的,仍然可以在__实时 GI__ 中单独排除个别实时光源。要实现此目的,请将光源组件的 Mode 设置为 __Realtime__,并将其间接乘数 (indirect multiplier) 设置为 0,从而消除所有间接光贡献。


  • 2017–06–08 页面已发布并只进行了有限的编辑审查

  • 在 5.6 版中添加了“光照模式”

光照:技术信息和术语
混合光照