BlueRose
文章97
标签28
分类7
灯光知识与流程学习总结(三)——静态光照属性与工作流程

灯光知识与流程学习总结(三)——静态光照属性与工作流程

前言

在这一章,我将会总结一些有关静态光照相关的参数、使用场景与设置技巧。

本文图较多,手机党请注意。本文仅作为个人笔记使用,不保证所有操作都是正确的,请各位谨慎阅读。

Daedalus51的流程

首先我总结一下Daedalus51的流程,如有遗漏还请指正。以下流程仅为笔记记录使用,不一定正确。

个人不太推荐看第二章节后半段文档视频,因为作者一直都在调节材质(场景、粒子)。如果是建筑可视化方向的可以直接看第三章。

1.5章节的流程

  1. 去除干扰场景光照的后处理效果(本系列第一篇文章)
  2. 检查贴图的固有色是否正确并进行调整。(本系列第一篇文章)
  3. 调整天光以符合设计目标。(本系列第一篇文章)
  4. 设置曝光相关属性。
  5. 将所有灯光都是设置为Stationary类型。并开始设置方向光与其他主光源的基础属性(方向、亮度等)
  6. 设置LightMass属性,使用预览级对场景进行测试渲染。
  7. 开启LightingOnly模式对光照进行检查。
  8. 给场景中的带有反射属性的物体添加反射球并调整属性。(Daedalus51的流程中没有关闭空间反射,如果你按照我之前写的关闭空间反射,这里要记得开启)之后开启Reflections模式查看场景反射情况。
  9. 设置场景植被(有光照无关)
  10. 调整场景雾气
  11. 后处理调色

测试烘焙

注意去掉世界设置中的Force Precompute Lighting选项。
关闭Compress LightMaps选项(压缩灯光贴图),为了追求效果;但如果游戏项目推荐打开,这样可以节约显存占用。

作者一般不会再一开始就开启LightMass的AO烘焙选项(世界设置中)。因为一般情况下都会(也应该)使用SkyLight,所以我们应该把LightMass的EnvironmentColor设置为0。

突破材质贴图数目限制

因为全都使用静态烘焙灯光,所以在对应材质中Usage选项卡中勾选Use With Static Lighting,这样材质中的贴图采样数数统计才会正确(因为使用LightMass会占用2张贴图)

材质编辑器的Texture Sampler节点的Sampler Source选项决定了一个材质所能使用贴图数量,使用Shared:Wrap选项可以突破Dx11的贴图数量限制。

Stationary类型灯光阴影说明

Station类型的灯光对于静态物体会烘焙灯光,对于动态物体会使用动态阴影。
Dynamic Shadow Distance StationaryLight是切换开关,当为0是所有阴影都将是烘焙的,当数值较大时(5000)所有近距离阴影都将是动态的。作者推荐3000~8000之间。(在这个数值的距离观察时会切换为静态阴影)
有关反射球
反射球会影响所有物体产生影响(高反射物体如果没有反射球,渲染结果往往是错误的),你可以选择给小物体使用小反射球,之后在给所有物体一个大反射球。(小反射球的优先级高)

提高空间灯光样本密度(本人加的私货)
树木、草地等植被因为模型比较密集,所以无法获取准确的LightVolume样本信息。可以使用Volumetric LightMap Density Volume来增加空间样本数量。

其他相关空间还有:

Lightmass Importance Volume
用于提高指定区域内的LightMap烘焙效果(主要是间接照明),区域外的默认为低质量效果。

LightMass Character Indirect Detail Volume
提高区域内的间接光照缓存的密度(缓存点会更加密集)。

