Version: 2023.1
言語: 日本語
マテリアルインスペクターでのシェーダーキーワードの使用
シェーダーバリアントコレクション

シェーダーバリアントのストリッピング

シェーダーバリアント のコンパイルを避けることができます。これは ストリッピング と呼ばれます。不要なバリアントを取り除くことで、ビルド時間、ファイルサイズ、シェーダーのロード時間、ランタイムのメモリ使用量を大幅に削減できます。大規模なプロジェクトや複雑なシェーダーを持つプロジェクトでは、これは非常に重要な考慮事項です。

ランタイムにマテリアルによって必要とされるシェーダーバリアントを取り除くと、Unity は、類似のシェーダーバリアントで利用可能なものを選択しようとします。これを回避するためには、以下のアプローチを用いてください。

  • shader_feature キーワードを使用する場合は、ランタイムにどのコードブランチが実行されるか変更するためにそのキーワードを使用しないでください。
  • シェーダーバリアントのリストを取得し、マテリアルがランタイムにどのキーワードの組み合わせを必要とするか確認してください。
  • Graphics 設定Always Included Shaders リストにシェーダーを追加してください。

シェーダーキーワードの宣言時にシェーダーバリアント数を制限する

シェーダーキーワードの宣言方法によって、生成されるバリアントの数を制限することが可能です。

ハンドコーディングされたシェーダーでのキーワードの宣言に関する情報は、HLSL のシェーダーキーワードの宣言と使用 を参照してください。Shader Graph での宣言については Shader Graph: ブラックボード を参照してください。

プリプロセッサーマクロを使用してプラットフォームごとにバリアント数を制限する

Unity 2021.3 以降では、ターゲットプラットフォームのプリプロセッサーマクロ を使用して条件付きシェーダーコードを作成できます。したがって、限られたメモリしかないプラットフォームでバリアントの数を制限できます。

このコードサンプルは、以下を行います。

  • SHADER_API_DESKTOP プラットフォーム 用にビルドする場合、Unity は、考えられる全てのキーワードの組み合わせのそれぞれに、バリアントをビルドします。
  • 他のプラットフォーム用にビルドする場合、Unity は、ビルド内のマテリアルが使用するキーワードの組み合わせにのみ、バリアントをビルドします。
# ifdef SHADER_API_DESKTOP
   #pragma multi_compile _ RED GREEN BLUE WHITE
# else
   #pragma shader_feature RED GREEN BLUE WHITE
# endif

ターゲットプラットフォームのプリプロセッサーマクロを使用して、shader_featuremulti_compiledynamic_branch のいずれかを選択できます。各種の条件をいつ使用するかについては、シェーダーにおける条件 を参照してください。

ユーザー制御の品質設定の作成

メモリが制限されるコンソールやモバイルプラットフォーム用にビルドする場合、ユーザーが少数の品質設定の中での切り替えしか行えないようにすることで、シェーダーバリアントの数を制限することができます。

例えば、DYNAMIC_LIGHTINGSOFT_SHADOWSHIGH_QUALITY_LIGHTMAPS というキーワードを使用して、以下が作成できます。

  • DYNAMIC_LIGHTING をオンにする “低品質” 設定
  • DYNAMIC_LIGHTINGSOFT_SHADOWSHIGH_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

エディター UI でのシェーダーバリアントのストリッピング

Unity エディターの UI には、シェーダーストリッピングを設定できる箇所がいくつかあります。

  • Graphics Settings ウィンドウ で、Shader stripping セクションの設定を行います。

  • Always-included shaders 設定で、必要のないシェーダーが含まれないようにします 。

  • GPU インスタンス化、ライトマッピング、フォグに関連するバリアントを除去します。

  • ビルトインレンダーパイプラインでは、階層設定が違うことが重要でない場合は、お互いに同じ階層設定にしてください。詳しくは、グラフィックスの階層 を参照してください。

  • ユニバーサルレンダーパイプライン (URP)では、URP アセットで使用しない機能を無効にします。詳細は、シェーダーストリッピング を参照してください。

ユニバーサルレンダーパイプラインを使用する場合は、以下も行えます。

HD レンダーパイプラインを使用する場合は、以下も行えます。

エディタースクリプトでのシェーダーバリアントのストリッピング

他の方法では除去できないシェーダーバリアントについては、エディタースクリプトで以下の API を使用してビルド時のストリッピングを行うことができます。

ストリッピングについての詳細は、Unity のブログ スクリプタブルシェーダーバリアントの除去 を参照してください。

マテリアルインスペクターでのシェーダーキーワードの使用
シェーダーバリアントコレクション