Version: Unity 6.0 (6000.0)
言語 : 日本語
分岐とキーワードによるシェーダーの動作の変更
シェーダーで使用するキーワードのタイプの選択

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

シェーダーキーワードを使用すると、シェーダーコードで 条件付き動作 を使用できます。ある共通のコードを持ちながら、特定の キーワード が有効または無効の場合に異なる機能を持つシェーダーを作成することができます。

シェーダーキーワードは、動的分岐 で使用することも、シェーダーバリアント で使用することもできます。シェーダーキーワードを使用する前に、これらの手法の仕組みと、どちらがプロジェクトに適切かを理解することが重要です。

注意Shader Graph では、用語が異なります。キーワードのセットを キーワード と呼び、セット内のキーワードを ステート と呼びます。内部的には機能は同じです。Unity はこれらを同じようにコンパイルし、C# スクリプトなどと同じように扱うことができます。

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

シェーダーキーワードはセットで宣言します。セットには、相互に排他的なキーワードが含まれます。

  • ハンドコーディングされたシェーダーについては、HLSL のシェーダーキーワードの宣言と使用 を参照してください。
  • Shader Graph については、キーワード を参照してください。注意Shader Graph では、“動的分岐” オプションは使用できません。Shader Graph では、シェーダーキーワードはシェーダーバリアントでのみ使用できます。

例えば、以下のセットには 3 つのキーワードが含まれています。

  • COLOR_RED
  • COLOR_GREEN
  • COLOR_BLUE

シェーダーキーワードの宣言方法は、多くのものに影響します。

  • タイプ は、Unity がキーワードを使用してシェーダーバリアントを生成するかどうかやその方法、または動的分岐に使用するかどうかに影響します。
  • スコープ は、キーワードがローカルかグローバルかに影響します。これによりランタイムの動作が決まります。
  • ステージ は、キーワードが影響を与えるシェーダーステージ (該当する場合) に影響します。

定義タイプ: マルチコンパイル、シェーダー機能、または動的分岐

キーワードのセットを宣言するときは、シェーダーバリアント で使用するか、動的分岐 で使用するかを選択します。シェーダーバリアントを選択する場合は、Unity がキーワードを内部で定義する方法も選択する必要があります。これは、Unity がコンパイルするバリアントの数に影響します。

詳細については、シェーダーで使用する条件のタイプを選択する を参照してください。

ランタイムにキーワードのセットを管理する

シェーダーをオーサリングする際は、キーワードをセットで宣言します。セットには、互いに排他的なキーワードが含まれます。

ランタイムでは、Unity はこうしたセットの概念を持ちません。任意のキーワードを個別に有効化または無効化することが可能になっており、キーワードを有効化または無効化しても、他のどのキーワードの状態にも影響しません。つまり、同じセットに含まれる複数のキーワードを有効にしたり、セット内の全てのキーワードを無効にしたりすることができます。

シェーダーバリアントでキーワードを使用すると、セット内の複数のキーワードが有効になっている場合や、セット内のどのキーワードも有効になっていない場合に、Unity によって “十分に一致する” と見なされたバリアントが選択されます。具体的に何が起こるか正確な保証がなく、意図しない結果につながる可能性があります。キーワードの状態を慎重に管理することで、このような状況を避けるのが最善です。

動的分岐でキーワードを使用すると、セット内の複数のキーワードが有効になっている場合や、セット内のどのキーワードも有効になっていない場合に、それに応じて条件分岐が実行されます。例えば、KEYWORD_AKEYWORD_B の両方が有効になっている場合、if (KEYWORD_A)if (KEYWORD_B) の分岐は両方とも実行されます。

シェーダーキーワードの制限

Unity は最大 4,294,967,294 個のグローバルシェーダーキーワードを使用できます。個々のシェーダーおよびコンピュートシェーダーでは、最大 65,534 のローカルシェーダーキーワードを使用できます。これらの合計には、バリアントに使用されるキーワードと動的分岐に使用されるキーワードが含まれます。

シェーダーのソースファイルで宣言されたすべてのキーワードとその依存関係は、この制限に数えられます。依存関係には、シェーダーが UsePass に加える パス、および フォールバック が含まれます。

Unity が同じ名前のシェーダーキーワードに複数回遭遇する場合は、制限数に 1 回カウントされます。

シェーダーが合計で 128 個を超えるキーワードを使用すると、ランタイムパフォーマンスにわずかな影響が出ます。そのため、キーワードの数はできるだけ少なく抑えるようにしてください。Unity は常にシェーダーごとに 4 つのキーワードを予約します。

分岐とキーワードによるシェーダーの動作の変更
シェーダーで使用するキーワードのタイプの選択