Unreal4 Lightmass 基础知识及间接光照缓存003
全局光照(Lightmass) 创建具有复杂光交互作用的光照图,例如区域阴影和漫反射。它用于预计算具有固定和静止运动性的光源的照明贡献部分。
Lightmass 重要体积
许多贴图在编辑器中已经网格化到网格的边缘,但是需要高质量照明的实际可玩区域要小得多。全局光照取决于关卡的大小发射光子,因此这些背景网格体将大大增加需要发射的光子数量,而照明构建时间也将增加。全局光照重要体积控制全局光照发射光子的区域,允许你将其集中在需要清晰间接照明的区域。在重要体积之外的区域在较低的质量下只能得到一次间接照明的反射。间接光照缓存
用于动态对象全局光照和未构建场景预览的缓存间接光照样本。
虚幻引擎4.18版发布后,[体积光照贴图]已替换间接光照缓存作为新的默认方法。
重新启动间接光照缓存的方法是打开 场景设置(World Settings)> Lightmass设置(Lightmass Settings)> 体积光照方法(Volume Lighting Method) 并设置 VLM稀疏体积光照样本(VLM Sparse Volume Lighting Samples)。
[Lightmass]可以在静态对象上生成间接光照的光照贴图,但角色之类的动态对象同样需要一种接收间接光照的方法。这能通过 间接光照缓存(Indirect Lighting Cache) 来解决,其在光照构建时用Lightmass生成的样本来计算动态对象在运行时的间接光照。
下图显示了带与不带间接光照缓存渲染的效果差异:Elemental关卡中的漫反射光照,不带 间接光照缓存。 拥有 间接光照缓存 的漫反射光照。
工作原理:
从高层次的观点来看:
Lightmass在关卡中放置光照样本,并在光照构建中计算其间接光照。
当涉及到动态对象的渲染时间时,间接光照缓存 将确认此对象是否已拥有可用光照;如有,则进行使用。
如无光照可用(对象为全新、或移动量过大),间接光照缓存 将从预计算光照样本内插光照。
使用 展示(Show)->显示(Visualize)->体积光照样本(Volume Lighting Samples) 来显示Lightmass生成的光照样本。
此工作流的目的是尽量减少内容设置。但有时这种放置启发法会使漂浮在空中的区域缺少细节(例如玩家乘坐的升降电梯或飞行物)。可将 LightmassCharacterIndirectDetailVolumes 放置在这些区域的周围来获取更多细节。
运行时,间接光照缓存 将把光照样本内插到每个可移动对象周围的位置。可移动对象即是"移动性"设为"可移动"的所有组件。
图中的螺绕环便是一个可移动静态网格体,显示了5x5x5的插值位置。对象移动距离足以触发内插时才会进行内插,因此缓存会进行命名。注意:这些位置离对象的边界很远。以便对象在场景中移动时形成连续而稳定的光照。多数对象实际将获得3x3x3的插值分辨率。体积光照样本保存定向间接光照(其使法线贴图能正常工作)。
预览未构建的光照
间接光照缓存还能预览未构建光照的对象。它在较小的物体上效果极佳,但在较大的网格体上效果不佳(如建筑或地面)。移动已构建光照的静态网格体时,其将自动切换至间接光照缓存,直至下次光照构建。
此处有一根复制的柱子,其获得间接光照以便预览,而非完全隐藏在黑暗之中。体积光照贴图
用于动态对象及预览未构建场景的全局光照的体积光照样本。
体积光照贴图将逐渐取代[间接光照缓存]和体积光照取样。
要重新启用间接光照缓存,可以打开 世界场景设置(World Settings) > Lightmass设置(Lightmass Settings),将 体积光照方法(Volume Lighting Method) 设置为 VLM稀疏体积光照样本(VLM Sparse Volume Lighting Samples)。
Lightmass会生成[表面光照贴图],用于表现静态对象上的间接光照。但是,动态的对象(例如角色)也需要一种接受间接光照的方法。这种方法就是在构建时将所有点的预计算光照存储在名为 体积光照贴图 的空间中,然后在运行时用于动态Object的间接光照的插值。
稀疏体积光照取样决定了漏光程度和光照精确性。体积光照贴图在这方面做了改进。工作方式
概括起来,体积光照贴图是按下列方式工作的:
Lightmass将光照样本放置在关卡中的各个位置,并在光照构建期间为它们计算间接光照。
当需要渲染动态Object时,就将体积光照贴图内插到着色的每个像素,提供预计算的间接光照。
如果没有构建的光照可用(也就是说Object是新的或者移动过多),就从 静态 Object的体积光照贴图将光照内插到每个像素,直至光照重构完成为止。
在Object附近,任何处于某个砖块中的静态几何体都将在间接光照变化最大的地方使用更多单元格。通过数据结构能够将间接光照内插到GPU上的任何空间点。 (从左到右)一个Lightmass重要体积,在该体积中放置了一个静态网格体。静态几何体周围的单元格密度较高;砖块的一个面的表示示例,显示了4x4x4个单元格的布置;同样的单元格表示示例,光照构建期间存在静态几何体时密度较高。
启用体积光照贴图可视化
单击 显示(Show) > 可视化(Visualize) > 体积光照贴图(Volumetric Lightmap),使用 体积光照贴图 的视图模式在关卡视口中将光照样本可视化。
Snipaste_2021-05-07_19-28-12.png 如果在光照构建之后将体积光照贴图可视化,你可以根据受影响的Lightmass重要 体积中的单元格数量看出聚集在静态几何体周围的光照样本的密度。距离静态几何体较远的光照样本密度较低,因为它们附近没有几何体。
预览未构建的光照
体积光照贴图允许预览有未构建的光照的Object。如果移动一个先前为其构建过光照的静态网格体,它会自动切换为体积光照贴图, 直至下一次光照构建为止。可移动Object上的预计算光照
与整个组件只发生一次光照样本的插值的[间接光照缓存]不同,体积光照贴图允许内插至每个像素,从而可以呈现更多细节。这样可以实现可靠的细节分布,从而减少漏光现象。体积雾上的预计算光照
体积光照贴图使每个雾体素都有预计算光照内插到其在空间中的位置,从而支持了体积雾的静态光照应用。
静止光源的间接光照存储在光照贴图中,现在会影响雾。
天空光照现在也可以正确地投射阴影,防止室内区域变成大雾效果。
静态光照的静态和自发光对雾的影响没有任何开销,因为它们全部都合并到体积光照贴图中了。
性能
在考虑体积光照贴图的性能和内存使用时,应该考虑下列因素。
第三人称视角角色上的体积光照贴图在PlayStation 4上会耗用0.02毫秒的GPU 时间。所有间接光照缓存渲染线程成本均已剔除。
在Epic的《虚幻争霸》的巨岩殿地图上,使用间接光照缓存时的内存使用量是5Mb,而按默认 细节单元格大小(Detail Cell Size) 设置使用体积光照贴图时的内存使用量会增大到30Mb。内存使用量可以 在编辑器中 统计内存(Stat MapBuildData) 命令下通过 体积光照贴图内存(Volumetric Lightmap Memory) 看到附加提示
如果你在大型关卡中降低 体积光照贴图细节单元格大小(Volumetric Lightmap Detail Cell Size) 来获得更高的精度,则还需要增大 体积光照贴图最大砖块内存量(Volumetric Lightmap Maximum Brick Memory Mb)。否则,细节单元格将会被剔除,导致动态Object间接光照精度下降。
关卡流送要求所有关卡(包括固定关卡和所有子关卡)都在同一时间构建,否则流送进来的关卡将无法正确注册。流送关卡主要是一种内存优化手段,细节最丰富的砖块体积会合并成一个尺寸更大的立方体体积(长宽高一样长、),而非盒型体积(长宽高不同)。细节最丰富的砖块会和距离最近的子关卡一起流送,而更高级别的关卡总是固定的。在那些包含实际几何体的关卡中,大部分数据都会进入那些细节最丰富的关卡砖块。假如关卡填满了几何体,那么体积中看起来是空的(或者"浪费的")空间就不应受到太多关注。当前系统使用单张体积纹理,这意味着我们对空的空间没有太多办法,因为我们不支持使用多张体积纹理,无法使用重叠和混合功能。
故障诊断
为了增加样本数量已经降低了 细节单元格大小(Detail Cell Size),但是在静态几何体附近的样本密度低于所请求的密度。
如果 砖块最大内存(Maximum Brick Memory) 过低,或者区域中的所有光照都几乎相等,细节砖块可能被剔除。
光线透过墙壁漏到角色身上,但没有漏到附近的静态网格体上。
当前解决漏光的唯一办法是降低 细节单元格大小(Detail Cell Size)(允许使用更多内存)或增加墙壁厚度。