2.1章节的流程

  1. 删除无用灯光(因为Daedalus51在帮人改场景)并将其他灯光关闭。
  2. 这个关卡原本没有使用LightMass,可以看得出缺少AO
    可以使用距离场AO等技术补充在发现后处理空间开启了Dynamic Indirect Lighting后,查看LPV其实并没有开启。
  3. 检查场景模型UV,之后使用基础参数进行测试渲染。
  4. 在调整后屏幕空间反射质量后,使用LightingOnly查看光照烘焙效果。(洞穴墙壁太亮度,发现是因为模型没有设置为静态导致没有参与烘焙)
  5. 设置反射球,以消除错误的反射。
  6. 关闭指数雾与其他粒子雾(会影响场景亮度)并且将场景中的射灯模型的自发光材质属性降低,重置所有后处理,至此完成了场景基础修改。(这个理论上应该放到第一步中)
  7. 使用BaseColor模式查看固有色,并调整贴图的饱和度与亮度。
  8. 放置LightMass Portal,提高指定区域在LightMass烘焙中所产生的的光线量,以此来提高洞穴内的效果。
  9. 因为场景方向光没有对准洞口,所以作者选择关闭方向光,提高天光的间接照明亮度,并且在WorldSettings中将间接照明反弹提高到100。(目前版本应该设置天光反弹次数,而作者的版本没有这个选项,所以在视频中场景还是很黑)
  10. 调节曝光与人眼适应。
  11. 调整各种材质效果,与贴花效果。(设置贴花的光照模型)
  12. 逐个开启之前关闭的光源,并调整光源的颜色与范围。(调整灯光颜色以及优化Stationary重叠问题)并且把一些作用范围较小的灯光设置为动态,不产生阴影以对效果进行快速迭代。
  13. 继续调节场景中的细节(粒子、材质、灯光)
  14. 增加指数雾与使用反转法线球体制作的体积雾。
  15. 调节后处理效果。

有关LPV

Daedalus51并不推荐在室内设计中使用LPV(外部主光源不能对室内产生足够多的间接照明。因为LPV只适用于方向光,所以我们应该关闭Dynamic Indirect Lighting选项)。

有关屏幕反射
因为默认状态下,r.sss.quality为3,所以在后处理空间中调整质量到60以上都和60是一样的。(r.sss.quality 2命令对应的最高质量为50)输入r.sss.quality 4 可以解锁100质量。

3.1章节的流程

需要解决两个问题:

  • 场景中的窗子太小,同时室内灯光没有开启,导致室内光照不足。(可以看得出参考图的曝光度很高,连天空都看不出细节)
  • 场景中植物与材质不符合场景。

大致流程如下:

  1. 首先进入LightMap Density模式查看光照贴图密度情况,并调整分辨率到合适值。(保证附近模型的光照贴图密度大致相同)
  2. 检查后处理空间、天光与方向光,并重置至默认数值。(建筑可视化应该关闭屏幕空间AO,因为LightMass会烘焙效果更好的阴影)
  3. 将曝光度设置为1,让户外与室内曝光统一。(这么调整之后室内会变得很黑,此时Daedalus51认为我们不应该直接调整天光与方向光的强度与间接照明倍率,而是应该调整曝光数值来解决这个问题。)
  4. 关闭除了天光外的方向光与其他光源,并检查LightMass Portl、Lightmass Importance Volume是否设置正确。
  5. 修改LightMass选项后进行预览级质量烘焙。(提高反弹次数6=》10,设置打包灯光与阴影贴图最大大小,关闭压缩LightMap功能)
  6. 对比参考图后发现是曝光的问题,之后修改exposure bias(0=>4.6),使得场景达到合适的亮度。
  7. 删除BP_Sky_Sphere、高度雾与指数雾,添加新的使用Hdr的天空球(参照第二章节中的内容:场景捕获)后进行高级质量烘焙。
  8. 删除场景中的反射球,使用一个Box反射球作为主反射球,并将它大致放置在场景中间,之后调整Capture Offset数值来校准反射球。
  9. 关闭玻璃材质属性中的屏幕反射功能(Translucency-Screen Space Reflections),反射球效果依然有效。
  10. 检查材质是否正确,并进行调整(固有色、贴图等)
  11. 在观察到地板的不正常反射后,在后处理空间中开启了屏幕空间反射,并调节了反射质量。(r.sss.quality 4,r.sss.Temporal 0)之后发现反射噪点是材质粗糙度造成。
  12. 调节LightMass属性,Static Lighting Level Scale 1=》0.1,Indirect Lighting Quality 1=》6,Indirect Lighting Smoothness 1=》0.6,使用高级质量进行烘焙。这次烘焙花费4小时,烘焙的光照可以说相当好了,但在细微处还是有一些噪点,作者建议可以可以Indirect Lighting Quality再提高一些。
  13. 给场景带有高金属度与低粗糙度的物体添加反射球以解决物体渲染结果不对的问题。
  14. 视频3.3的时候作者的电脑突然原地爆炸了,鸽了段施加,但也因为更新了4.18版本,可喜可贺。使用Hdr+天光反弹,渲染效果变得更加自然了。作者还在场景中添加了方向光、聚光灯等主光源。修改了地板材质,并开启LightMass的AO选项(以掩盖SSR的问题)
  15. 作者展示一个骚操作,在材质编辑器中使用PreComputedAOMask节点来获取LightMass烘焙的AO信息。
  16. 作者将BP_Sky_Sphere加回来,同时把天光类型改成了使用CubeMap。

