Version: Unity 6.0 (6000.0)
言語 : 日本語
シェーダーキーワードの基本
シェーダーキーワードの宣言

シェーダーで使用するキーワードのタイプの選択

キーワードのセットを宣言するときは、シェーダーバリアントで使用するか、動的分岐で使用するかを選択します。

  • “dynamic branch”: 動的分岐で使用するキーワードのセットを作成します。Unity では内部的に、これらのキーワードを使用して均一変数を作成します。
  • “multi compile” または “shader feature”: シェーダーバリアントで使用するキーワードのセットを作成します。Unity では内部的に、これらのキーワードを使用して #define プリプロセッサーディレクティブが作成されます。
    • “multi compile” は、シェーダーバリアントで使用するキーワードのセットを宣言します。

      セット内のすべてのキーワードに対して、シェーダーバリアントがコンパイルされます。
    • “shader feature” は、シェーダーバリアントで使用するキーワードのセットの宣言に加えて、これらのキーワードのどれも有効になっていないバリアントをコンパイルするようにコンパイラーに指示します。

      プロジェクトの状態がビルド時に調査され、使用されているキーワードのバリアントのみをコンパイルします。キーワードは、ビルドに含まれるマテリアルでそのキーワードが有効になっている場合に使用されています。

“multi compile” と “shader feature” のどちらを選択するかは、キーワードの使用方法によって異なります。キーワードを使ってプロジェクトのマテリアルを構成し、ランタイムに C# スクリプトで値を変更しない場合は、“shader feature” を使ってプロジェクトのシェーダーキーワードとバリアントの数を減らします。C# スクリプトを使用してランタイムにキーワードを有効または無効にする場合は、“multi compile” を使用し、バリアントが誤って削除 (ストリップ) されるのを防ぐ必要があります。シェーダーストリッピングの詳細については、シェーダーバリアントストリッピングを参照してください。

シェーダーにおける条件には、“全てのケースに適したアプローチ” はありません。個々のプロジェクトで、使用しているシェーダーを踏まえて、それぞれのアプローチのメリットとデメリットを検討する必要があります。

どちらの条件を使用すべきかは、どのタイミングでシェーダーを別のコードブランチに切り替える必要があるかによって変わります。

編集中のコードブランチの切り替え

ランタイムでシェーダーを別のコードブランチに切り替える必要がない場合は、Unity が編集中にのみ評価する条件を使用できます。

例えば、マテリアルの Inspector ウィンドウでプロパティを設定して、シェーダーに以下のような動作をさせることができます。

  • マテリアルの一部のインスタンスに鏡面反射を追加し、他のインスタンスには追加しない。
  • 特定のオブジェクト (水中シーンに登場するオブジェクトなど) に、異なる外観を追加する。

このアプローチを用いることで、シェーダーコードの記述と管理が行いやすくなり、ビルド時間やファイルサイズ、パフォーマンスに悪影響を及ぼしにくくなります。

これを行うには、以下のいずれかを使用してください。

shader_feature キーワード定義を使用すると、Unity はビルドでマテリアルが使用するシェーダーバリアントを保持し、他のシェーダーバリアントを削除 (“ストリップ”) します。これにより、ビルド時間を短く、ファイルサイズを小さく抑えることができます。

ランタイムに shader_feature キーワードを有効または無効にする C# スクリプトの使用は避けてください。欠落しているシェーダーバリアントをマテリアルが使用する場合、代わりに別の使用可能なバリアントが選択されるためです。ランタイムにキーワードを有効または無効にする必要がある場合は、以下のいずれかの方法を使用して、ビルドに必要なすべてのバリアントが含まれていることを確認します。

ランタイムでのコードブランチの切り替え

C# スクリプティングを使用してランタイムでシェーダーを別のコードブランチに切り替える必要がある場合は、Unity が編集中およびランタイムの両方で評価する条件式を使用できます。

例えば、C# スクリプトを使ってシェーダーに以下のような処理をさせることができます。

  • マテリアルを動的に変更して、特定の時間に雪が積もるようにする。
  • ユーザーが品質設定を変更した時にマテリアルを変更する。例えば、フォグを表示するかどうかをユーザーが動的に制御できるようにする。

これを行うには、以下のいずれかを使用してください。

multi_compile キーワード定義を使用すると、Unity では、ビルドのマテリアルで使用されていない組み合わせも含めて、シェーダーコードブランチの考えられるすべての組み合わせに対して、シェーダーバリアントがビルドされます。これは、ランタイムでキーワードを有効化/無効化できることを意味しますが、ビルド時間、ファイルサイズ、ロード時間、メモリ使用量が大幅に増加する可能性もあります。シェーダーバリアントを参照してください。

動的分岐はシェーダーバリアントを作成しませんが、特に、以下のいずれかが当てはまる場合には、GPU でのシェーダーの動作が遅くなる可能性があります。

  • シェーダーが性能の低い GPU で実行されている場合。
  • 条件コードに “非対称な分岐” があり、一方のブランチが他方より長い場合や、より複雑なコードになっている場合。

シェーダーバリアントの数をチェックすることで、GPU パフォーマンスにあまり影響を与えずに動的分岐を使用できるかどうかを確認することができます。動的分岐のメリットとデメリットについては、シェーダーにおける分岐を参照してください。

追加リソース

シェーダーキーワードの基本
シェーダーキーワードの宣言