虚幻引擎学习之路:渲染模块之光照系统

虚幻引擎学习之路:渲染模块之光照系统

写在前面

“UWA什么时候可以支持Unreal引擎?”
这是我们最近在拜访各大游戏团队时,经常被问到的一个问题。其实,早在几个月前,我们内部就已经开始了针对Unreal引擎的学习(只敢说是学习,还不敢说是研究。任何一款引擎都很博大精深,几个月的时间,我们只能说仅是了解了它的皮毛而已),在学习的过程中,我们逐渐产生了以下两点体会:

(1) Unreal引擎和我们熟悉的Unity引擎,在很多功能特点和操作手法上都较为相似。通过与Unity引擎进行类比,让我们可以快速掌握Unreal的功能使用,我们本以为是从零开始学习,但其实进度远超我们的预期;

(2) Unreal引擎(确切地说,是Unreal Engine 4)的学习门槛远没有我们想象中的“那么高”。相反的,我们觉得它在很多地方都和Unity引擎一样操作简单、易于上手。

所以,从今天开始,我们准备将我们内部学习过的Unreal相关技术文档进行总结和整理,并陆续发布出来以方便中国更多的游戏开发者和引擎爱好者对Unreal引擎进行了解和学习。

我们计划发布两大系列文章,第一个系列是功能篇,主要讲述我们学习过程中所了解到的Unreal引擎功能特色;第二个系列是性能篇,重点分析Unreal引擎在多个平台(特别是移动平台)上的性能效率。与其他世面文章不同的是,我们会在讲解中揉入和Unity引擎相似功能的对照说明,以方便大家更快地对其进行理解和掌握。这里,需要郑重说明的是,我们之所以这么做并不是为了比较Unreal引擎和Unity引擎谁更强大,二者都是当今世界上伟大的引擎。我们这么做是因为发现这可以极大地提高对于Unreal引擎的学习效率。

我们内部是这样学习Unreal引擎的:每个人各司其职,分别负责学习Unreal引擎的某一模块。但在我们内部进行分享时,如果分享者仅是纯粹介绍Unreal引擎的某一功能,其他人往往觉得内容冗长又抓不住重点。而如果对照Unity引擎来讲解反倒是可以让其他人快速领会。比如,这一模块下有哪些功能,分别跟Unity引擎的哪些功能点类似,相同的是什么,不同的是什么。简单几句,其他人虽然没有碰过Unreal这个模块,但也对其了然于胸了。这种方式可以让我们快速了解和掌握Unreal引擎,因此,我们将其分享,希望也可以对你有所帮助。

我们会在接下来的几周陆续发布Unreal引擎功能篇相关的技术学习文章,重点围绕引擎中各模块的功能特点进行介绍,主要包括:渲染、动画、物理、音频以及UI等模块。对于编辑器的使用以及其中具体参数设置,本系列文章仅选择部分常用和重要的进行介绍。如果读者感兴趣,可以参考Unreal官方文档【1】进行详细了解。

同时,我们也要特别感谢Unreal中国团队对于本篇文章中Unreal引擎相关内容的审核,并在我们学习其引擎的道路上提供了大力支持。


渲染模块之光照系统

我们准备从三方面来介绍Unreal 4引擎的渲染模块,主要包括:光照系统,材质系统和图像后处理。本篇文章重点讲解第一部分:光照系统。

在对比Unreal 4与Unity两者引擎时,本文分别采用的版本是Unreal 4 4.16和Unity 2017.1.1。

本节将介绍Unreal 4引擎的光照系统。在介绍基础功能时,本文将分四块进行介绍,主要包括:光源、全局光照、阴影以及反射效果。同时,本文将与Unity引擎中的这些功能进行对比。另外,对于Unreal 4引擎中的特殊功能,本文将单独介绍。


一、光源

光源对于游戏引擎的光照系统来说是最为基础的功能模块。游戏渲染中光照计算的每一部分都离不开光源。通常游戏引擎通过三个重要属性对光源进行了分类:光源类型、实时性以及渲染管线。对于不同属性的光源,其光照计算方式和复杂度都有所不同。在接下来的内容中,本文将对Unreal 4和Unity引擎的光源在这三个方面进行比较。

1、光源类型
Unreal 4引擎中,可在场景中创建的光源类型有四种:方向光、点光源、聚光灯和天空光。

