投射阴影

lighting_overview_banner_001.png

阴影让您的世界产生对比,使得世界中的物体感觉更加真实,并营造一种氛围。静态阴影无论怎么渲染,实际上都几乎没有任何性能消耗,但是动态阴影是造成较大性能消耗的原因之一。本文介绍了虚幻引擎 4 中具有的四种类型的阴影投射。

静态光源

静态光源投射完全静态的阴影和光照,这意味着它们对动态对象不会产生 直接 影响(静态光照由于烘焙到了间接光照缓存中,所以会有 一些 影响),比如下图中的小铜人。

LI_StaticMeansStatic.png

左侧的铜人站在一个静态光源的光照中, 光源对该角色没有任何影响(没有光照也没有阴影);而右侧的角色位于一个固定光源的光照中。

方向光源级联式阴影贴图(全场景阴影)

定向固定光源 是特殊的,它们支持采用 联级阴影贴图(Cascaded Shadow Maps) 的全景阴影,同时作为静态阴影。这在具有很多带动画的植被的关卡是非常有用的;您想在玩家周围产生可以动的阴影,但是不想付出以让很多阴影重叠来覆盖较大的视图范围这样的代价。动态阴影会随着距离而渐变为静态阴影,但这种变换通常是很难察觉到。要想设置这样的处理,仅需把 DirectionalLightStationaryDynamic Shadow Distance StationaryLight 修改为您想让渐变发生的范围即可。

固定光源阴影

动态物体(比如 StaticMeshComponent 或 SkeletalMeshComponent)必须要从距离场阴影贴图中集成环境世界的静态阴影。这是通过使用 每个对象 的阴影完成的。每个可移动的对象从固定光源创建两个动态阴影:一个用于处理静态环境世界投射到该对象上的阴影,一个处理该对象投射到环境世界中的阴影。通过使用这种设置,固定光源唯一的阴影消耗就来源于它所影响的动态对象。这意味着,根据所具有的动态对象的数量不同,该性能消耗可能很小,也可能很大。如果足够多的动态对象,那么使用可移动光源会更加高效。

在下面的场景中,几个球体都是动态物体,它们即接收来自静态世界的阴影,也会投射它们自己的阴影,这些阴影和距离场阴影合并计算。每个可移动组件的的阴影锥体也显示在图上。

DynamicObjectShadowFrustums.png

由可移动组件形成的 一个物体 的阴影被用于该物体的边界框上,因此边界框必须是精确的。对骨骼网格体而言,这意味着需要有对应的物理资源(Physic Asset),对粒子系统而言,固定的边界框需要足够大来包含所有的粒子才行。

动态阴影

可移动光源在任何物体上都投射完全动态的阴影(和光照)。它的光照数据不会烘焙到光照贴图中,它可以自由地在任何物体上投射动态阴影。静态网格体、骨骼网格体、粒子特效等,都将会从可移动光源投射或接收阴影。

通常来说,投射可移动动态阴影的光源是性能消耗最大的。

阴影预览

在编辑一个固定光源或者静态光源时,光照信息会变成未构建状态,预览阴影 能够为您提供一个在光照构建后阴影的大致样子。

下图中,编辑器显示的阴影上带有 "Preview" 文本的样式,用来和已经存在的阴影表示区别。

UnbuiltShadows.png

当在重新构建光照信息前就在编辑器中运行游戏的话,预览的阴影会消失。因为这个预览只在编辑器中,而不会在 Play In Editor 时显示。

UnbuiltShadowsPIE.png

要从预览阴影中生成最终的阴影效果,则需要在编辑器的主工具栏的 构建 选项中选择 构建光照

BuiltShadows.png

可以在窗口的 显示/可视化 菜单中取消勾选 预览阴影显示 的选项来关闭此功能。

如果希望调整这个文本的光照函数材质,可以在这里找到:Engine/EditorMaterials/PreviewShadowIndicator

所有阴影类型同时存在

当把所有阴影类型放在一起时,每种类型的阴影都会利用其优势来弥补另一种类型阴影的劣势,从而可以快速地渲染出令人印象深刻的栩栩如生的视觉效果。

LO_Shadows_Footer.png