【UE4从零开始 083】体积光照贴图


Lightmass会生成表面光照贴图,用于静态对象上的间接光照。但是,动态对象(例如角色)也需要一种接受间接光照的方法。这种方法就是在构建时将所有点的预计算光照存储在名为 Volumetric Lightmap(体积光照贴图) 的空间中,然后在运行时用于动态对象的间接光照的插值。

今后 体积光照贴图 会取代 间接光照缓存体积光照样本

要重新启用间接光照缓存,可以打开 World Settings(世界场景设置) > Lightmass Settings(Lightmass设置) ,将 Volume Lighting Method(体积光照方法) 设置为 VLM Sparse Volume Lighting Samples(VLM稀疏体积光照样本)

间接光照缓存(旧方法) 体积光照贴图(新方法)
【UE4从零开始 083】体积光照贴图_第1张图片 【UE4从零开始 083】体积光照贴图_第2张图片

使用体积光照贴图渲染动态对象要比使用间接光照缓存渲染准确得多。

工作方式

概括起来,体积光照贴图是按下列方式工作的:

  • Lightmass将光照样本放置在关卡中的各个位置,并在光照构建期间为它们计算间接光照。
  • 当需要渲染动态对象t时,会将体积光照贴图与着色的每个像素进行插值运算,提供预计算的间接光照。
  • 如果没有构建的光照可用(也就是说对象是新的或者移动过多),就从 静态对象 的体积光照贴图将光照插值到每个像素,直至光照重构完成为止。

当放置 Lightmass Importance Volume(全局光照重要体积) 时,体积光照贴图会构建由4x4x4个单元格组成的砖块(光照样本)。运行Lightmass时,会将这些单元格放置在整个 Lightmass Importance Volume(全局光照重要体积) 上,然后在场景中的静态几何体周围使用更多单元格,以获得更好的间接光照结果。
【UE4从零开始 083】体积光照贴图_第3张图片

每个这样的点(或球体)都是一个体积光照贴图光照样本,它使用三阶球谐函数存储所有方向传来的光照。
【UE4从零开始 083】体积光照贴图_第4张图片
在 对象 附近,任何处于某个砖块中的静态几何体都将在间接光照变化最大的地方使用更多单元格。通过数据结构能够将间接光照插值到GPU上的任何空间点。

【UE4从零开始 083】体积光照贴图_第5张图片

(从左到右)一个Lightmass重要体积,在该体积中放置了一个静态网格体。静态几何体周围的单元格密度较高;砖块的一个面的表示示例,显示了4x4x4个单元格的布置;同样的单元格表示示例,光照构建期间存在静态几何体时密度较高。

启用体积光照贴图可视化

单击 Show(显示) > Visualize(可视化) > Volumetric Lightmap(体积光照贴图),使用 体积光照贴图 的视图模式在关卡视口中将光照样本可视化。

启用体积光照贴图视图模式 可视化体积光照贴图光照样本
【UE4从零开始 083】体积光照贴图_第6张图片 【UE4从零开始 083】体积光照贴图_第7张图片

如果在光照构建之后将体积光照贴图可视化,可以根据受影响的Lightmass重要体积中的单元格数量看出聚集在静态几何体周围的光照样本的密度。距离静态几何体较远的光照样本密度较低,因为它们附近没有几何体。

体积光照样本(旧方法) 体积光照贴图(新方法)
【UE4从零开始 083】体积光照贴图_第8张图片 【UE4从零开始 083】体积光照贴图_第9张图片

间接光照缓存仅将光照样本放置在静态几何体表面上方。体积光照贴图将样本高密度地放置在静态几何体周围,在间接光照变化最大的地方呈现更多细节。

预览未构建的光照

体积光照贴图允许预览有未构建的光照的对象。如果移动一个先前为其构建过光照的静态网格体,它会自动切换为体积光照贴图,直至下一次光照构建为止。

间接光照缓存(旧方法) 体积光照贴图(新方法)
【UE4从零开始 083】体积光照贴图_第10张图片 【UE4从零开始 083】体积光照贴图_第11张图片

可移动对象上的预计算光照

与整个组件只发生一次光照样本的插值的间接光照缓存不同,体积光照贴图允许内插至每个像素,从而可以呈现更多细节。这样可以实现可靠的细节分布,从而减少漏光现象。

间接光照缓存(旧方法) 体积光照贴图(新方法)
【UE4从零开始 083】体积光照贴图_第12张图片 【UE4从零开始 083】体积光照贴图_第13张图片

增加的体积光照贴图细节使角色更好地与环境融合。

间接光照缓存(旧方法) 体积光照贴图(新方法)
【UE4从零开始 083】体积光照贴图_第14张图片 【UE4从零开始 083】体积光照贴图_第15张图片

对于嵌入在任何静态几何体中的可移动Object,它提供了比间接光照缓存更好的静态Object光照匹配。

体积雾上的预计算光照

体积光照贴图使每个雾体素都有预计算光照内插到其在空间中的位置,从而支持了体积雾的静态光照应用。

