ランタイムにシェーダーキーワードを有効または無効にすることができます。シェーダーキーワードを有効または無効にすると、Unity はレンダリングに適切なシェーダーバリアントを使用します。
ランタイムにシェーダーバリアントを変更すると、パフォーマンスに影響を与えることがあります。キーワードの変更により、そのバリアントを初めて使用する必要がある場合、グラフィックスドライバーがシェーダープログラムを準備する間に不具合が発生する可能性があります。これは、大規模または複雑なシェーダーの場合や、グローバルなキーワードの状態変更が複数のシェーダーに影響する場合に、特に問題となります。これを避けるためには、シェーダーのロードと事前準備の方法でキーワードバリアントを考慮するようにしてください。詳細については、シェーダーのロード を参照してください。
Unity では、 ローカルシェーダーキーワード と グローバルシェーダーのキーワード があります。
シェーダーキーワードを宣言する際に、そのスコープを設定します。詳しくは、シェーダーキーワード: グローバルスコープとローカルスコープ を参照してください。
グローバルシェーダーキーワードを有効または無効にするには、Shader.EnableKeyword またはShader.DisableKeyword を使用します。
コマンドバッファでグローバルキーワードを有効または無効にするには、CommandBuffer.EnableKeyword 、または CommandBuffer.DisableKeyword を使用します。
状態を確認するには、[Shader.IsKeywordEnabled] を使用します。
グラフィックスシェーダーのローカルシェーダーキーワードを有効または無効にするには、Material.EnableKeyword または Material.DisableKeyword を使用します。状態を確認するには、Material.IsKeywordEnabled を使用します。
コンピュートシェーダーのローカルシェーダーキーワードを有効または無効にするには、ComputeShader.EnableKeyword または ComputeShader.DisableKeyword を使用します。状態を確認するには、ComputeShader.IsKeywordEnabled を使用します。
シェーダーをオーサリングする際には、キーワードをセットで宣言します。セットには、互いに排他的なキーワードが含まれます。
ランタイムでは、Unity はこれらのセットの概念を持ちません。Unity では、任意のキーワードを個別に有効または無効にすることができ、あるキーワードを有効または無効にしても、他のキーワードの状態には影響しません。つまり、同じセットから複数のキーワードを有効にしたり、セット内のすべてのキーワードを無効にしたりすることが可能です。
セット内の複数のキーワードが有効になっている場合や、セット内のキーワードが 1 つも有効になっていない場合、Unity は “十分に適合する” と考えられる (1 つの) バリアントを選択します。正確に何が起こるかについては保証されておらず、意図しない結果になる可能性があります。キーワードの状態を慎重に管理して、このような状況を避けることが最善の策です。