区别
-
由于静态灯仅使用光照贴图,因此在游戏玩法之前将其阴影烘焙。这意味着它们不能影响移动(动态)对象,在游戏过程中不会以任何方式改变,正如我们在示例中看到的那样。但是,当照明也是静态的对象时,它们能够产生区域(接触)阴影。这是通过调整Source Radius属性来完成的。但是,应该注意的是,接收柔和阴影的表面可能必须正确设置其光照贴图分辨率才能使阴影看起来很好。
静态灯的主要用途是用于移动平台上的低功耗设备。 -
固定灯是用于保持在一个位置的灯,但能够以其他方式改变,例如亮度和颜色。这是他们与静态灯不同的主要方式,静态灯在游戏过程中不会以任何方式改变。但是,应该注意,运行时亮度的变化只会影响直接照明。间接(反弹)照明,因为它是由Lightmass预先计算的,不会改变。
在三种光线移动中,固定光源往往具有最高质量,中等可变性和中等性能成本。
固定灯的所有间接照明和阴影都存储在Lightmap中。直接阴影存储在Shadowmap中。这些灯使用了距离场阴影,这意味着即使在点亮的物体上具有相当低的光照贴图分辨率,它们的阴影也可以保持清晰。 -
可移动灯光投射出完全动态的光线和阴影,可以改变位置,旋转,颜色,亮度,衰减,半径以及几乎所有其他属性。他们投射的光线都没有被烘焙到光照贴图中,目前它们不能有任何间接照明。
-
固定灯和静态光一样将其间接照明存储在光照贴图中。间接照明不能在运行时通过改变亮度和颜色来改变,就像直接照明一样。这意味着即使灯具有未选中的Visible,其间接照明也将在灯光构建期间放入灯光图中。灯光上的IndirectLightingIntensity可用于在照明构建时缩放或禁用给定灯光的间接照明。
然而,有一个名为IndirectLightingIntensity的后期处理音量设置,它允许您缩放灯光图对所有灯光的贡献,可以在运行时从蓝图中更改。
动态阴影
固定光
光源的实时阴影具有主要的性能成本。具有阴影的完全动态光通常比无阴影的动态光花费二十倍(20倍)渲染。出于这个原因,固定灯能够在静态物体上产生静态阴影,但有一些限制。
-
动态对象(如静态网格组件和具有可移动设置的SkeletalMeshComponents)必须从距离场阴影映射集成到静态阴影中。这是通过每个物体的阴影来完成的。每个可移动的物体从静止的光中产生两个动态阴影:一个处理投射到物体上的静态世界的阴影,一个处理投射到世界上的物体的阴影。在这种设置下,固定光源的唯一阴影成本来自它所影响的动态对象。这意味着,根据有多少动态对象,成本可以从很小到很大。有了足够多的动态对象,使用可移动的光会更有效。
-
方向固定光(Directional Stationary Lights)的特殊之处在于,它们通过级联阴影映射支持整个场景的阴影,同时也支持静态阴影。这是非常有用的水平与许多动画树叶;你想要在玩家周围有移动的阴影,但又不想为覆盖大范围的视野而付出很多级联的代价。动态阴影在距离上逐渐消失为静态阴影,因此过渡常常难以区分。要设置此设置,只需更改动态阴影距离静止光的方向光静止为您希望褪色发生的范围。
即使在方向灯上使用级联阴影映射,可移动组件仍然会创建PerObject阴影。这种行为在动态阴影距离较小的情况下是有用的,但是在较大的距离下会产生不必要的开销。若要禁用PerObject阴影并保存性能,请禁用对灯光上的可移动对象使用Inset阴影。
动态光
- 动态灯光设置投阴影使用整个场景的动态阴影,这有一个显着的性能成本。性能成本主要来自于光影响的网格数,以及这些网格的三角形计数。这意味着投射大半径可移动光的阴影成本将是小半径可移动光成本的许多倍。
动态光lightmap缓存
当一个点或聚光灯不移动时,我们可以从阴影映射中存储该光并在下一帧中重用它。这使得阴影投射可移动的点和聚光灯在环境通常不移动的游戏中更便宜。阴影贴图缓存应该是任何UE4项目中自动启用的功能。要检查并查看使用阴影贴图缓存获得的性能,可以通过执行以下操作启用和禁用阴影贴图缓存:
选择要在项目级别中投射动态阴影的所有灯光。
按Backtick(`)键打开控制台并键入Stat Shadowrendering以查看动态阴影的当前成本。
再次按Backtick(`)键打开控制台并键入r.Shadow.CacheWholeSceneShadows 0以禁用动态阴影缓存
请务必记下CallCount和InclusiveAug部分中的数字
现在再次按Backtick键打开控制台并键入r.Shadow.CacheWholeSceneShadows 1以重新启用阴影缓存。如果您比较CallCount和InclusiveAug数字,您可以看到此功能对动态阴影性能的影响。
虽然阴影映射缓存可以降低在UE4项目中使用动态阴影的成本,但是如果与不支持的特性一起使用,则存在一些限制,可能会导致呈现构件。
默认情况下,缓存只能在对象满足以下要求时才会发生:
- Primitives被设置为静态或固定。
- 在水平面上使用的材料不使用世界位置偏移量。
- 光需要是一个点或聚光灯,移动设置为可移动,并启用阴影投射。
- 灯光必须保持在一个位置。
- 使用动画镶嵌或像素深度偏移的材质在缓存阴影深度时可能会导致伪影。