间接光照缓存

尽管Lightmass 可以生成静态对象上的间接光照的光照贴图,但像角色这样的动态对象 也需要一种接收间接光照的方法。这个问题可以通过 Indirect Lighting Cache(间接光照缓存) 解决, 它在构建光照时使用Lightmass生成的样本来计算动态对象在运行时的间接光照。

diffuse_no_indirect.png

Elemental(元素)关卡中没有应用 间接光照缓存 的漫反射光照

diffuse_indirect.png

应用了 间接光照缓存 的漫反射光照

工作原理

从高层次的角度来看:

  • Lightmass把光照样本放置到关卡的各个位置处,并在光照构建过程中计算它们的间接光照。

  • 当要渲染一个动态对象时, 间接光照缓存 会检查那个对象是否已经有了可用光照, 如果有则使用这些光照。

  • 如果没有任何光照可用 (该对象是全新的或移动了很多), 间接光照缓存 会插值预计算的光照样本。Lightmass在朝上的表面上放置高密度的光照样本, 其它地方则放置低密度的光照样本。样本仅限于在 LightmassImportanceVolume 中,且他们仅能放置在静态表面上。

lighting_samples.png

使用 r.Cache.DrawLightingSamples 1 来可视化地查看Lightmass生成的光照样本。

这个工作流程的目标是进行尽可能少的内容设置。然而,有时候,这种放置方式 不能在浮在空中的区域上呈现足够的细节,比如,一个角色乘坐的升降机或 飞行物。您可以把 LightmassCharacterIndirectDetailVolumes 放在这些区域的周围来获得更多的细节。

这里的这个花托是个InterpActor,并显示了 5x5x5大小的插值位置。

interpolation_points.png

由于仅当对象进行了很大的移动导致光照样本无效了时才会发生插值,因此缓存会分离。注意,这些位置距离对象的边界 是很远的,这是为使得当该对象在世界中到处移动时可以产生连续的、稳定的光照。 大多数对象实际上会获得 3x3x3 的插值位置。光照数据是2波段SH(就像光照贴图一样), 为法线贴图提供了足够的方向信息,使其有效。之前,这个工作是由 DynamicLightEnvironments 处理的。 这个实现的产生主要视觉效果差异是: 在一个对象上不止有一个样本,插值时 没有时间延迟。

预览未构建的光照

间接光照缓存也允许预览没有构建光照的对象。对于较小的对象,它的效果非常好, 对于像建筑物或地面这样较大的对象就不是很好了。当您移动一个构建了光照的静态网格物体时,它将会自动地 切换到间接光照缓存,直到进行下一次构建光照为止。

这是复制的其中一根柱子,它在预览时获得间接光照,而不是黑色的。注意在游戏中, 未构建光照的柱子仍然是黑色的。

unbuilt.png