静止光源的间接光照存储在光照贴图中,现在会影响雾。

点光源 无间接光线反射 点光源 有间接光线反射
【UE4从零开始 083】体积光照贴图_第16张图片 【UE4从零开始 083】体积光照贴图_第17张图片

天空光照现在也可以正确地投射阴影,防止室内区域变成大雾效果。

带自发光颜色的天空光照 天空光照体积光照贴图
【UE4从零开始 083】体积光照贴图_第18张图片 【UE4从零开始 083】体积光照贴图_第19张图片

静态光照的静态和自发光对雾的影响没有任何开销,因为它们全部都合并到体积光照贴图中了。

间接光照缓存:静态光照的静态和自发光(旧方法) 体积光照贴图:静态光照的静态和自发光(新方法)
【UE4从零开始 083】体积光照贴图_第20张图片 【UE4从零开始 083】体积光照贴图_第21张图片

设置

可以在 World Settings(世界场景设置)Lightmass Settings(Lightmass 设置) 下访问体积光照贴图设置。
【UE4从零开始 083】体积光照贴图_第22张图片

设置 说明
Volumetric Lighting Method(体积光照方法) 用于在Lightmass重要体积内的所有位置提供预计算光照的技术。
VLM Volumetric Lightmap(VLM体积光照贴图):在覆盖整个Lightmass重要体积的高级网格中计算光照样本。在几何体附近使用较高密度的网格。通过在GPU上逐像素进行高效的体积光照贴图插值,为动态Object和体积雾实现准确的间接光照。重要体积以外的位置复用体积光照贴图的边界纹素(限制寻址)。在移动平台上,在CPU上对每个Object的边界中心执行插值。
VLM Sparse Volume Lighting Samples(VLM稀疏体积光照样本):体积光照样本按中等密度放置在静态表面上,在Lightmass重要体积中的其他所有位置则按低密度放置。重要体积以外的位置则没有间接光照。这种方法要求CPU插值,因此使用间接光照缓存为每个动态Object内插结果,会增加渲染线程开销。如果使用此方法,预计算光照无法影响体积雾。
Volumetric Lightmap Detail Cell Size(体积光照贴图细节单元格大小) 最高密度(在几何体周围使用)下的体积光照贴图体素的大小,按世界场景空间单位计。这个设置对于构建时间和内存有很大影响,应该谨慎使用。
Volumetric Lightmap Maximum Brick Memory Mb(体积光照贴图最大砖块内存量) 要为体积光照贴图砖块数据花费的最大内存量。系统会丢弃高密度砖块,直至达到这一限制为止。先丢弃距离几何体最远的砖块。对内存裁减过多会导致分辨率不一致,因此最好用增大 Volumetric Lightmap Detail Cell Size(体积光照贴图细节单元格大小) 来代替。

性能

在考虑体积光照贴图的性能和内存使用时,应该考虑下列因素。

  • 第三人称视角角色上的体积光照贴图在PlayStation 4上会耗用0.02毫秒的GPU 时间。所有间接光照缓存渲染线程成本均已剔除。
  • 在Epic的《虚幻争霸》的巨岩殿地图上,使用间接光照缓存时的内存使用量是5Mb,而按默认 Detail Cell Size(细节单元格大小) 设置使用体积光照贴图时的内存使用量会增大到30Mb。内存使用量可以 在编辑器中 Stat Memory(统计内存) 命令下通过 Volumetric Lightmap Memory(体积光照贴图内存) 看到。

体积光照贴图与间接光照缓存对比

下面是间接光照缓存与体积光照贴图的详细对比:

预计算光照体积/间接光照缓存 体积光照贴图
在CPU上进行开销巨大的插值 在GPU上进行高效插值
逐个Object插值,在实例化组件上也不例外 逐像素插值
无法影响体积雾 对体积雾有效
仅在静态表面上高密度放置,导致低密度样本漏光 以高密度放置在所有静态表面周围
Lightmass重要体积以外为黑色样本 拉伸边界体素以覆盖Lightmass重要体积外部区域
支持关卡流送 当前不支持关卡流送

附加提示

如果在大型关卡中降低 Volumetric Lightmap Detail Cell Size(体积光照贴图细节单元格大小) 来获得更高的精度,则还需要增大 Volumetric Lightmap Maximum Brick Memory Mb(体积光照贴图最大砖块内存量)。否则,细节单元格将会被剔除,导致动态Object间接光照精度下降。

故障诊断

  • 为了增加样本数量已经降低了 Detail Cell Size(细节单元格大小),但是在静态几何体附近的样本密度低于所请求的密度。
    • 如果 Maximum Brick Memory(砖块最大内存) 过低,或者区域中的所有光照都几乎相等,细节砖块可能被剔除。
  • 光线透过墙壁漏到角色身上,但没有漏到附近的静态网格体上。
    • 当前解决漏光的唯一办法是降低 Detail Cell Size(细节单元格大小)(允许使用更多内存)或增加墙壁厚度。

你可能感兴趣的:(UE4从零开始)