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_feature
keyword, don’t use the keyword to change which code branch executes at runtime.以下のシェーダーキーワードの宣言方法によって、生成されるバリアントの数を制限することができます。
shader_feature
instead of multi_compile
where possible - see conditionals in shaders.multi_compile
で使わないキーワードを定義しないようにします。For information on declaring keywords in hand-coded shaders, see Declaring and using shader keywords in HLSL. For information on declaring keywords in Shader Graph, see Shader Graph: Blackboard.
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_DESKTOP
platform, 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 shader_feature
, multi_compile
and 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 DYNAMIC_LIGHTING
, SOFT_SHADOWS
and HIGH_QUALITY_LIGHTMAPS
, you can create the following:
DYNAMIC_LIGHTING
.DYNAMIC_LIGHTING
, SOFT_SHADOWS
and HIGH_QUALITY_LIGHTMAPS
.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 SHADER_API_MOBILE
platforms.
#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
Unity エディターの UI には、シェーダーストリッピングを設定できる箇所がいくつかあります。
Graphics Settings ウィンドウ で、Shader stripping セクションの設定を行います。
Always-included shaders 設定で、必要のないシェーダーが含まれないようにします 。
GPU インスタンス化、ライトマッピング、フォグに関連するバリアントを除去します。
ビルトインレンダーパイプラインでは、階層設定が違うことが重要でない場合は、お互いに同じ階層設定にしてください。詳しくは、グラフィックスの階層 を参照してください。
ユニバーサルレンダーパイプライン (URP)では、URP アセットで使用しない機能を無効にします。詳細は、シェーダーストリッピング を参照してください。
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:
他の方法では除去できないシェーダーバリアントについては、エディタースクリプトで以下の API を使用してビルド時のストリッピングを行うことができます。
ストリッピングについての詳細は、Unity のブログ スクリプタブルシェーダーバリアントの除去 を参照してください。