本页面介绍了有助于加快项目中阴影渲染速度的优化技术。
影响阴影渲染时间的因素包括:
投射阴影的可见对象的数量。此数量取决于最大距离 (Max Distance) 属性。
接受阴影的可见对象的数量。
投射阴影的光源的数量。
级联数量 (Cascade Count) 属性值和级联拆分的大小。
主光源和其他光源的阴影分辨率。
下文将介绍如何使用这些以及其他设置来优化阴影渲染性能。
可使用以下技术之一来优化主光源投射的阴影。
使用阴影级联功能可在不增加阴影贴图分辨率的情况下提高阴影的视觉保真度。
选择级联数量 (Cascade Count) 值时,应考虑阴影级联性能影响。
使用柔和阴影 (Soft Shadows) 属性,可以在较低的阴影分辨率值下实现更高的视觉保真度。
柔和阴影 (Soft Shadows) 属性可能会对使用基于瓦片渲染的平台(例如移动平台和不受约束的__ XR__虚拟现实(VR)、增强现实(AR)和混合现实(MR)应用的泛指术语。支持这些形式的交互式应用程序的设备可被称为 XR 设备。更多信息
See in Glossary 平台)产生重大性能影响。如果目标平台使用了基于瓦片渲染,请对应用程序进行性能分析以确定此设置产生的性能影响。
作为一种艺术技巧,您可以结合使用较低的阴影分辨率和柔和阴影 (Soft Shadows) 选项。虽然较高的阴影分辨率可以使阴影更加细节化,但也使阴影看起来清晰,这可能不适合所有的艺术风格。
例如,在下图中,左侧图像的阴影分辨率为 4096 像素,而右侧图像的阴影分辨率为 1024 像素,同时启用了柔和阴影 (Soft Shadows) 选项。

较低的阴影分辨率可提供更柔和的阴影效果,这可能对有些场景有益。左:分辨率 4096 像素,右:分辨率 1024 像素。
有关优化分辨率和阴影与主光源的最大距离的更多信息,请参阅在 URP 中配置阴影分辨率。
可使用以下技术之一来优化其他光源投射的阴影。
要创建点光源的阴影贴图,Unity 会从六个方向捕捉场景。此操作的性能影响与渲染六个聚光灯的阴影相当。在移动平台上,这在每帧上会占用大量的可用资源。
减少移动平台上投射阴影的点光源的数量,或完全避免使用。
有关更多信息,请参阅以下页面:
为了提高性能,可以使用脚本根据到摄像机的距离或其他条件来关闭阴影投射实时光源。为此,请使用 Light.enabled 属性。
为了避免光照突现,可以对光源的 intensity 属性应用淡入和淡出效果。
有关此技术的示例,请参阅通用 3D 示例项目中附加到花园场景中室外灯笼中的点光源的DynamicLightController.cs脚本。
在对象多为静态的区域,带有光照剪影的点光源或聚光灯可以替代投射实时阴影的光源。
要配置光源剪影,请使用光源 (Light) 组件的剪影 (Cookie) 属性。
有关更多信息,请参阅剪影简介。
通过光源资源管理器 (Light Explorer) 窗口可以便捷地总览场景中的所有光源、反射和光照探针以及具有发光材质的对象。此工具可用于快速查找场景中具有特定属性的光源。
本节包含非特定于主光源或其他光源的一般优化技巧。
实时阴影投射对象的数量会对阴影渲染性能产生重大影响。
要完全禁止对象投射阴影(烘焙阴影和实时阴影),请执行以下操作:
在游戏对象上,转到网格渲染器 (Mesh Renderer) > 光照 (Lighting)。
将投射阴影 (Cast Shadows) 属性设置为 关 (Off)。
要将游戏对象配置为仅投射烘焙阴影,请使用阴影遮罩 (Shadowmask) 光照模式。
阴影遮罩 (Shadowmask) 光照模式允许在运行时将烘焙阴影和实时阴影结合起来,从而提高阴影渲染性能。
有关阴影遮罩光照模式的一般信息,请参阅页面光照模式:阴影遮罩
Unity 使用以下条件来确定光源或游戏对象是否对阴影遮罩有影响:
光源的光照模式必须混合。
光源必须配置为投射阴影(光源的阴影类型 (Shadow Type) 属性不得为无阴影 (No Shadows))。
游戏对象必须是静态的。
如要在场景 (Scene) 视图中查看现有阴影遮罩:
在阴影遮罩中,由于其使用了四个通道(r,g,b,a),因此最多可以有四个光源重叠。如果区域中有四个以上的重叠混合光源,Unity 会将其他光源从混合模式切换到烘焙模式。
要查看影响特定区域的光源数量,请使用渲染调试器 (Rendering Debugger) 中的光照复杂度 (Lighting Complexity) 视图。
为了实现视觉保真度和性能的最佳平衡,可结合使用阴影遮罩 (Shadowmask) 模式与光照探针 (Light Probes)。
在中低端移动平台上,从性能角度来看,阴影遮罩 (Shadowmask) 模式可能是不错的选择。
在更高级别的移动平台或 PC 和游戏主机平台上,请考虑使用距离阴影遮罩 (Distance Shadowmask) 模式来实现更高的视觉保真度。
有关更多信息,请参阅页面光照模式:阴影遮罩。
当使用阴影遮罩光照模式时,可以配置特定游戏对象来影响烘焙阴影,而不是投射实时阴影。请按照以下步骤操作:
转到项目设置 (Project Settings) > 质量 (Quality),然后将阴影遮罩模式 (Shadowmask Mode) 属性设置为阴影遮罩 (Shadowmask)。
在此模式下,Unity 会对每个启用了贡献全局照明 (Contribute Global Illumination) 属性的游戏对象启用烘焙阴影。
在游戏对象上的网格渲染器 (Mesh Renderer) 组件中,将投射阴影 (Cast Shadows) 属性设置为开启 (On)。
在网格渲染器 (Mesh Renderer) 组件中,启用贡献全局光照 (Contribute Global Illumination)。
生成光照使更改生效。
现在,无论到摄像机的距离如何,Unity 都会在运行时使用烘焙阴影来渲染此游戏对象。
要让具有复杂网格的对象投射简单阴影,请执行以下步骤:
创建具有较少多边形的简化版网格。
给简化网格分配任意材质。材质无关紧要,因为 Unity 不会渲染此简化网格。
在原始网格上,将投射阴影 (Cast Shadows) 属性设置为关 (Off)。
将简化网格放置在与原始网格相同的位置。
在简化网格上,将投射阴影 (Cast Shadows) 属性设置为仅阴影 (Shadows Only)。
使用此配置后,Unity 会渲染原始网格,但会使用简化网格来渲染阴影。
可用以下 Unity 工具来对光照和阴影渲染进行性能分析:
如需更多详细信息,请根据目标平台使用特定于平台的性能分析器和调试工具。请参阅性能分析工具了解更多信息。