Notifications
Article
实时光照
Published 17 days ago
15
0
实时光源在静态和动态游戏对象上产生光照并投射逼真的阴影。这些光源在阴影距离内投射阴影。
对于需要更改属性或在游戏过程中通过脚本生成的光源,请使用Realtime模式。Unity在运行时每帧计算并更新这些光源的光照。这些光源不会因为玩家所采取的动作或场景中发生的事件而更改。例如,您可以将这些光源设置为打开和关闭(如闪烁光源),更改其变换(如带着穿过暗室的火炬),或更改其视觉属性(如颜色和强度)。还可将实时光源与实时全局光照(实时 GI)组合在一起,从而为静态和动态游戏对象提供间接光照。

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

实时光照与实时GI的组合是Unity中最灵活且逼真的光照方案。要启用实时GI,请打开Lighting 窗口然后勾选Realtime Global Illumination。启用实时GI后,实时灯光将为场景提供直接照明和间接照明。对于变化缓慢且对场景有很高视觉影响的光源(例如在天空中移动的太阳),请使用此组合。对于变化很快的灯光或特殊效果,不需要使用实时GI,因为将会为系统带来较大开销。
与不太复杂的烘焙GI相比,实时GI将使用大量的系统资源。全局光照由Unity中的一个名为Enlighten的中间件进行管理;此中间件有其自身的开销(系统内存和CPU周期)。
实时GI适用于面向中端到高端PC系统的游戏以及面向PS4和Xbox One等最新款游戏主机的游戏。一些高端移动设备也可能足够强大到能够使用此功能,但应保持场景较小且实时光照贴图的分辨率较低,从而节省系统资源。
即使实时GI是根据每个场景针对所有实时光源启用的,仍然可以在实时GI中单独排除个别实时光源。要实现此目的,请将光源组件的Mode设置为Realtime,并将其间接乘数设置为 0,从而消除所有间接光贡献,这意味着该光源不会提供任何间接光。

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

  • 由于需要使用额外的一组低分辨率实时光照贴图来存储由Enlighten光照系统计算的实时间接反弹光线,因此增加了内存需求。
  • 由于需要采样额外的一组实时光照贴图并使用探针来存储由Enlighten光照系统计算的实时间接反弹光线,因此增加了着色器计算需求。
  • 间接光照会随着时间的推移而收敛,因此属性变化不能太突然。自适应HDR色调映射可能有助于隐藏此问题。

技术细节

对于实时光源,不会预先计算从表面到光源的最后一段发射光线(或路径段)。这意味着光源可在场景中移动,并改变颜色和强度等视觉属性。
如果光源也投射阴影,则场景中的动态和静态游戏对象都会渲染到光源的阴影贴图中。此阴影贴图由静态和动态游戏对象的材质着色器进行采样,以便它们相互投射实时阴影。阴影距离控制阴影开始淡出和完全消失的最大距离,从而影响性能和图像质量。
如果未启用实时GI,则实时光源仅计算动态和静态游戏对象上的直接光照。如果启用实时GI,则Unity将使用Enlighten预先计算静态游戏对象的表面到表面光路。
预计算实时GI模式:Unity仅预先计算表面到表面的信息。
最后一个路径段(即从表面到光发射器的路径段)不是预计算的一部分。存储的唯一信息是,如果表面接受光照,则随后的表面和探针也接受光照,还有各种光照的强度。有一组独立的低分辨率实时光照贴图由 Enlighten 在运行时使用实时光源的信息在 CPU 上进行迭代更新。因为这一迭代过程是计算密集型任务,所以分成多个帧。换句话说,此过程需要多个帧,直到光线完全反射到场景中的静态元素上,并且实时光照贴图和光照探针已经收敛到最终结果。
对于属性缓慢变化的光源(例如在天空中移动的发光的太阳),这不会造成问题。但是,对于属性快速变化的光源(例如闪烁的灯泡),实时GI的迭代特性可能证明不合适。属性快速变化不会明显记录到发射光系统中,因此将它们包含在计算中是没有意义的。
有几种方法可以解决这个问题。一种方法是降低实时光照贴图分辨率。因为这样做会使运行时计算量减少,所以光照会收敛得更快。另一种方法是为实时GI运行时增大CPU使用率设置。通过增加CPU时间,运行时收敛得更快。副作用当然是其他系统完成工作的CPU时间减少。这是否可以接受取决于每个项目。请注意,由于这是根据每个场景而定的设置,因此可根据项目中每个场景的复杂程度来专门指定或多或少的CPU时间。
Tags:
尹煜
北京宏宇航天技术有限公司Unity工程师 - Programmer
28
Comments