创建方式跟Unity类似,只需通过在Unreal 4地图编辑器中点击左上角的“Modes”页面,选择“Lights”标签,即可在其子菜单中选择需要的光源拖放的场景中,如下图所示:
请输入图片描述

Unity引擎支持的光源类型也是四种:方向光、点光源、聚光灯和面光源。

在Unreal 4和Unity引擎中都支持方向光、点光源以及聚光灯类型的光源。Unreal 4引擎中的点光源和聚光灯除了光源颜色、衰减等属性外,还多了“Source Radius”和“Source Length”属性等,如下图示:
请输入图片描述

这两个属性是用于设置光源的半径和长度,它们会对反射高光形状产生影响,如下图所示:
请输入图片描述

此外,Unreal 4引擎的光源设置中的“Min Roughness”属性会对反射高光的模糊度产生影响,如下图所示:
请输入图片描述

Unreal 4引擎的光源Radius参数还对预计算阴影产生影响。当Radius设置的越大,预计算阴影越软,如下图所示:
请输入图片描述

Unity引擎也支持面光源,并且目前仅支持静态烘焙光照。其大小不仅对预计算阴影有影响,也对光照强度有影响,如下图所示:
请输入图片描述

Unreal 4引擎中的天空光其作用是:自动获取远处的入射光信息,然后用于场景中物体的光照计算。远处的入射光信息涵盖了“Sky Distance Threshold”设置的距离以外的所有入射光来源,包括远景、天空盒、云雾等。它的实现方式是先将远处的入射光信息渲染到Cube Map中,然后使用这张Cube Map来计算光照。在Unity中也可以在Lighting设置中采用Sky Box作为环境光的输入,但是Unity没有将其作为单独可放入场景的光源。

2、实时性

在Unreal 4的光源属性中,有一项Mobility表示光源的可移动性以及光照计算实时性。它包含了三种类型:Static、Stationary以及Movable。它与Unity中光源类型的Static、Mixed、Realtime具有类似含义,如下图所示:
请输入图片描述

- Static光源在运行时不能被移动或修改,其所有光照信息,包括:直接光照、间接光照、阴影都是预计算存储在Lightmap中,这与Unity引擎的Baked光源一样。此外,光源的Radius会影响阴影的软硬程度,Radius越大阴影越软。

- Stationary光源在运行时不能被移动,但可以修改光照强度和颜色。其直接光照是实时计算,间接光照是预计算好的,阴影对于动态物体采用Shadow Map,对于静态物体则预计算好。其功能与Unity引擎中的Mixed类型光源类似。

- Movable光源在运行时可以被移动以及修改,但是它仅仅包含直接光照和阴影,并不包含间接光照。此外,为了减少实时阴影计算的时间开销,Unreal 4引擎对于这种类型光源的Shadow Map进行了缓存。当光源静止不动时,场景中静态物体的Shadow Map被保存下来下一帧继续使用。

3、渲染管线

Unreal 4引擎的光照系统是基于Deferred Rendering渲染管线进行构建的,许多材质以及光照的特殊功能依赖于该渲染管线。并且,在默认情况下,也是采用该渲染管线进行渲染。但是,Unreal 4引擎同样支持Forward Rendering管线进行渲染。在“Project Setting”->“Rendering”->“Forward Renderer”中勾选“Forward Shading”选项即可切换到该渲染管线。

Unreal vs Unity光源小结

  • 在功能方面,Unreal 4引擎和Unity引擎中支持的类型和功能大部分比较相似。Unreal 4引擎在面光源的支持比Unity更加丰富一些。
  • 在操作方面,两大引擎在场景中设置光源以及调整参数方面也都较为一致。

二、全局光照

Unity中采用Enlighten计算全局光照,Unreal 4中的全局光照系统叫做“Lightmass”。对于静态和动态的物体,Unreal 4采用了与Unity类似的解决方案:静态物体使用Lightmap记录物体表面光照信息,动态物体使用点云记录空间中光照信息,在实时计算时根据物体位置进行插值计算。

1、全局光照设置及烘焙

Unreal 4引擎和Unity引擎都采用了一键烘焙的方式。当场景中的物体和光源设置完成后,点击上排工具栏的“Build”按钮即可开始烘焙计算。烘焙结束后即可看到全局光照渲染结果。下图显示了Unreal 4引擎和Unity引擎的全局光照设置界面,关于更为详细的Lightmap烘焙介绍,我们将在后续文章中进行详细说明。
请输入图片描述