使用PreComputedAOMask与澡波贴图来实现一些边角污垢效果
image
image

解决植被顶点动画模糊的问题
在Project Settins-Rendering-Optimizations勾选Accurate Velocities from Vertex Deformation选项,让TAA能够获取正确的速度值,即可解决。这对植被渲染十分重要。

4.1章节的流程

这次修改场景的要求是在保证黑暗之魂3场景风格的基础上,尽量让场景光照看起来真实。

Daedalus51首先检查了场景:
场景的阳光比较强烈,但是天空却看上去很灰暗,场景的角落也比较黑,看来不真实。一些暗处的物体根本看不到细节。

存在问题:

  • 场景的阳光比较强烈,但是天空却看上去很灰暗,场景的角落也比较黑,看来不真实。一些暗处的物体根本看不到细节。
  • 很多材质开启曲面细分功能,但是曲面细分倍率设置的有问题。曲面细分还会导致物体再LightingOnly模式下不显示,所以Daedalus51把曲面细分关掉了。
  • 天空看来是淡黄色的,但天光却设置为蓝色(可以看得出建筑物有天光反弹的蓝色)。
  • 植被没有渲染细节阴影,但光照贴图分辨率却很高。

场景重置操作内容:

  • 重置方向光(去掉颜色,设置亮度为pi,设置间接光照强度为1,关闭Light Shalf Bloom
  • 重置级联阴影数值,但保留Dynamic Shadow Distance Stationary的参数)
  • 关闭材质的曲面细分功能
  • 重置世界设置中的LightMass设置。
  • 重置天光参数,亮度、颜色、间接照明强度。关闭半球固定色功能。
  • 重置后处理空间,并调整曝光数值。
  1. 检查场景,将一些参数重置。
  2. 调整LightMass设置中的天光反弹与间接光照反弹1=》10。
  3. 删除BP_SkySphere,加入Hdr贴图制作的天空球,并通过旋转与位移将天空球与太阳匹配。
  4. 关闭大气雾。
  5. 调整场景中物体的LightMapDensity(主要是降低,因为有一些物体不需要细节阴影,你无法从一片叶子上获得更多的视觉效果,而且可以解决TextureStreamPool溢出与烘焙时间长的问题)
  6. 因为调节了所有的光照贴图密度,所以还需要调节世界设置中的Packed Light And Shadow Map Texture Size。
  7. 调整天光,关闭指数雾气,让天光重新捕获场景。调整方向光的间接照明强度从1=》1.5,让场景更加有艺术感。
  8. 使用中级质量对场景进行烘焙。
  9. 在烘焙的时候作者检查了场景的BaseColor。
  10. 烘焙完成,进入LightingOnly检查烘焙结果。可以看得出光照烘焙得不错,但场景还是挺黑的,这说明BaseColor有问题。
  11. 在修改完所有BaseColor贴图与部分材质后,再次进行烘焙。并在烘焙过程中移除fake灯光。
  12. 作者将场景中的火炬资源整合成一个Actor蓝图(灯光、粒子、模型),同时将灯光的间接照明强度从1=》1.6。并再次使用中级质量进行烘焙。
  13. 在项目设置中勾选Accurate Velocities from Vertex Deformation选项解决TAA鬼影问题。
  14. 在4.6章节作者开始分析黑魂场景,并指出一些补光错误(黄色的太阳光、背景与雾气,但部分地面上却是蓝色的)
  15. 作者并不喜欢默认的BP_Sky_Sphere,他更喜欢Hdr天空。同时他给出一种使用FlowMap让Hdr天空变得动态的方法。(GDC14 顽皮狗的演讲)之后作者分享了一篇Ue4实现方案http://kedama.works/archives/5,但很明显这个方案还有巨大的改进空间。
    于是在4.6 55min左右,作者开始展示改进过的Shader,不过还是存在一个顶部图像破裂的bug。(这个内容我放在第二篇文章里)

