UE4学习笔记:全局光照入门
本随笔记录在学习UE4全局光照(Global Illumination)过程中需要记录的知识点,包括用于实时渲染的烘焙、动态GI等内容。本随笔的内容取自Epic官方教程:全局光照入门
** 本随笔作者还在学习阶段,对UE4的使用和理解还不够透彻,难免会出现书写上和技术上的错误,如若发现类似的错误,可以通过评论区或私信与我讨论**。
目录
实时渲染中的全局光照(GI in Real-Time)
-
实现全局光照目前有两种方法:“预计算全局光照”和基于“光线传播体积”功能,
-
预计算全局光照将计算结果预先存储在光照贴图中。这种方法的主要局限性是只能用于烘焙静态对象的光照,优点是性能开销非常低,因为光照和GI全都事先计算完成,不需要实时计算。
-
基于“光线传播体积”(已被屏幕空间全局光照替代,参照下文动态全局光照部分部分)完全采用实时计算,没有进行过实现计算处理,因此该方法的GI效果不是很精确,细节上通常不如预计算GI,之所以不精确主要是为了弥补该方法造成的额外性能损耗。
-
需要注意的是,在光照名词中,“定向光照”指的是由光源直接发出的光亮形成的光照效果(直接光照),“非定向光照”指的是经过反射或辐射后的光照效果(间接光源、全局光照效果等)。
预计算全局光照
烘焙核对表(Baking Checklist)
烘焙核对表列出了全局光照在全局光照烘焙成光照贴图时所需的所有关键步骤。
- 需要将所有网格体Actor设置为“静态的(Static)”。这会让引擎知道这些网格体Actor没有动画,不会在运行时移动,可以接受光照贴图。如果网格体Actor被设置成了“可移动的(Movable)”,则该Actor不会接收光照贴图。
- 将所有光源的移动性设置为“静态的(Static)”。
- 所有对象都需要有用于烘焙光照的光照贴图UV。
- 如果对象没有光照贴图UV的话,可以使用UE4自带的方法新建光照贴图UV或在外部的数字内容创建(Digital Content Creation)软件里生成。
- 为所有对象设置光照贴图分辨率大小。一般来说,“光照贴图分辨率(Light Map Resolution)”属性值应该和“最小光照贴图分辨率(Min Lightmap Resolution)”属性值一样,但这不是硬性要求。
Lightmass
- Lightmass本质上是一个独立的应用,它支持光线追踪,和其他光线追踪器一样,例如V-Ray或Metal Ray,它拥有大部分光照功能,还支持网络分布式渲染或多处理器渲染,以便加快烘焙速度,在虚幻引擎中我们主要通过“构建(Build)”菜单使用Lightmass。点击下拉菜单就能找到“仅构建光照(Build Lighting Only)”,一旦点击,场景就会被发送给Lightmass,然后Lightmass就会开始计算光照和GI,计算完成之后它会生成相应的纹理并将这些纹理导入到场景里,并且和场景和材质与纹理融合。一旦烘焙完成我们就能直接在编辑器的视口里看到烘焙后的结果。
- 为了快速改善光照贴图的烘焙质量,需要过滤掉多余的光照信息,需要在没有纹理、材质和其他后期处理特效干扰的情况下查看烘焙效果,通常的做法是首先切换到“仅光照(Lighting Only)”视图模式,禁用掉某些后期处理特效后才能更加准确地检测出光照贴图烘焙质量的好坏。关掉下列效果之后,我们就可以专心调整光照贴图质量并执行其他烘焙来提升光照效果。
- 禁用“屏幕空间环境光遮蔽(Screen Space Ambient Occlusion)”,因为Lightmass实际上已经计算了部分环境光遮蔽效果并且将其烘焙进了光照贴图里,如果引擎继续在这之上加入其他环境光遮蔽效果的话,我们就很难分辨出哪种质量不错,哪种质量出了问题。可以通过去掉勾选“显示(Show)->光照特效(Lighting Features)->屏幕空间环境光遮蔽(Screen Space Ambient Occlusion)”即可禁用SSAO效果。
- 禁用“自动曝光(Auto Exposure)”效果,因为引擎在默认设置下会在视口画面较暗的时候自动增加亮度,在视口画面较亮时自动降低亮度,这个特性也不适合于光照烘焙效果的观察。可以去掉勾选“视图模式(View Modes)->曝光(Exposure)->游戏设定(Game Settings)”,然后更改位于“游戏设定”下面的“EV100”属性的值,即可关闭自动曝光效果并将其设定为一个合适的值。
- 禁用“泛光(Bloom)”,该效果会在光照中添加高亮效果,干扰烘焙效果。可以通过去掉勾选“显示(Show)->后期处理(Post Processing)->泛光(Bloom)”来关闭泛光效果。
如何提升烘焙质量和缩短烘焙时间
重要体积(Importance Volume)
- 重要体积(又称“Lightmass重要体积”)是一类特殊的Actor,这类体积的作用是告诉Lightmass应该聚焦体积范围内的内容或集中计算体积内的内容,而不需要大量计算体积外的内容,也不会对体积外的内容生成间接光照等。因为确立了烘焙的范围而不是默认全部烘焙,因此除了提升烘焙质量以外,还能够缩短烘焙时间。
门户(Portals)
- 门户(又称Lightmass门户)也是一类特殊的Actor,该类Actor对室内场景特别有效,一般来说室内场景里对外开放(例如敞开的门、窗户等)都应该放置门户Actor并覆盖开口来提升烘焙质量,门户Actor会告诉Lightmass场景的开口在哪里,这样Lightmass就能更好地汇集光线或光子,为室内提供更好的光照效果,而不是盲目地将光线或光子散播到场景各处。因为同样确立了烘焙范围,所以该方法既可以提升烘焙质量也可以缩短烘焙时间。
质量设置(Quality Settings)
- 通过设置“构建(Build)->光照质量(Lighting Quality)”是更加直接地一种提升光照贴图烘焙质量的方法。该方法可以提升烘焙质量,但是也会提升烘焙时间。
世界设置(World Settings)
- 在每个关卡的“世界设置(World Settings)”里都有个独立的“Lightmass分段”,展开该分段即可看到许多Lightmass相关的设置,以便我们更好地微调Lightmass的各个属性设置。以下列举出了其中最重要的几个设置。
- 间接光照质量(Indirect Lighting Quality):该选项对光照质量有直接影响。如果你发现烘焙后的光照效果出现了很多的噪点,可以试着增加该属性值以减少噪点,这能提升烘焙质量,同时也会增加烘焙时间。
- 间接光照反射次数(Num Indirect Lighting Bounces):如果发现场景中的间接光照亮度不够,或觉得场景中缺乏足够的反射,可以加大该属性值以增加Lightmass计算的反射次数。
- 天空光照反射次数(Num Sky Lighting Bounces):效果同上,但是是作用于天空光照烘焙的光照效果。
- 静态光照级别比例(Static Lighting Level Scale):如果觉得场景中捕捉到的细节不够丰富,例如接触阴影的细节只有大片的普通阴影,对象周围仍然缺少接触阴影的细节,我们可以降低这个数值。需要注意的是如果我们降低了这个数值,相应地我们应该加大“间接光照质量”的值,以便消除计算GI时候生成的噪点。降低该属性值同样会增加烘焙的时间。
INI设置(INI Settings)
- (随笔作者注:这里不是我不写,而是视频中写了该标题但是并没有任何介绍……)
网格体作为光源
- Lightmass支持纹理对象作为光源。
- 首先需要建立一个带自发光颜色(Emissive Color)、着色模型为“无光照(Unlit)”的材质(着色模型设置为无光照是为了减少纯自发光材质的性能损失),然后将其应用到需要当作光源的静态网格体对象上,然后勾选该对象“细节(Details)->光照(Lighting)->使用自发光作为静态光照(Use Emissive For Static Lighting)”,如果想让自发光对间接光照影响多一些,可以加大该属性值下面的“自发光影响系数(Emissive Boot)”属性值,最后构建光照,即可实现通过自发光纹理材质将光照信息(直接光照信息或间接光照信息)烘焙到光照贴图里。在烘焙结束后就可以明显看出自发光材质的颜色对周围对象产生的影响(产生了颜色的辐射效果)。
动态全局光照
- 动态全局光照基于“光线传播体积”技术或屏幕空间全局光照,优点是该类型的GI属于实施方案,无需任何烘焙或预处理,任何动画对象、任何需要移动的对象等都可以用同一套系统处理,也无需为这些模型准备额外的UV。其缺点是这会造成很大的性能开销(因为每一帧都需要实时计算GI),以及为了确保画面的可交互性,这些实时计算会大量采用近似算法,因此相比于预计算GI,动态GI的质量更低,细节更少。
光线传播体积(该功能从UE4.26开始已经被废弃,且被“屏幕空间全局光照”取代)
- (随笔作者注:因为该技术已经被废弃,所以不再在这里记录相关的技术信息,有需要参阅技术内容的可以查阅官方文档)
屏幕空间全局光照(Screen Space Global Illumination,SSGI)
- 该技术内容摘录自官方文档:屏幕空间全局光照。
- 注意,该功能仅为测试(Beta)版本。
- 屏幕空间全局照明是虚幻引擎的一项取代了光线传播体积技术的全局光照功能,旨在通过向屏幕视图内的对象添加动态间接光照来创建自然光照。利用SSGI,还可从自发光表面(例如霓虹灯或其他明亮表面)获得动态光照。
- 只需要勾选“项目设置(Project Settings)->渲染(Rendering)->光照(Lighting)->屏幕空间全局光照(Screen Space Global Illumination)”,即可启用SSGI,之后只需要在场景里面放置动态光源(固定光源或可移动光源),被该光源照射到的物体就可以实时计算间接光照。甚至自发光对象也能够计算实时GI而不需要进行额外的设置。
- 屏幕空间全局光照可以设置间接光照的强度,只需要更改后期处理体积的“细节面板(Details)->渲染特性(Rendering Features)->全局光照(Global Illumination)”分类下的“间接光照强度(Indirect Lighting Intensity)”属性值即可。
- 命令“r.SSGI.Quality Value”可以控制SSGI的质量,其中Value值的范围为0~5,0为关闭SSGI。
- 命令“r.SSGI.HalfRes”用于以一半分辨率渲染SSGI。