2、Lightmass Importance Volume

在Unreal 4引擎中,为了提高重要区域全局光的采样率和光照计算质量,引入了Lightmass Importance Volume。该区域表示了场景中重要的区域,例如:玩家可以寻路到达的地方等。在该区域内,Lightmass会在计算全局光照时增加光子(Photon)的数量,从而加大这些区域的间接光照采样率,提高了全局光照质量。而在这些区域以外,则使用少量光子,加快计算速度,如下图所示:
请输入图片描述

其中,黄色线框表示Lightmass Importance Volume的范围。经测试表明,对于同一场景,设置Lightmass Importance Volume将全局光照区域缩小能够明显加快烘焙速度,如下图所示:
请输入图片描述

其中,该建筑内部设置了各种不同的光源,灰色的方框表示Lightmass Importance Volume范围。在上述例子中,我们特意将Lightmass Importance Volume范围缩小到只包含房间的部分区域。下表显示了在不添加Volume和添加之后的烘焙详细耗时对比。
请输入图片描述

3、Indirect Lighting Cache

对于动态物体,Unreal 4引擎与Unity引擎采用了相似的全局光照算法。在Unreal 4引擎中,可以通过在空间中分布了点云,对间接光照进行采样计算并存储在Indirect Lighting Cache中。然后根据动态物体当前的位置插值计算间接光照。这种方式类似于Unity引擎中的Light Probe,如下图所示:
请输入图片描述

其中,左图是Unreal 4引擎中Indirect Lighting Sample的可视化结果,右图是Unity引擎的Light Probe的可视化结果。

Unreal vs Unity 全局光照小结

关于全局光照,Unreal 4引擎和Unity引擎采用的方法比较类似。在渲染预计算光照时,都是对静态物体采用Light Map,对动态物体采用点云(光照探针)。
操作上的不同之处在于Unreal 4引擎需要设置Importance Volume,然后Indirect Lighting Sample会自动分布。Unity引擎需要手动设置Light Probe位置。


三、阴影

Unreal 4引擎中的阴影渲染主要包含两部分:预计算阴影和实时计算阴影。本节接下来的内容将对这两部分分别进行介绍。

1、预计算阴影

Unreal 4引擎的预计算阴影渲染不仅支持不透明物体阴影渲染,而且支持半透明物体阴影渲染。在第一节介绍光源时曾介绍过,渲染不透明物体预计算阴影时,光源的大小会对阴影的软硬程度造成影响。同样,在渲染渲染半透明物体预计算阴影时,光源的大小会影响半透明物体阴影的模糊程度,如下图所示:

请输入图片描述
(上图取自Unreal 4官方网站)

其中左图是光源较大时的渲染结果,右图是光源较小时的渲染结果。

与Unity引擎中的全局光照系统Enlighten相同,Unreal 4引擎的全局光照系统Lightmass也支持Ambient Occlusion的计算。

2、实时阴影

Unreal 4引擎的实时阴影计算支持:Shadow Map以及Screen Space Ambient Occlusion效果。接下来本文将对它们进行介绍。

Shadow Map
在实时阴影计算时,Unreal 4采用了Shadow Map的方法,如下图所示:
请输入图片描述
请输入图片描述
其中,上下两图分别是Unreal 4引擎和Unity引擎Directional光源开启Shadow Map阴影效果的设置界面和渲染结果。

对于Directional光源,Unreal 4引擎与Unity引擎同样支持Cascade Shadow Map。并且,通过设置“Dynamic Shadow Distance Stationary Light”可以支持将远处的物体阴影计算逐步用静态阴影替代,从而减少性能开销,如下图所示:
请输入图片描述
其中,左右两图分别是Unreal 4引擎和Unity引擎的Cascade Shadow设置。

Screen Space Ambient Occlusion
Unreal 4引擎内置支持SSAO的阴影效果,Unity引擎则通过AssetStore中的插件支持该效果【2】【3】。如下图所示:

请输入图片描述
(上图取自Unreal 4官方网站)

请输入图片描述
(上图取自Unity Asset Store 【2】)

其中,上排图是Unreal 4引擎SSAO效果,下图是Unity引擎插件SSAO效果。左、中、右图分别为原始结果、SSAO结果以及叠加后结果。

Unreal vs Unity阴影小结