调整前与调整后的LightMapDensity
image

image

有关体积光照贴图
Unreal会根据场景模型分布情况分配体积采样点(对于重要的地方可以通过添加体积的方式调整采样点间距),动态物体会根据这些采样点进行插值着色,来实现GI效果。但LightMass只会对静态物体进行采样,而完全忽略动态物体。

这里作者又提到了树,因为树不适合使用LightMass烘焙光照,因为树的结构复杂会导致烘焙时间长而且效果很差,但是如果不使用LightMass就不会有GI效果。所以作者想到了设置两组树,第一组静态用于烘焙体积光照贴图,之后在场景中隐藏。另一种动态用于在场景中展示。这样就解决上面说的问题。

但这样做不能算是个完美的方法,所以作者希望EPIC能开发让一些特定的动态物体影响空间探针的功能。

第一次烘焙完的结果
image
image

有关BaseColor
在检查BaseColor的过程中,发现地面的泥土材质的BaseColor太黑了(这个贴图的中间值为40,而达斯·维达那身黑乎乎的材质颜色Vec3(52,52,52)的中间值也至少为50)。具体的做法是调整亮度与饱和度。

所以作者对以下贴图进行修改:

  • 调整了泥土贴图,40=》81
  • 调整了地面的砖石贴图,70=>104
  • 调整了台阶贴图
  • 调整了柱子贴图,68=》104
  • 调整了砖墙贴图,97=》125
  • 调整了墙体贴图的金属部分,黑色=》中灰色
  • 等场景中的其他贴图

作者不建议固有色的中间值低于50或者高于230。

image

4.5章节作者额外补充一些东西,个人强烈建议大家去看一下,虽然物理灯光因为引擎存在Bug没有讲完。

首先作者介绍了一下GPULightMass,可以看得出烘焙速度非常快。这次作者演示的场景比较简单,但包含了室内与室外部分,非常适合讲解新的物理灯光系统。

使用物理灯光的原因

之前版本中Unreal4的灯光使用的是虚幻单位,这是的之前版本的灯光没有一个物理值的衡量标准。你很可能会因为后处理空间、曝光等因素影响而无法设置出正确的亮度值。例如:你已经将一个区域的效果调整的很自然,但是别的区域就会很奇怪(bloom、阴影、光照等效果互相不匹配)。 而前人已经积累了大量的摄影知识与经验,所以我们没有必要光靠感觉来设置灯光亮度与曝光度,而需要使用摄影标准来设置灯光,从而使得场景更加真实。

环境设置

天光

类型:static 关闭半球固定色

方向光

级联阴影的动态阴影距离设置为12000

天空球

引擎天空球模型+Hdr图+对应材质,具体参考第二篇文章写的内容。

后处理空间

保持默认

LightMass设置

静态光照细节缩放等级0.1 光线反弹次数10 天光反弹次数10 间接照明质量4 间接照明平滑0.8 ## 视频中的操作过程 ### 使用摄像机参数来调整曝光度 所以我们能做的第一件事情就是通过sunny16原则来设置相机。 具体步骤为:在后处理空间——曝光中将模式改成手动,之后按照sunny16原则的户外晴天数值来设置Camera属性。
image

