UE4学习笔记:全局光照进阶——理解建筑可视化中的全局光照
本随笔介绍了UE4引擎中更加详细地全局光照技术内容和使用技巧,如果你是第一次接触UE4全局光照概念,建议可以先阅读全局光照入门笔记和基础光照入门笔记来对UE4的光照技术有一个大体的概念。本随笔的内容整理自官方在线教程视频:理解建筑可视化中的全局光照。
本随笔作者还在学习阶段,对UE4引擎的理解和使用还不够透彻,难免出现书写上和技术上的问题,如若出现了类似的问题,欢迎通过评论区或私信与我讨论。
目录
- 前言
- Lightmass进阶
- 光照UV贴图对全局光照的影响
- 指定区域进行Lightmass重点计算
- 控制光源的二次反射
- 材质对全局光照的影响
- 门户(portal)对室内空间的全局光照影响
- 质量和平滑度设置
- 区域阴影(Area Shadow,又称软阴影Soft Shadow)
- 使用高动态范围图像(High-Dynamic Range Image,HDRI)
- 环境光遮蔽(Ambient Occlusion,AO)
- 静态光照关卡比例(Static Lighting Level Scale)
- 动画与全局光照
- 后期处理体积(Post Processing Volume)
- 溢色(Color Bleed)
- 光照情景(Lighting Scenarios)
- 保存高分辨率静态图像
前言
- UE4引擎提供两种全局光照解决方案:一种是预计算全局光照,一种是基于“屏幕空间全局光照”技术的动态实时全局光照,为了方便起见,下列叙述的技术内容和实用技巧,如果没有显式说明,则指代的都是“预计算全局光照”实现的静态全局光照方案。
Lightmass进阶
- 我们已经知道UE4引擎里面的所有静态光照都是有名为“Lightmass”的独立程序进行计算渲染,当我们点击主界面上的“构建(Build)”按钮之后,引擎就会将场景信息发送给Lightmass程序,然后由Lightmass计算光照信息,最后由Lightmass将计算完毕的信息发送回引擎,引擎再将生成的光照贴图和场景里的材质混合,这就是UE4引擎烘焙光照的大致流程。
- UE4编辑器与Lightmass之间的通信是由另一个独立程序“Swarm Agent”负责处理。如果只使用一台电脑工作,Swarm Agent将负责核心和线程管理;如果使用一个计算机网络工作,Swarm Agent还会尽可能地将光照计算任务分配给远程计算机。
- Swarm Agent首先会启动Lightmass,然后Lightmass会发出直接光子(第一束光线),然后计算间接光子(二次反射光子),接着寻找辐射光子,存储并计算天空光照的辐射强度,最后,它会接着将所有这些信息烘焙进光照贴图里,这些光照贴图可以在关卡的“世界设定(World Settings)->Lightmass->光照贴图(Lightmaps)”查看。
光照UV贴图对全局光照的影响
-
由于Lightmass使用位图来存储直接光照和间接光照信息,因此网格体本身的光照贴图UV的质量也会直接影响到全局光照方案的质量。
光照贴图的工作原理
为什么光照贴图要单独设置一个UV通道而不是用已有的UV0?
- 上文说过我们在使用全局光照的时候,光照信息会被烘焙进位图,关卡中所有模型的每一部分,都需要采集并存储周围场景的光照信息,考虑到Lightmass在场景中反射光子的方式,某个对象各表面的光照信息与其他对象相同的可能性几乎不存在,然而,纹理美术师通常会将UV岛状区或集群叠加在一起以便尽可能压缩纹理贴图的分辨率,也就是说乐于见到静态网格体各个表面的重复信息(因为不同模型之间的各表面很有可能会相同),而光照美术师需要为光照贴图单独设立一个UV通道,因为所有模型的各表面光照信息都是第一无二的,尽可能让UV岛状区或集群在无重叠、无过界的情况下间隔足够小,可以防止出现漏光、光照信息错误的问题。
提升光照贴图的质量
- 提高静态网格体编辑器里的“细节(Details)->LOD 0->构建设置(Build Settings)->最小光照贴图分辨率(Min Lightmap Resolution)”的值可以让光照贴图拥有更高的质量,但是要注意该操作会增大光照贴图UV里每个岛状集群的大小,会缩小这些集群的间隔,也会增大这些集群重叠或过界的风险。
- 当静态网格体被放置到关卡里之后,我们可以通过设置该对象“细节(Details)->光照(Lighting)->覆盖光照贴图分辨率(Override Light Map Res)”选项,就能单独为该对象设置光照贴图分辨率大小而不是用统一在静态网格体模型编辑器里设置的大小。
- 一般来说,我们应该提升处于光照和阴暗交界处的模型的光照贴图分辨率,以增强这些模型上烘焙出的光照贴图的质量,还需要降低次要对象的光照贴图分辨率大小以降低对性能的损耗。
- UV岛状区的数量越多,光照瑕疵出现的可能性就越大。
- 网格体中任何实际相连的部分,在光照贴图UV中也同样应该相连。
-
如果需要删除关卡里面已经生成的光照贴图,可以通过勾选“世界设置(World Settings)->Lightmass->强制无预计算照明(Force No Precomputed Lighting)”,然后构建一次关卡照明即可删除之前生成的所有光照贴图。
指定区域进行Lightmass重点计算
- 我们已经知道在关卡中放置Lightmass重要体积可以让进行在进行光照烘焙的时候对处在该体积内的内容进行更加高质量的计算,而对体积外的内容只进行简单的烘焙计算。
- 如果需要的话,我们实际上可以在关卡中放置多个重要体积,以指定引擎对多个区域进行高质量烘焙,但是由于引擎会将所有重要体积盒子包含在一个虚拟边界中然后据此构建光照,体积越多,在关卡中越分散,光照构建受到的负面影响也越大。
控制光源的二次反射
常用光照(如点光源、据光源、定向光源等)
- 关卡的“世界设定(World Settings)->Lightmass->Lightmass设定(Lightmass Settings)->间接光照反射次数(Num Indirect Lighting Bounces)”属性值用来控制光照烘焙时候间接光照的反射次数,如果将此属性值设置为0的话实际上就是关闭间接光照,而只使用直接光照。场景光照质量随着该属性值的增加而提高,但是不同的值提高的程序不一样,例如该从0到1,场景光照质量会有非常明显的改善;从1到5,依然可以看出光照质量有明显的改善;但是从5到10,就可以看出光照质量的提升不是那么明显。间接光照反射次数从5增加到10,场景光照效果并没有明显提升,但是烘焙时间却增加了很多,因此我们需要控制反射次数在高质量的光照效果和适中的烘焙时间之间的取舍。
天空光照(Sky Light)
- 天空光照默认情况下会采集最远处的场景然后用其来照亮场景。
- 天空光照同样支持间接光照,可以设置“世界设定(World Settings)->Lightmass->Lightmass设定(Lightmass Settings)->天空光照反射次数(Num Sky Lighting Bounces)”来增加天空光照在世界场景里的反射次数,但是其效果并不如常用光照增加反射次数效果改善得明显。
- “世界设定(World Settings)->Lightmass->Lightmass设定(Lightmass Settings)”分类的属性值“环境颜色(Environment Color)”和属性值“环境强度(Environment Intensity)”都是用来改变天空光照间接光照的属性。不像常用光照是通过增加“间接光照反射次数”来增加间接光照量,天空光照需要在增加反射次数同时增加“环境强度值”来增加间接光照量。
- 天空光照的“细节(Details)->光照(Light)”分类下的属性值是用来改变天空光照直接光照的属性值。
- 天空光照最适合实现半夜阳台上的月光这样的效果。
材质对全局光照的影响
- 材质底色会直接影响光照方案的最终效果。
- 高对比度或深底色会使光线很难反射。
- 低对比度或中等温度颜色能够更好地反射附近的环境光。
- 在“无光照(Unlit)”视图模式下可以很轻松地让我们查看所有对象的底色。
- 设置一个高全局光照质量的经验法则是,所有对象在“无光照(Unlit)”视图模式下应该看起来相当单调平坦。因为把光照和阴影信息烘焙进底色贴图会最终抵消我们为了设置正确的光照和GI效果所做的幸苦成果。(随笔作者注:个人不是很能理解这句话,但是视频里面原字幕就是这样的。)
门户(portal)对室内空间的全局光照影响
- 我们已经知道门户(Lightmass门户)能够帮助Lightmass渲染器准确理解光线的出发位置。
- 使用门户可以很好的提高全局光照渲染质量,但同时也会增加渲染时间。门户会迫使Lightmass渲染器时刻关注该区域内的光线。
- 即便把门户Actor放置到摄像机无法看到的位置,它们也会被计算,因为门户Actor不会被几何体遮挡或阻挡,也正因如此我们不应该在大型开放世界或室外场景放置门户Actor,因为它们光照层面几乎没有任何价值(因为提升的是室内的场景),但是会增加构建光照的所需的时间。
质量和平滑度设置
- 在我们摆放设置好了所有光源之后,有两个设置可以帮助我们全面性地提高全局光照质量,一个是“间接光照质量”,另一个是“间接照明平滑度”。
- “间接光照质量(Indirect Lighting Quality)”位于“世界设置(World Settings)->Lightmass->Lightmass设置(Lightmass Settings)”分类下,该属性值本质上就是缩放Lightmass GI解算器使用的样本数量,数值越高,光照瑕疵(比如噪点和斑点)就越少,但光照构建时间就会变长,因此建议改变该属性时最好是逐渐加大其值。
- “间接光照平滑度(Indirect Lighting Smoothness)”位于“世界设置(World Settings)->Lightmass->Lightmass设置(Lightmass Settings)”分类下,该数值越高,能使间接光照更加平滑,可以隐藏解算器噪点,但也会模糊掉清晰的间接阴影和环境遮挡。该值建议范围在0.69~0.75之间。
- 在调整这两个属性值的时候,为了获得最好的全局光照质量,最好是同时修改这两个属性值,因为我们在加大“间接光照质量”的时候,提升了全局光照质量的同时其实也降低了全局光照细节,而降低细节也是增加“间接光照平滑度”属性值造成的影响,因为增加该值会模糊掉光照细节以隐藏诸如噪点之类的瑕疵,因此我们在增加“间接光照质量”的时候最好是降低“间接光照平滑度”。
- 需要记住的是,无论是怎样的设置,都无法彻底避免光照中的瑕疵例如纹理接缝、压缩瑕疵等光照贴图问题,都需要从源头处解决问题。
区域阴影(Area Shadow,又称软阴影Soft Shadow)
- 区域阴影(或称为柔性阴影、软阴影)效果中的阴影半影或边缘能够为场景增添真实感。区域阴影越柔软并且扩散得越多,它离光源就越远。
- 引擎中所有“静态光源”都是“区域光源”,都默认带有区域阴影(随笔作者注:之所以只能是静态光源我猜是因为区域阴影是直接光照烘焙生成的,“固定光源”和“动态光源”都无法烘焙直接光照)。
- 光源(点光源、聚光源)的“细节(Details)->光照(Light)->源半径(Source Radius)”属性值是用来设置光源半径大小,因为前文说过“物体离光源越远,其区域阴影就越柔软且扩散得越多”,所以该属性值也会影响一个对象生成的区域阴影的柔软程度。该值设为0的话也会关闭物体的区域阴影。
- “定向光源(Directional Light)”设置区域阴影的属性值是“细节(Details)->Lightmass->光源角度(Light Source Angle)”。
- 定向光源还有一个额外的属性值“阴影指数(Shadow Exponent)”,该属性值指定的是“从阴影最接近物体的位置到最远离物体的位置之间,区域阴影出现的位置”,该属性值越大,区域阴影出现的位置离物体就越远。
- 无论是什么样的光源(定向光源和天空光照这类没有Actor的光源除外),光源大小都是通过黄色线框表示的,蓝色线框表示的是光照的衰减范围。
使用高动态范围图像(High-Dynamic Range Image,HDRI)
- 有时候我们会有以仿真环境甚至真实环境做为去全局光源的需求,这时我们就可以使用HDRI。
- 在场景里面添加静态的“天空光照”,然后将其“源类型(Source Type)”改为“指定的立方体贴图(Specified Cubemap)”,然后为“立方体贴图(Cubemap)”属性值添加HDRI,最后构建光照即可实现由HDRI生成的全局光照。
- 可以通过提升“立方体贴图分辨率(Cubemap Resolution)”来加强光照质量,但这会增加光照的构建时间。
- 如果静态网格体本身的光照贴图分辨率就很低,那么提升HDRI分辨率并不会有任何提升光照质量的帮助。
环境光遮蔽(Ambient Occlusion,AO)
- 为了确保对象能够融入到场景里面,我们可以使用引擎提供的“环境光遮蔽”这一特性。
- 环境光遮蔽本质上是一种间接阴影,能将阴影投身到不容易被光照反射到的地方以解决漏光等问题。比如阴天就是间接阴影经常出现的场景。
- Lightmass渲染器默认可以计算高细节间接阴影,所以实际上我们在构建光照效果的时候已经包含了部分环境光遮蔽效果。
- 引擎的环境光遮蔽效果实际上是“屏幕空间环境光遮蔽(Screen Space Ambient Occlusion,SSAO)”,使用SSAO的好处在于它计算速度快,占用内存低,并且还能提供非常不错的效果;缺点正如它的名字,它只对屏幕空间进行计算。当某个场景对象移出我们的摄像机范围后,那个对象将不会生成环境光遮蔽。
- 环境光遮蔽并不会永远和我们期望的一样干净无误,例如一些比较薄的对象生成的环境光遮蔽效果就不是很好。
- 要想在项目启用环境光遮蔽,只需要勾选“世界设置(World Settings)->Lightmass->Lightmass设置(Lightmass Settings)->使用环境光遮蔽(Use Ambient Occlusion)”,然后构建光照即可。
- 我们可以通过“后期处理体积”(前提是场景里有)的“细节(Details)->渲染特性(Rendering Features)->环境光遮蔽(Ambient Occlusion)->强度(Intensity)”属性值来更改环境光遮蔽效果。
- 引擎允许我们将环境光遮蔽效果烘焙进光照贴图里来避免SSAO只对屏幕范围内的对象生成AO的缺点,只需要在启用环境光遮蔽之后勾选“世界设置(World Settings)->Lightmass->Lightmass设置(Lightmass Settings)->生成环境光遮蔽材质蒙版(Generate Ambient Occlusion Material Mask)”,之后我们再构建光照即可生成环境光遮蔽纹理。为了使AO纹理和材质混合,还需要在材质里面使用“预计算AO蒙版(Precomputed AO Mask)”节点。(随笔作者注:节点的具体使用方法可能需要以后来补,视频里没有说明。)
- “最大遮蔽距离(Max Occlusion Distance)”指定了对象与对象之间会产生遮蔽效果的距离,该属性值的作用是为了防止当某个对象距离另一个对象太远,但引擎依然“错误地”生成AO的情况。
- “直接光照遮蔽率(Direct Illumination Occlusion Fraction)”和“间接光照遮蔽率(Indirect Illumination Occlusion Fraction)”是调整环境光遮蔽效果最直接的两个属性值,它们可用于分别控制对象在受到直接光照和间接光照时应用多少遮蔽。这两个属性值采用百分比的形式设置,值范围在0~1,值为0的时候是关闭对应的遮蔽效果;值为1的时候时应用最大的遮蔽效果。
- “遮蔽指数(Occlusion Exponent)”用于调整遮蔽效果的对比或过度区域,相当于对遮蔽梯度进行整体的调整,加大该属性值之后明暗过度的对比会显得更加明显,即在遮蔽效果中阴暗的地方更加阴暗,只是有一点点阴暗的地方会变得更加不阴暗。将遮蔽效果渗透进角落的位置。
静态光照关卡比例(Static Lighting Level Scale)
- “静态光照关卡比例”是“关卡比例”与“光照比例”之间的一个比值,相当于是告诉引擎我们应该为每单位的关卡尺寸应用多少资源去计算光照,因此可以得知该属性值越小,证明“光照比例”越大于“关卡比例”,也就会获得更好的光照效果。
- 该功能在室内场景项目中应当谨慎使用,因为该功能原本是设计给大型室外场景中用来快速计算阴影的功能。如果是为了整体提升全局光照质量的话,测试该值对场景的影响时应该每次调整幅度都应该很小。一般来说除非是有必要,不然的话该属性值最好保留默认值。
- 该属性位于“世界设置(World Settings)->Lightmass->Lightmass设置(Lightmass Settings)->静态光照关卡比例(Static Lighting Level Scale)”。用于大型室外场景的时候该属性值适合设置在2.0~4.0的范围之间。该属性值越小,全局光照照明质量越好,同时也会增加光照构建时间。
- 降低“静态光照关卡比例”的值可以提升全局光照质量(特别是间接光照生成的效果),但是同样也会增加全局关照的噪点。
动画与全局光照
- 虚幻引擎中使用“体积光照贴图(Volumetric Lightmap)”来实现场景中动态对象的全局光照效果。
- 在“世界设置(World Settings)->Lightmass->Lightmass设置(Lightmass Settings)”分类里可以设置和体积光照贴图相关的设置。
- “体积光照贴图细节单元格大小(Volumetric Lightmap Detail Cell Size)”设置的是样本点之间的距离。降低该属性值则可以提高样本点的个数,缩小样本点之间的距离,也就能提高动态对象在场景里接受全局光照的效果,也同样会增加项目光照构建时间。
- “体积光照贴图最大砖块内存量(Volumetric Lightmap Maximum Brick Memory)”设置的是要为体积光照贴图中所有样本点(即可视化体积光照贴图中的球形样本点)分配的内存量。当我们增加样本点数量(通过上文的操作)时,最好也同步增加砖块使用的内存量,这样才能让引擎保存足够多的样本点以呈现更好的动态对象全局光照效果。
- 体积光照贴图也可用于体积雾当中,让体积雾也能实现全局光照效果。
- 随笔作者使用的UE4.27版本引擎中,还可以使用“体积光照贴图密度体积(Volumetric Lightmap Density Volume)”指定某个区域是只生成高密度样本点、不生成样本点或只生成低密度样本点等特殊的形式。
后期处理体积(Post Processing Volume)
全局光照(Global Illumination)
- 当我们设置并烘焙好高质量的全局光照效果之后,我们可能还希望使用一些特效来提升显示效果,我们就可以使用“后期处理体积”。
- 场景里可以放置多个后期处理体积Actor,每个Actor都有自己单独一套设置。当玩家的摄像机进入到体积Actor内部的时候就会激活该体积Actor的设置并应用到摄像机上。
- 在体积的“细节(Details)->渲染特性(Rendering Features)->全局光照(Global Illumination)”分类下,有着“间接光照颜色(Indirect Lighting Color)”和“间接光照强度(Indirect Lighting Intensity)”两个属性值,这两个属性值能够让我们在不重新构建光照的情况下改变全局光照的色调和强度,能够实现设置某个房间为冷色调,而另外一个房间为暖色调的效果。
曝光(Exposure)及其对全局光照的影响
- “曝光”相关的属性位于后期处理体积的“细节(Details)->镜头(Lens)->曝光(Exposure)”分类下。
- 将“最大亮度(Max Brightness)”和“最小亮度(Min Brightness)”设置为同样数值的话,可以关闭引擎默认的“自动曝光(Auto Exposure)”功能。
- 如果需要自动曝光功能又不知道如何设置最大和最小亮度的话,可以在场景里面寻找亮度最低的位置(例如房间角落、远离光源等),然后调整“最小亮度”的值直到能够看清所有物体;在场景里寻找亮度最高的位置(例如发光物体旁、被太阳光直射的位置等),然后调整“最大亮度”的值直到能够看清所有物体。如此设置之后所得的两个属性值就是适合自动曝光的值。(随笔作者注:不清楚为什么这个亮度值越高场景反而越暗)
- “加速(Speed Up)”可以控制从暗到亮的速度。
- “减速(Speed Down)”可以控制从亮到暗的速度。
- “曝光补偿(Exposure Compensation)”会对整体曝光度施加对数级修正。-1.0能让曝光度降低到原来一半,-2.0降低到原来的四分之一,1.0则会让曝光度增加为原来的两倍,2.0为增加四倍。
- 曝光度设置直接影响到玩家最终看到的全局光照效果,如果能够逐体积调整曝光设置,我们就能够准确控制显示效果,从而确保全局光照每一处都显示出最佳效果。
溢色(Color Bleed)
- 当光线在场景中反射的时候(特别是间接光照),它们即会吸收物体表面颜色,也会被表面颜色吸收。例如,当光子击中的表面颜色饱和度较高时,光子会吸收该颜色,而当光子的能量被其他表面吸收时,光子会留下颜色,这就是溢色(也叫边界溢色、衍颜色反射)。场景在烘焙完全局光照之后,最容易发生溢色的情况。
- 有时候我们会发现场景里某些地方过分吸收了其他色彩或者没有吸收足够色彩以至于无法呈现真实效果或满足我们的需求,所以我们需要有方法可以控制全局光照溢色的情况,以下为引擎提供的几种降低溢色的方法:
- 最直接的方法是降低材质底色(Base Color)的饱和度。
- 如果我们必须使用某个指定的颜色,但是这个颜色本身的饱和度过高,我们还可以在材质编辑器里使用“GI替换(GIReplace)”节点,“默认(Default)”引脚就是我们原本需要的底色,然后通过指定“静态间接光(Static Indirect)”和“动态间接光(Dynamic Indirect)”的材质,最后将该节点的输出引脚连接到材质的“底色(Base Color)”引脚,就可以指定引擎在计算全局光照时候去生成什么样的间接光照。该也是最推荐的方案。
- 在材质编辑器的“细节(Details)->Lightmass->Lightmass设置(Lightmass Settings)->漫反射提升(Diffuse Boost”属性值可以调整该材质对场景静态间接光照产生的影响(该属性值在关卡的“世界设置(World Settings)”里也存在,不过那个设置的是整个场景的漫反射提升值,而这里的设置仅仅对该材质有影响)。需要注意的是该属性值虽然能够减少溢色的发生,但是同样也会减少该材质对光照方案的影响,例如说在材质里降低了该属性值,会让场景照明变暗,进而降低光照效果的真实度。
光照情景(Lighting Scenarios)
- 有时候我们需要让场景在自然光照和人工光照(如白天和夜晚)之间快速切换,我们就需要使用到引擎提供的“预计算光照情景(Precomputed Lighting Scenarios)”功能。
- 按照以下步骤我们就可以使用“预计算光照情景”的功能:
- 创建包含各种光照的关卡,这些关卡仅仅只需要放置静态或固定光源Actor即可(如定向光照、点光源等,动态光照不需需要烘焙所以也没有放置的必要),不需要放置其他资产。这些关卡可以分为日光关卡、月光关卡等根据项目所需的光照情景进行创建。
- 准备一个关卡,该关卡可以像正常关卡一样创建,摆放所需要的全部资产、模型、蓝图等,可以有光照也可以没有光照。然后将上一步骤准备好的关卡作为子关卡添加到该关卡下,该步骤新建的关卡就变为了主关卡。
- 在编辑器界面的“关卡(Levels)”面板里右键我们刚添加的光照情景子关卡,然后点击“光照情景(Lighting Scenario)->转换为光照情景(Change to Lighting Scenario)”。
- 打开主关卡,然后如正常关卡一样构建光照,这个时候引擎并不会构建主关卡的光照(假设主关卡没有光照),而是会分别将光照情景的关卡加载进主关卡里面然后构建光照,一个光照情景关卡构建完后,再加载另一个光照情景关卡再进行构建,如此就会根据不同的光照情景关卡构建不同的光照贴图。
- 在任意蓝图里面(可以是关卡蓝图,也可以是碰撞体蓝图等)使用节点“加载流送关卡(Load Stream Level)”加载关卡,即可启用我们设定好的“光照情景关卡”。需要注意的是同一时刻只能加载一个光照情景关卡。
保存高分辨率静态图像
- 点击主视口最左上角的下拉图标,然后点击“高分辨率截图”选项,即可开启引擎内置的截图工具。该方法生成的截图的大小时当前项目里视口的大小,无法指定保存的分辨率。
- 在编辑器模式并且没有运行项目的情况下,在控制台窗口输入“HighResShot [X Value]x[Y Value]”即可进行指定分辨率的截图操作,其中[X Value]指定的是截图的长度,[Y Value]指定的是截图的宽度,如“HighResShot 1920x1080”。