Shader Stripping
通用渲染管线(URP)中的着色器使用了许多着色器关键字(Shader Keywords)来支持多种不同功能,这通常会导致 Unity 编译大量的着色器变体。
如果你在 URP 资源(URP Asset) 中禁用了某些功能,URP 会自动排除(“剥离”)相关的着色器变体,从而加速构建并减少内存使用和文件体积。
例如,如果你的项目不使用方向光(Directional Light)的阴影,但默认情况下 Unity 仍会将支持方向光阴影的变体包含在构建中。若你在 URP Asset 中禁用 Cast Shadows,URP 将剥离这些变体。
若你想查看 URP 中负责剥离着色器的代码,可以参考 Editor/ShaderPreprocessor.cs
文件。该文件使用了 IPreprocessShaders API。
想了解更多关于着色器变体剥离的信息,可参阅以下内容:
- 检查项目中的着色器变体数量
- 标准的着色器变体剥离指导,适用于所有渲染管线
剥离功能相关的着色器变体
默认情况下,URP 会同时编译功能开启和功能关闭这两类变体。
为了减少变体数量,你可以在 URP Global Settings 中启用 Strip Unused Variants,并根据以下方法进行操作:
- 在构建中所有 URP 资产中均禁用某功能,这样 URP 仅保留禁用该功能时的变体。
- 在构建中所有 URP 资产中均启用某功能,这样 URP 仅保留启用该功能时的变体。
如果你禁用 Strip Unused Variants 设置,URP 将无法剥离功能关闭时的变体,这可能会导致变体数量增加。
禁用某项功能
若要使 Unity 剥离(Strip)与某功能相关的变体,必须在构建中使用的所有 URP 资源(URP Assets)中都禁用该功能。
Unity 会将以下 URP 资源包含到构建中:
- 在图形设置中作为默认渲染管线资源(Render Pipeline Asset)指定的 URP 资源。
- 在质量设置中启用、并为当前构建目标指定了“渲染管线资源(Render Pipeline Asset)”的 URP 资源。
避免在构建中包含使用不同渲染路径的 URP 资源,因为这样会使 Unity 针对每个关键字创建两个变体集合。
功能 | 如何禁用 | 剥离的着色器关键字 | 渲染路径 |
---|---|---|---|
Accurate G-buffer normals | 在 URP 资源中禁用 Accurate G-buffer normals。对使用 Vulkan 图形 API 的平台无效。 | _GBUFFER_NORMALS_OCT |
Deferred |
Additional lights | 在 URP 资源的 Lighting 部分,禁用 Additional Lights。 | _ADDITIONAL_LIGHTS , _ADDITIONAL_LIGHTS_VERTEX |
Forward |
Ambient occlusion | 在所有 URP 资源所使用的 Renderer 中移除 Ambient Occlusion Renderer Feature。 | _SCREEN_SPACE_OCCLUSION |
Forward & Deferred |
Decals | 在所有 URP 资源所使用的 Renderer 中移除 Decals Renderer Feature。 | _DBUFFER_MRT1 , _DBUFFER_MRT2 , _DBUFFER_MRT3 , _DECAL_NORMAL_BLEND_LOW , _DECAL_NORMAL_BLEND_MEDIUM , _DECAL_NORMAL_BLEND_HIGH , _DECAL_LAYERS |
Forward & Deferred |
Fast sRGB to linear conversion | 在 URP 资源的 Post-processing 部分,禁用 Fast sRGB/Linear conversions。 | _USE_FAST_SRGB_LINEAR_CONVERSION |
Forward & Deferred |
Holes in terrain | 在 URP 资源的 Rendering 部分,禁用 Terrain Holes。 | _ALPHATEST_ON |
Forward |
Light cookies | 在项目中所有光源(Light)上移除Cookie 纹理。 | _LIGHT_COOKIES |
Forward & Deferred |
Rendering Layers for lights | 禁用光源的渲染层(Rendering Layers)。 | _LIGHT_LAYERS |
Forward & Deferred |
Reflection Probe blending | 禁用反射探针混合(Probe Blending)。 | _REFLECTION_PROBE_BLENDING |
Forward & Deferred |
Reflection Probe box projection | 禁用Box Projection。 | _REFLECTION_PROBE_BOX_PROJECTION |
Forward & Deferred |
Render Pass | 在所有 URP 资源使用的 Renderer 中禁用 Native Render。 | _RENDER_PASS_ENABLED |
Forward & Deferred |
Shadows from additional lights | 在 URP 资源的 Additional Lights 部分,禁用 Cast Shadows。 | _ADDITIONAL_LIGHT_SHADOWS |
Forward & Deferred |
Shadows from the main light | 在 URP 资源的 Main Light 部分,禁用 Cast Shadows。Unity 所剥离的关键字取决于你的具体设置。 | _MAIN_LIGHT_SHADOWS , _MAIN_LIGHT_SHADOWS_CASCADE , _MAIN_LIGHT_SHADOWS_SCREEN |
Forward & Deferred |
Soft shadows | 在 URP 资源的 Shadows 部分,禁用 Soft shadows。 | _SHADOWS_SOFT |
Forward & Deferred |
剥离后处理(Post-processing)着色器变体
在 URP Global Settings 中启用 Strip Unused Post Processing Variants,可剥离项目中未使用的后处理着色器变体。
例如,如果你的项目仅使用 Bloom 效果,那么 URP 会保留 Bloom 变体,但剥离所有其他后处理变体。
Unity 会在项目中所有场景(Scenes)中查找后处理组件,因此,单纯地将一个场景从构建中移除而仍保留在项目中,并不能达到剥离该场景所用变体的目的。
移除的后处理 | 剥离的着色器关键字 |
---|---|
Bloom | _BLOOM_HQ , BLOOM_HQ_DIRT , _BLOOM_LQ , BLOOM_LQ_DIRT |
Chromatic Aberration | _CHROMATIC_ABERRATION |
Film Grain | _FILM_GRAIN |
HDR Grading | _HDR_GRADING |
Lens Distortion | _DISTORTION |
Tonemapping | _TONEMAP_ACES , _TONEMAP_NEUTRAL , _TONEMAP_GRADING |
若你并未针对“大量多显示屏(‘cluster’ displays)”进行后处理屏幕坐标覆盖,则建议在 URP Global Settings 中启用 Strip Screen Coord Override Variants。
剥离 XR 和 VR 着色器变体
如果你未使用 XR 或 VR,可禁用 XR 与 VR 模块,从而使 URP 剥离其标准着色器中与 XR/VR 相关的变体。
使用自定义 Renderer Feature 时移除变体
若你创建了自定义 Renderer Feature,可使用 FilterAttribute API,在URP 资源(URP Asset)中启用或禁用设置时移除相关着色器变体。
例如,你可以进行以下操作:
- 使用 [SerializeField] 为自定义 Renderer Feature 添加一个布尔变量(Boolean),并在 URP Asset Inspector 中以复选框形式显示。
- 使用 ShaderKeywordFilter.RemoveIf,当启用该复选框时,移除相关着色器变体。