设置天空球亮度

但此时画面还是黑乎乎的,这说明场景中的灯光强度太弱了。此时你直接调整天光强度是无效的,因为默认的天光是场景捕获模式。此时设置天空球亮度(设置材质),在视频中亮度提升到68000左右达到了一个不错的效果。这个时候再进行烘焙,模型的样子就不再是黑乎乎的了。 >使用像素检测器,可以检查对应像素的光照强度
image
image
image
image

设置方向光

将方向光亮度设置为75000(阴天中午),再次烘焙光照。 此时场景出了些问题,金属反射不正常(屏幕空间反射)。可能是作者用的版本对于物理灯光的支持不太好。

设置室内曝光度

按照sunny16原则的室内数值来设置Camera属性。但是通过相机参数来调整曝光度有个问题:那就是曝光度是固定死的,无法根据场景亮度进行自适应。这里作者吐槽自适应曝光不能使用物理参数(这个问题目前版本已经解决)

image

作者登录了一个灯光供应商的网站,网站上提供个灯光的详细参数,有亮度、色温等。 之后作者讲解了坎德拉与流明这种光照单位,这里可以参考日天大佬的文章。 之后作者展示了点光源切换坎德拉与流明,但是效果却不一样的问题。(作者使用的版本是4.19)也因为这个原因作者没有继续讲解物理灯光流程,着实可惜。

在4.6章节,作者推荐了这篇文章。我看了一下挺不错的,所以我会在第五篇文章中对其进行简单翻译,原文地址:
https://80.lv/articles/setting-lighting-in-unreal-engine-4-20/

LightMass Debug

在构建选项里有一个Use Error Coloring选项,可以用来标记UV不合格的物题,但在产品级质量构建中则不会显示这些Debug标记。

静态光照流程及属性总结

这些内容主要来自于《Lighting with Unreal Engine Masterclass》、《解密照片级表现技巧(一些关于UE4建筑表现的废话)》以及李文磊的《在UE4中实现灯光之美》

Min LightMap Resolution(静态模型Detials)

控制UV块之间Padding值。良好的Padding值可以减少像素浪费以及、提高阴影效果(在固定LightMap分辨率下)。Min LightMap Resolution应该被设置为小于或者等于LightMap Resolution的值。(作者一般直接设为与LightMap Resolution相等的值)

image

Export Resolution Scale

缩放导出此材质属性时的分辨率。当需要细节时,这对于提高材质分辨率非常有用。

第一幅图像中使用了一个小光源,但是光照图的分辨率太低,无法捕捉到清晰的半透明阴影。第二幅图像中,材质导出的分辨率过低(由Export Resolution Scale控制),无法捕捉到清晰的阴影。
image
image
image

Num Indirect Lighting Bounce(世界设置)

许多用户喜欢把这个值提高到 100 次,不过好在这个对烘焙时长影响不大,但同时对光照质量影响也不大。实际使用这个值设置为 3 - 5 次就足够了。

下面是对比数据:

image
image
image
image
image

Static Lighting Level Scale(世界设置)

改变lightmass的级别。默认值为 1,越小细节越多,最终我们使用 0.1。

其原理是增加单位的区域的采样点的量。但这样会产生大量噪点。

image
image
image
image

Indirect Lighting Smoothness(世界设置)

该值大于1是会对LightMap进行平滑处理(反之会进行锐化),过高的数值会导致漏光现象。对于这个属性作者建议设置为0.7~1。

Indirect Lighting Quality(世界设置)

增加进行final gathering运算时的采样光线量。提高数值可以减少间接照明时的噪点,但代价是极大地增加构建时间。

image
image
image
image

Lighting Build Quality(在构建下拉按钮中)

调整LightMass烘焙质量的总开关。用于整体调整烘焙质量,对烘焙时长影响很大。

  • Preview(耗时 2 分 16 秒)预览级
  • Medium(耗时 7 分 48 秒)中级
  • High(耗时 13 分 58 秒)高级
  • Production(耗时 30 分 22 秒)产品级