关于阴影渲染,Unreal 4引擎比Unity引擎在预计算阴影渲染中提供了更多的面光源软影功能,以及半透明物体阴影。在实时阴影渲染中,两者提供功能相类似。


四、反射效果

Unreal 4引擎的材质系统在渲染时提供了反射效果,并通过“Metallic”和“Roughness”参数进行控制,如下图所示:
请输入图片描述
其中,球体的材质属性设置为:Metallic=1,Roughness=0。

但同时,Unreal 4引擎也提供了Reflection Capture Actor抓取场景的Cube Map以提供反射功能。该功能类似于Unity引擎中的Reflection Probe Component。下图是采用Reflection Probe渲染Glossy表面模糊的反射效果:
请输入图片描述
其中,左右两图分别是Unreal 4引擎和Unity引擎StandardShader采用Metallic=1,Roughness=0.5,并利用Reflection Probe渲染的结果。

Unreal vs Unity反射效果

关于反射效果,Unreal 4引擎的材质系统很好地支持了反射,使得在编辑场景时能够比较真实和直观地得到较好的渲染效果。在Reflection Probe的支持上,Unreal 4引擎和Unity引擎相类似。


五、其他特殊效果

除了基础功能之外,Unreal 4引擎还提供了许多高级的渲染效果。本文选取了其中一部分进行介绍。更加详细的内容请参考Unreal 4官方文档【1】。

1、Capsule Shadows
Capsule Shadow采用capsule近似表示Skeletal Mesh,并利用其渲染Soft Shadow的一种方法,如下图所示:

请输入图片描述
(上图取自Unreal 4官方网站)

其中,左右两图分别是采用不同大小光源渲染的结果。但是该效果需要DX11以及Compute Shader支持,目前难以在Mobile平台使用。

2、Contact Shadows
Unreal 4引擎中的Contact Shadow用途是提升平面上小突起的阴影质量。其计算方式是对每一个pixel,对每一个光源根据depth buffer的信息计算该pixel是否被遮挡,如下图所示:

请输入图片描述
(上图取自Unreal 4官方网站)

其中,左右两图分别是关闭和开启Contact Shadow的渲染。

3、Light Shaft

Unreal 4引擎原生支持Light Shaft的渲染效果。在Unity中也有类似效果的插件,通常称为God Ray或Light Shaft。Unreal 4引擎中Light Shaft功能实现分两种:Occlusion和Bloom。Occlusion方法渲染结果更加真实,而Bloom方法渲染则容易控制形态,如下图所示:

请输入图片描述
(上图取自Unreal 4官方网站)

其中,左右两图分别是Occlusion和Bloom方法渲染的结果。

Unreal vs Unity特殊效果小结

关于特殊效果,Unreal 4引擎比Unity引擎在原生上支持了更多,但Unity引擎通过Asset Store的第三方插件提供了大量效果。Unreal 4引擎中的不少高级渲染效果都需要很好的硬件支持,因此在面向PC和主机的平台上更加适合。


光照系统小结

本节主要针对Unreal 4引擎的光照系统提供的功能进行了介绍。并将其与Unity引擎中的相似功能进行了对比。总体而言,笔者认为Unreal 4引擎和Unity引擎的光照系统提供的大部分基础功能比较相似,在易用性上两者也相差无几。Unreal 4引擎比Unity引擎提供了更丰富的高级光照功能,但同时也需要更好的硬件平台支持。希望在未来,随着硬件的快速发展,这些更好的光照效果能够更广泛的得以应用。


参考文献

【1】 https://docs.unrealengine.com/latest/INT/
【2】 https://www.assetstore.unity3d.com/en/#!/content/22369
【3】 https://www.assetstore.unity3d.com/en/#!/content/24445


以上即为我们对Unreal 4引擎就渲染模块的光照系统的讲解,也是我们踏上虚幻引擎学习之路的第一步,之后我们会将继续分享渲染模块下的材质系统和图像后处理的学习心得,欢迎大家的关注!我们希望本系列文章能让更多的中国游戏开发者了解和理解Unreal 4引擎的重要功能和所能达到的效果,也让更多的中国游戏开发者对Unreal引擎和Unity引擎融会贯通,提升技术储备。

最后非常感谢您能阅读到这里,希望能对您的项目有所帮助,如对文中的内容有异议或者进一步的补充说明,欢迎在后台给我们留言,谢谢!