You can prevent shader variants from being compiled. This is called stripping. Stripping unneeded variants can greatly reduce build times, file size, shader loading times, and runtime memory usage. In larger projects, or projects with complex shaders, this is a very important consideration.
If you strip a shader variant that a Material needs at runtime, Unity tries to choose a similar shader variant that’s available. To avoid this, use the following approaches:
shader_featurekeyword, don’t use the keyword to change which code branch executes at runtime.
The way that you declare shader keywords can limit the number of variants that they produce:
multi_compilewhere possible - see conditionals in shaders.
In Unity 2021.3 and above, you can create conditional shader code using a target platform preprocessor macro, so you can limit variants on platforms with limited memory.
The code sample does the following:
SHADER_API_DESKTOPplatform, Unity builds variants for every possible keyword combination.
#ifdef SHADER_API_DESKTOP #pragma multi_compile _ RED GREEN BLUE WHITE #else #pragma shader_feature RED GREEN BLUE WHITE #endif
You can use target platform preprocessor macros to select between
dynamic_branch. For more information on when to use each type of conditional, see Shader Conditionals.
When you build for console and mobile platforms that have limited memory, you can limit shader variants by only allowing users to switch between a small number of quality settings.
For example, if you use the keywords
HIGH_QUALITY_LIGHTMAPS, you can create the following:
This means Unity won’t create shader variants for
DYNAMIC_LIGHTING when it’s off, or the many different combinations of the 3 keywords being on and off.
You can use target platform preprocessor macros to conditionally create fewer quality settings and fewer variants on platforms with limited memory. For example the following code sample will allow users to switch between 8 permutations of settings on
SHADER_API_DESKTOP platforms, but only 2 on
#if SHADER_API_DESKTOP #pragma multi_compile SHADOWS_LOW SHADOWS_HIGH #pragma multi_compile REFLECTIONS_LOW REFLECTIONS_HIGH #pragma multi_compile CAUSTICS_LOW CAUSTICS_HIGH #elif SHADER_API_MOBILE #pragma multi_compile QUALITY_LOW QUALITY_HIGH #pragma shader_feature CAUSTICS // Uses shader_feature, so Unity strips variants that use CAUSTICS if there are no Materials that use the keyword at build time. #endif
There are several places in the Unity Editor UI where you can configure shader stripping:
In the Graphics Settings window, configure the settings in the Shader stripping section:
Ensure that no unneeded shaders are included in the Always-included shaders setting.
Strip variants relating to GPU instancing, lightmapping, and fog.
In the Built-in Render Pipeline, if it is not important that your Tier settings are different, ensure that they are identical to each other. For more information, see Graphics tiers.
In the Universal Render Pipeline (URP), disable unused features in the URP Asset. For more information, see Shader stripping.
If you use the Universal Render Pipeline you can also do the following:
If you use the High Definition Render Pipeline you can also do the following:
For shader variants that you can’t strip in other ways, you can use the following APIs in an Editor script to perform build-time stripping:
For more information on this subject, see the Unity blog post Stripping scriptable shader variants