当前位置: 首页 > news >正文

虚幻引擎学习之路:渲染模块之全局光照明

虚幻引擎学习之路:渲染模块之全局光照明

https://zhuanlan.zhihu.com/p/31791392

原文链接:虚幻引擎学习之路:渲染模块之全局光照明 - UWA Blog

之前UWA为大家分别介绍了Unreal 4引擎中渲染模块的光照系统、材质系统和相机图像后处理,在本篇文章中,我们将为大家介绍渲染模块的全局光照明这部分内容。

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


关于全局光照

全局光照是增强渲染真实感的有效方法,也是游戏引擎中不可缺少的一部分。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官方网站

 

小结:清晰的操作界面让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官方网站

 

其中,左图是ILC的光照探针分布,右图是VLM的光照探针分布。由于VLM在空间中分布更广,因此其获取的间接光照信息更准确。并且,ILC的光照插值计算是基于光照探针,而VLM的光照插值是基于渲染物体的像素,下图显示了两者在照亮场景中非静态物体时的不同效果:

上图取自Unreal 4官方网站

 

同时,VLM不仅能对动态物体产生间接光照,而且还对Fog产生间接影响,如下图所示:

 

上图取自Unreal 4官方网站

 

其中,左图是没有使用VLM计算间接光的效果,右图是使用了VLM计算间接光的效果。

小结:Unreal 4中光照探针在3D空间中是全自动自适应分布的,在保证视觉效果的情况下使用最少量的光照探针进行渲染,更重要的是,该操作可以避免大量的手工布置工作。另外,其对于雾效等环境的间接影响效果,让我们眼前为之一亮,该功能可以大幅提升特殊环境、特定场合的渲染质量。

阴影效果

本节将介绍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,如下图所示:

 

然后,点击Build按钮烘焙,即可看到半透明阴影效果,如下图所示:

 

小结:Unreal 4引擎支持Masked Shadow、Area Light Shadow和Translucent Shadow等光影效果,并且将阴影的边缘处理的非常自然。

全局光照总结

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引擎融会贯通,提升技术储备。

 

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

发布于 2017-12-07

「真诚赞赏,手留

 

 

 

 

 

 

相关文章:

  • 我所理解的DirectX Ray Tracing
  • Unity 曲线插值(Hermite插值和Catmull_Rom插值)
  • 参数化曲线:Hermite Catmull-Rom Bezier
  • 贝塞尔曲线原理(简单阐述)
  • 插值与样条
  • Unity 打包因为资源没有 meta ,打包 assetbundle 的时候,导致资源没有打包进去
  • 深入理解color model(颜色模型)
  • LMS色彩空间
  • 计算机图形中的色彩概念
  • 网游帧同步的分析与设计
  • UE4网络同步思考(一)---经典同步方案
  • UE4网络同步(二)——深入同步细节
  • 2021-03-13
  • UE4中自定义用于sequence的变量和函数
  • gradle基础配置
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • JS题目及答案整理
  • maven工程打包jar以及java jar命令的classpath使用
  • MySQL几个简单SQL的优化
  • python 装饰器(一)
  • Ruby 2.x 源代码分析:扩展 概述
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 从零开始在ubuntu上搭建node开发环境
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 免费小说阅读小程序
  • 小程序button引导用户授权
  • 协程
  • 在Unity中实现一个简单的消息管理器
  • const的用法,特别是用在函数前面与后面的区别
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • (Python第六天)文件处理
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (转)树状数组
  • (转载)虚函数剖析
  • **python多态
  • .gitignore文件—git忽略文件
  • .mysql secret在哪_MySQL如何使用索引
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .NET下的多线程编程—1-线程机制概述
  • ::
  • @EnableConfigurationProperties注解使用
  • @ModelAttribute 注解
  • @RequestBody与@ResponseBody的使用
  • [2021 蓝帽杯] One Pointer PHP
  • [Angular] 笔记 7:模块