シェーダーキーワードを使用すると、シェーダーコードで 条件付き動作 を使用できます。ある共通のコードを持ちながら、特定の キーワード が有効または無効の場合に異なる機能を持つシェーダーを作成することができます。
シェーダーキーワードは、動的分岐 で使用することも、シェーダーバリアント で使用することもできます。シェーダーキーワードを使用する前に、これらの手法の仕組みと、どちらがプロジェクトに適切かを理解することが重要です。
注意Shader Graph では、用語が異なります。キーワードのセットを キーワード と呼び、セット内のキーワードを ステート と呼びます。内部的には機能は同じです。Unity はこれらを同じようにコンパイルし、C# スクリプトなどと同じように扱うことができます。
シェーダーキーワードはセットで宣言します。セットには、相互に排他的なキーワードが含まれます。
例えば、以下のセットには 3 つのキーワードが含まれています。
シェーダーキーワードの宣言方法は、多くのものに影響します。
キーワードのセットを宣言するときは、シェーダーバリアント で使用するか、動的分岐 で使用するかを選択します。シェーダーバリアントを選択する場合は、Unity がキーワードを内部で定義する方法も選択する必要があります。これは、Unity がコンパイルするバリアントの数に影響します。
詳細については、シェーダーで使用する条件のタイプを選択する を参照してください。
シェーダーをオーサリングする際は、キーワードをセットで宣言します。セットには、互いに排他的なキーワードが含まれます。
ランタイムでは、Unity はこうしたセットの概念を持ちません。任意のキーワードを個別に有効化または無効化することが可能になっており、キーワードを有効化または無効化しても、他のどのキーワードの状態にも影響しません。つまり、同じセットに含まれる複数のキーワードを有効にしたり、セット内の全てのキーワードを無効にしたりすることができます。
シェーダーバリアントでキーワードを使用すると、セット内の複数のキーワードが有効になっている場合や、セット内のどのキーワードも有効になっていない場合に、Unity によって “十分に一致する” と見なされたバリアントが選択されます。具体的に何が起こるか正確な保証がなく、意図しない結果につながる可能性があります。キーワードの状態を慎重に管理することで、このような状況を避けるのが最善です。
動的分岐でキーワードを使用すると、セット内の複数のキーワードが有効になっている場合や、セット内のどのキーワードも有効になっていない場合に、それに応じて条件分岐が実行されます。例えば、KEYWORD_A と KEYWORD_B の両方が有効になっている場合、if (KEYWORD_A) と if (KEYWORD_B) の分岐は両方とも実行されます。
Unity は最大 4,294,967,294 個のグローバルシェーダーキーワードを使用できます。個々のシェーダーおよびコンピュートシェーダーでは、最大 65,534 のローカルシェーダーキーワードを使用できます。これらの合計には、バリアントに使用されるキーワードと動的分岐に使用されるキーワードが含まれます。
シェーダーのソースファイルで宣言されたすべてのキーワードとその依存関係は、この制限に数えられます。依存関係には、シェーダーが UsePass に加える パス、および フォールバック が含まれます。
Unity が同じ名前のシェーダーキーワードに複数回遭遇する場合は、制限数に 1 回カウントされます。
シェーダーが合計で 128 個を超えるキーワードを使用すると、ランタイムパフォーマンスにわずかな影響が出ます。そのため、キーワードの数はできるだけ少なく抑えるようにしてください。Unity は常にシェーダーごとに 4 つのキーワードを予約します。