Unity有机会与Armature和Microsoft Game Studios一起合作开发Xbox One及Windows平台的游戏《ReCore》,这个过程中对于Unity 5控制台开发的深入探索也让我们大开眼界。

未来的几个月我们将分享多处改善和功能的深刻观点,以及如何将所学内容融入引擎的计划。今天主要分享Unity 5.4是如何帮助实现《ReCore》的全局光照解决方案的。首先来看一张《ReCore》的截图:
 


Unity支持多种计算场景全局光照的方法。其中一种是为场景中的表面使用Enlighten来烘培包含全局光照信息的光照贴图。另一种方法是将全局光照信息烘焙到光照探针中。这两个系统可以结合使用来实现场景中的不同效果。光照贴图适用于大的静态对象,光探针则适用于动态对象。对于大型的室外场景,光照贴图会比光照探针消耗更多的内存。Armature希望全局光照系统的烘培时间很短,并且烘培光照贴图不增加额外的内存开销。为了实现这个目标,我们开发了一个全局光照系统,它可以通过捕捉探针位置的Cubemap将反射光烘焙到Unity光照探针中。然后光照探针将作为场景中所有对象的全局光照的唯一来源。然而,使用Unity的光照探针系统为大的环境对象提供全局光照时会导致不同对象的光照不一致。

本文将讨论在《ReCore》中使用Unity 5.4的新功能光照探头代理体 (LPPV)解决这个问题的过程,并分享一些最佳实践。想知道什么是LPPV以及如何使用它们?请阅读我们之前的文章

在《ReCore》中使用光照探针的问题

Unity光照探针系统基于对象的世界坐标为对象指派光探针。如果一个对象离多个光照探针都很近,那么光照的效果将混合这些光照探针。对于小的动态对象如角色,这个效果很好。然而,对于能覆盖大区域的大对象来说,这个系统会导致结果不一致,因为插入对象锚点处的单个光照探针会用于为整个对象着色。理论上,您需要逐像素对光照探针插值以获得较好的位置相关的梯度来为对象着色。这在光照变化明显的大对象的表面上特别明显。《ReCore》中的效果如下图1:
 

 
图#1 – 光照探针全局光照


在图1中,红框区域明显接受了不一样的全局光照,看起来不对。为了获得一致的光照,需要一种将全局光照效果平滑地应用到对象表面的方法。LPPV可以解决这个问题。

在《ReCore》中设置LPPV

在Unity中,LPPV可以作为组件被附加在任何带有MeshRenderer组件的对象上,或者MeshRenderer组件可以被强制使用场景中特定的LPPV。

为每个渲染器附加不同的LPPV是不切实际的,这将导致内存消耗过度,还会导致对象之间的光照不一致。《ReCore》就使用单一LPPV来覆盖关卡的大部分区域,多个渲染器共享相同的LPPV。LPPV作为组件被添加到Light Probe Groups(光照探针组)及自定义脚本,脚本用于将MeshRenderer指定到包含该MeshRenderer的LPPV。我们发现,按照网格模式布置光探针可以获得较好的结果,并写了一些自定义脚本来自动执行这一过程。这是《ReCore》关卡中典型的LPPV设置的俯视图:
 


光照探针组和典型的网格渲染器在编辑器中的设置如下:
 

 


结论

在艺术家设置好LPPV并烘焙完光照之后,全局光照的结果将更加一致,如下图2:


 
图2 – 使用了LPPV的全局光照



在图2中,您可以看到红框区域全局光照的作用更加一致。全局光照对大型岩石结构的作用也更加平滑。《ReCore》中的光照是静态的,而且LPPV更新的开销仅限于它们加载的时候。这将使用LPPV的CPU开销维持在了最低状态。而且,传送到GPU的LPPV纹理也很小,只在g-buffer传递时增加了3个纹理样本,总体上说对GPU时间的影响几乎察觉不到。

Unity 5.4和LPPV使得《ReCore》的自定义全局光照解决方案在不牺牲质量的情况下得以解决。敬请关注我们获取关于使用Unity开发《ReCore》的其它技术亮点。

锐亚教育