作者的习惯:大部分的工作时间都使用预览级,有时会切换到中级进行效果预览。在周末可能会切换到高级或者产品级进行烘焙来查看效果。

Lighting Level Scale与Indirect Lighting Quality的设置技巧

保持Static Lighting Level Scale × Indirect Lighting Quality = 1。你就可以得到一个噪点较少的场景。

Volume Light Sample Scale

减少Static Lighting Level Scale会增加这些空间采样样本(密度)。

添加LightMass Portal提高室内场景光照质量

给室内场景中的窗户添加LightMass Portal,以此可以减少噪点。

其原理是模拟天光效果,向室内发射光子。但也因此会在增加发射光子阶段(渲染过程中)的时间。

Lighting Scenarios

在游戏制作过程中,有时会存在同一场景使用多套Lightmap的情况,如:模拟天气系统,以及一天中不同时段的光照等。在Unreal 4引擎中,可以利用Lighting Scenarios功能达到此效果。使用Lighting Scenarios时,首先需要创建不同的光照Level,然后在Level设置页面将其设置为Lighting Scenario类型,如下图所示:

image

另外,设置Level的加载方式为使用Blueprint加载:

image

接着,对不同Level设置不同的光照进行烘焙。烘焙结束后,在Persistent Level Blueprint中,添加Load Stream Level节点对Level进行加载,并设置要加载的Level名称Day,如下图所示:

image

BaseLightmass.ini参数

如果你是做室内效果,Ue4默认设置的GI可能无法满足你的需求。你可以选择修改引擎配置文件BaseLightmass.ini的参数。以下内容个人感觉给的数值过于巨大,将耗费大量时间,请大家酌情使用。

NumHemisphereSample:半球采样数,默认值16,想要更好的效果可以给128。
Num Irradiance Calsulation Photons:参与照度计算光子的数量,默认是400,如果不满足效果可以给2048甚至更多。

结论就是数值越高,消除的BUG越多,当然花费时间越长,所以国外大神给出了一组不同阶段的测试参数,用来平衡时间与质量。

测试渲染

  • NumHemisphereSamples = 64
  • IndirectPhotonDensity = 3000
  • IndirectIrradiancePhotonDensity = 1500
  • IndirectPhotonSearchDistance = 180

进一步渲染

  • NumHemisphereSamples = 128
  • IndirectPhotonDensity = 6000
  • IndirectIrradiancePhotonDensity = 3000
  • IndirectPhotonSearchDistance = 180

最终渲染

  • NumHemisphereSamples = 256 or 512 (above 512 will have not much difference)
  • IndirectPhotonDensity = 12000 (If there are still flickers of artificial lighting, increase this value along with the parameter below)
  • IndirectIrradiancePhotonDensity = 8000
  • IndirectPhotonSearchDistance = 180 (180 - 240)

image
默认设置

image

使用GPULightMass

使用LightMass烘焙光照往往比较慢,所以你可以尝试使用GPULightMass。

论坛中的GPULightMass主题:
https://forums.unrealengine.com/development-discussion/rendering/1460002-luoshuang-s-gpulightmass

日天大佬写的简单使用说明:
https://zhuanlan.zhihu.com/p/71584366

如果想要最新版本可以在UnrealEngine的github分支中找到。

最终渲染效果提升

这一步视项目需求与目标平台性能而定。

反射质量

在控制台中输入r.SSR.Quality 4

如果电脑性能较强,可以修改引擎Shader文件夹中的ScreenSpaceReflections.usf这个文件。在最高质量4中的参数步数以及射线数都是12,12。你显卡牛逼的话都调成64。吃不消就往下调。反正你会发现你的帧数会有明显变化。没有效果,那么修改完usf文件后,退出引擎重新进一次,然后控制台输入r.SSR.Quality 4。

抗锯齿

在控制台中输入r.PostProcessAAQuality 6