全局光照是增强渲染真实感的有效方法,也是游戏引擎中不可缺少的一部分。Unreal 4和Unity引擎都分别支持了全局光照效果。在Unreal 4引擎中,全局光照烘焙采用的是Lightmass,而Unity 2017中则采用了Enlighten或Progressive。下图显示了Unreal 4引擎使用全局光照的渲染结果图。
Unreal4引擎全局光照渲染结果,取自Unreal 4美术博客[1]
全局光照的算法有多种,Unreal 4引擎中Lightmass采用的是Photon Mapping算法[2, 3],Unity引擎中Enlighten采用的是辐射度算法[4, 5]。由于辐射度算法主要针对的是漫反射表面,因此对于镜面反射表面Enlighten难以计算其对间接光照的影响。所以,Unity引擎在Shader中对于这部分间接光照提供了补偿方法,即“Meta Pass”。在Standard Shader中,自带有“Meta Pass”的定义。而对于自定义的Shader,如果需要使用Lightmap可以参考Standard Shader中的定义。Unreal 4引擎由于使用了Photon Mapping算法,则不需要考虑这一问题。
在接下来的内容中,本文将分两部分对Unreal 4引擎中的Lightmass全局光照系统的使用进行介绍,其中包括:静态物体全局光照、动态物体全局光照和阴影效果。在介绍的同时,本文也对Unity中的相应功能进行对比,从而让读者更好地对了解Unreal 4引擎中的全局光照功能。
本节主要介绍Unreal 4引擎中静态物体全局光照效果。其中主要包括:Color Bleeding和Ambient Occlusion。然后,将对Unreal 4引擎中影响全局光照烘焙质量和时间的参数进行说明。最后,介绍Unreal 4引擎中对相同场景使用多套全局光照烘焙效果的功能。
2.1 Color Bleeding
在Unreal 4和Unity引擎中,静态物体的全局光照效果都采用了Lightmap烘焙的方法。Lightmap其实是一张记录了静态物体光照信息的纹理。对于静态物体,其位置和几何形状都不会发生改变。在光源位置方向也不变的情况下,引擎可以对光线在漫反射材质表面多次反射的过程进行预计算,从而获得物体表面最终的间接光照信息。在实时计算时,只需要将纹理中对应位置的间接光照信息解析出来,并与直接光照一起参与计算,就可实现漫反射表面不同颜色物体之间相互辉映的效果,其也被称为Color Bleeding效果。
在Unreal 4引擎中烘焙静态全局光照,只需将物体的属性设置为Static,并且将光源设置成Stationary,然后点击Build进行烘焙即可,如下图所示:
烘焙结束后,在编辑器的Console页面会显示烘焙数据,主要反馈相应的烘焙耗时和内存使用,如下图所示:
然后编辑器中即可看到烘焙效果:
相应的,Unity引擎的全局光照系统Enlighten也同样支持Color Bleeding效果,其烘焙效果如下图所示:
当Lightmap烘焙好之后,还可以在Unreal 4和Unity引擎中查看Lightmap纹理贴图。在Unreal 4引擎中,可以在World Settings->Lightmaps页面中查看,在Unity引擎中可以在Lighting->Global maps页面中查看,如下图所示:
Unreal 4和Unity引擎的Lightmap都采用了HDR格式,烘焙过程也是采用HDR渲染。在默认情况下两者Lightmap都包含了Directional信息,但都支持关闭Directional。Unreal 4引擎可以通过Project Settings->Platforms设置,Unity中可以通过Lightmapping Settings->Directional Mode设置,如下图所示:
2.2 Ambient Occlusion
Unreal 4和Unity引擎的全局光照系统都支持世界空间Ambient Occlusion的烘焙。在Unreal 4中其设置是在World Setting的Lightmap中,此处相当于Unity引擎中的Ambient Occlusion功能(Lighting->Lightmappings Settings页面中) ,如下图所示:
下图显示了Unreal 4引擎中,关闭和开启世界空间AO的渲染效果:
2.3 烘焙质量与时间
在Unreal 4引擎中,除了通过Lightmass Importance Volume提高烘焙质量和效率外,还可以通过调整参数获得不同质量的烘焙效果。Unreal 4引擎的World Settings中提供了一系列参数控制烘焙的质量,如下图所示,其中红框处的参数是对烘焙时间产生影响的重要参数。
通常情况下,质量越高对应烘焙的时间越长,对此,本文针对上述参数的不同设置进行了实验,对烘焙时间进行了统计,从而来说明这些参数对于烘焙效果的影响。其中Lighting Quality采用了Production等级,场景如下图所示:
下表显示了不同参数设置的烘培时间以及效果图:
表1:不同烘焙参数下的场景烘焙时间比较
- Static Lighting Level Scale 该参数表示了Irradiance Caching时的Recording Radius大小。它主要用于调节间接光照的精度,数字越小精度越高,同时带来的瑕疵也越多。其对预计算时间的影响较大,精度越高需要的预计算时间越长。表1中第一行和第二行数据则为不同Static Lighting Level Scale的烘焙时间比较,可以看出,该参数对于烘焙时间的影响较大。
- Num Indirect Lighting Bounces 该参数表示了Photon Reflections的次数,次数越高间接光的亮度越高。但随着次数的增加,效果的变化程度递减。其对预计算时间的影响较小。表1中第一行和第三行数据则为不同Num Indirect Lighting Bounces,可以看出,当间接光反射次数增大时,场景的烘焙时间略有提升。
- Indirect Lighting Quality 该参数表示了Final Gathering阶段的光线数目, Final Gathering阶段的作用是在最后计算Irradiance Caching 时,增加第一次Bounce的采样,如果不使用Final Gather,则第一次Bounce是Photon的反射,使用Final Gather则是Ray Trace的反射。增大其数值能够较少烘焙瑕疵,因此,其对预计算时间的影响很大。表1中第一行和第四行数据则为不同Indirect Lighting Quality的烘焙效果,从表中可以看出,Final Gathering阶段的光线采样数对烘焙时间影响很大,测试场景的烘焙时间增加了整整一倍时间。
- Indirect Lighting Smoothness 该参数表示了在计算Irradiance Caching 时对Photon进行插值的比例(Interpolation ratio)。该数值越大,间接光照越平滑。其对预计算时间的影响较小。表1中第一行和第五行数据则为不同Indirect Lighting Smoothness的烘焙效果,从表中可以看出,其对于烘焙时间没有特别影响,时间几乎没有增加。
2.4 Lighting Scenarios
在游戏制作过程中,有时会存在同一场景使用多套Lightmap的情况,如:模拟天气系统,以及一天中不同时段的光照等。在Unreal 4引擎中,可以利用Lighting Scenarios功能达到此效果。使用Lighting Scenarios时,首先需要创建不同的光照Level,然后在Level设置页面将其设置为Lighting Scenario类型,如下图所示:
另外,设置Level的加载方式为使用Blueprint加载:
接着,对不同Level设置不同的光照进行烘焙。烘焙结束后,在Persistent Level Blueprint中,添加Load Stream Level节点对Level进行加载,并设置要加载的Level名称Day,如下图所示:
当需要切换到夜晚的全局光照烘焙效果时,可使用该节点加载Night Level即可。渲染结果如下图所示,上下两图分别是白天和晚上的光照效果。
小结:清晰的操作界面让Unreal 4引擎的烘焙功能足够简单、易用,其烘焙效果也十分惊艳,大家可以从上述的渲染效果种直接看到。但从我们的使用上来看,目前的烘焙效果是一次性计算完成,如果后续可以加入Progressive的烘焙方式,则会更加完美。
对于动态物体全局光照,Unreal 4采用了在空间中分布光照探针,在烘焙时预计算间接光照,并利用PRT(Pre-computed Radiance Transfer)算法[6, 7]将光照信息用球面调和函数(Spherical Harmonics)进行存储。在实时光照计算时,再利用球面调和函数快速计算光照与材质的卷积得到间接光照效果。如果大家对于上述词汇比较陌生,那么大家可以想象Unity引擎中的Light Probe,这两种功能从本质上来说是一致的。目前,Unreal 4和Unity引擎中都使用了三阶球协函数进行表示。
在Unreal 4引擎中,提供了两种不同的方法渲染动态物体间接光照,ILC(Indirect Lighting Cache)和VLM(Volumetric Lightmap)。
3.1 ILC vs VLM
ILC是Unreal 4引擎4.18版本之前主要使用的方法。该方法会在场景中所有Static物体的上方设置了一系列光照探针。VLM是Unreal 4引擎在4.18以后新推出的方法。该方法不仅在Static物体表面,而且在空间中也设置了光照探针,如下图所示:
本节将介绍Unreal 4引擎中的阴影效果,其中主要包括:Masked Shadow、面光源和半透明物体的阴影效果。
4.1 Masked Shadow
Unreal 4引擎对于树叶等使用Alpha Test方法渲染的物体的阴影能很好地渲染。通常情况下,采用Alpha Test渲染的物体都是在场景中渲染一个方形平面,然后在Shader中根据纹理的Alpha值来判断是否渲染某一像素,最后的渲染结果就会呈现出纹理中的形状。对于此类物体,Unreal 4引擎能很好地渲染出纹理中形状的阴影,如下图所示,其中,Unreal 4引擎的Shadow Map Texture Size为1024。
4.2 Area Light Shadow
Unreal 4引擎对静态物体阴影,在不开启Cascade Shadow Map的情况下,使用了一种叫做Signed Distance Field Shadow Map的方法进行渲染。它支持根据面光源的大小渲染出不同锐利程度的阴影。面积越小的光源其烘焙的阴影边缘越锐利,面积越大的光源其烘焙的阴影边缘越模糊,如下图所示:
其中,上下两图分别是Directional Light Area为1和3的渲染结果,其边缘模糊的柔和感非常自然。
4.3 Translucent Shadow
Unreal 4引擎对于半透明物体的阴影能够渲染出半透明影子的效果。该阴影效果只支持静态阴影,因此需要光源设置成Static,如下图所示:
Unreal 4引擎提供了完整的工具链来支持静态和动态物体的全局光照效果。在计算全局光照时采用了Photon Mapping算法,通过不同的参数设置可以达到不同质量的全局光照效果。Unreal 4引擎提供了同一场景使用不同全局光照设置的功能Light Scenarios,支持在不同全局光照效果进行切换。同时,其4.18版本提供了新的动态物体全局光照方法,该方法比之前的方法能够获取更精确的间接光照信息,并且对Fog等环境产生间接光照效果。另外,Unreal 4引擎提供了一些特殊阴影效果,如:Alpha Test的阴影,面光源阴影以及半透明阴影,其阴影边界的处理也是十分自然。Unreal 4引擎对于光影细节的处理和新功能所带来的强大效果,让我们在学习和使用过程中深感震撼。
参考文献
[1] https://80.lv/articles/carylitz-tamez-ue4-student-work/
[2] http://graphics.ucsd.edu/~henrik/papers/photon_map/global_illumination_using_photon_maps_egwr96.pdf
[3] http://www.cs.cornell.edu/courses/cs667/2005sp/studentSlides/01law.pdf
[4] http://brahms.di.uminho.pt/discip/MCGAV/ifr0304/Artigos/Hanrahan91-HierarchicalRadiosity.pdf
[5] http://www.students.science.uu.nl/~3220516/advancedgraphics/papers/glossy_radiosity.pdf
[6] https://blog.uwa4d.com/archives/Study_PRT.html
[7] https://blog.uwa4d.com/archives/Study_Haar.html
以上即为UWA团队对Unreal 4引擎就渲染模块之全局光照明的讲解,之后我们将继续分享Unreal 4引擎中其他模块的学习心得,欢迎大家的关注!我们希望本系列文章能让更多的中国游戏开发者了解和理解Unreal 4引擎的重要功能和所能达到的效果,也让更多的中国游戏开发者对Unreal引擎和Unity引擎融会贯通,提升技术储备。