シェーダーバリアント のコンパイルを避けることができます。これは ストリッピング と呼ばれます。不要なバリアントを取り除くことで、ビルド時間、ファイルサイズ、シェーダーのロード時間、ランタイムのメモリ使用量を大幅に削減できます。大規模なプロジェクトや複雑なシェーダーを持つプロジェクトでは、これは非常に重要な考慮事項です。
ランタイムにマテリアルによって必要とされるシェーダーバリアントを取り除くと、Unity は、類似のシェーダーバリアントで利用可能なものを選択しようとします。これを回避するためには、以下のアプローチを用いてください。
shader_feature
キーワードを使用する場合は、ランタイムにどのコードブランチが実行されるか変更するためにそのキーワードを使用しないでください。シェーダーキーワードの宣言方法によって、生成されるバリアントの数を制限することが可能です。
multi_compile
の代わりに shader_feature
を使用してください。シェーダーにおける条件 を参照してください。multi_compile
で定義しないようにしてください。ハンドコーディングされたシェーダーでのキーワードの宣言に関する情報は、HLSL のシェーダーキーワードの宣言と使用 を参照してください。Shader Graph での宣言については Shader Graph: ブラックボード を参照してください。
Unity 2021.3 以降では、ターゲットプラットフォームのプリプロセッサーマクロ を使用して条件付きシェーダーコードを作成できます。したがって、限られたメモリしかないプラットフォームでバリアントの数を制限できます。
このコードサンプルは、以下を行います。
SHADER_API_DESKTOP
プラットフォーム 用にビルドする場合、Unity は、考えられる全てのキーワードの組み合わせのそれぞれに、バリアントをビルドします。# ifdef SHADER_API_DESKTOP
#pragma multi_compile _ RED GREEN BLUE WHITE
# else
#pragma shader_feature RED GREEN BLUE WHITE
# endif
ターゲットプラットフォームのプリプロセッサーマクロを使用して、shader_feature
、multi_compile
、dynamic_branch
のいずれかを選択できます。各種の条件をいつ使用するかについては、シェーダーにおける条件 を参照してください。
メモリが制限されるコンソールやモバイルプラットフォーム用にビルドする場合、ユーザーが少数の品質設定の中での切り替えしか行えないようにすることで、シェーダーバリアントの数を制限することができます。
例えば、DYNAMIC_LIGHTING
、SOFT_SHADOWS
、HIGH_QUALITY_LIGHTMAPS
というキーワードを使用して、以下が作成できます。
DYNAMIC_LIGHTING
をオンにする “低品質” 設定DYNAMIC_LIGHTING
、SOFT_SHADOWS
、HIGH_QUALITY_LIGHTHTMAPS
をオンにする “高品質” 設定この場合、Unity は、DYNAMIC_LIGHTING
がオフの時にはそのためのシェーダーバリアントを作成せず、3 つのキーワードのオン/オフの多数の組み合わせも作成しません。
限られたメモリしかないプラットフォームには、ターゲットプラットフォームのプリプロセッサーマクロ を使用して、条件付けによって品質設定とバリアントを少数にすることができます。例えば、以下のコードサンプルの場合、ユーザーは、SHADER_API_DESKTOP
プラットフォームでは 8 通りの設定を切り替えることができますが、SHADER_API_MOBILE
プラットフォームでは 2 通りの設定しか切り替えられません。
# 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 アセットで使用しない機能を無効にします。詳細は、シェーダーストリッピング を参照してください。
ユニバーサルレンダーパイプラインを使用する場合は、以下も行えます。
HD レンダーパイプラインを使用する場合は、以下も行えます。
他の方法では除去できないシェーダーバリアントについては、エディタースクリプトで以下の API を使用してビルド時のストリッピングを行うことができます。
ストリッピングについての詳細は、Unity のブログ スクリプタブルシェーダーバリアントの除去 を参照してください。