Shader keywords allow you to use conditional behavior in your shader code. You can create shaders that share some common code, but have different functionality when a given keyword is enabled or disabled. You use with Shader variants.
このページには以下の情報が含まれています。
シェーダーのキーワードはセットで宣言します。セットには、互いに排他的なキーワードが含まれます。
例えば、以下のセットには 3 つのキーワードが含まれています。
ノート: Shader Graph では用語が異なり、キーワードのセットは キーワード と呼ばれ、セット内のキーワードは ステート と呼ばれます。内部的には機能は同じで、例えば、Unity はこれらを同じ方法でコンパイルし、これらの扱いは C# スクリプトの場合と同様です。
シェーダーキーワードの宣言方法は、様々なことに影響します。
When you declare a set of keywords, you must also choose how Unity defines the keywords internally; this affects the number of variants that Unity compiles.
#define
プリプロセッサーディレクティブを作成します。
“multi compile” と “shader feature” のどちらを選択するかは、キーワードをどのように使用するかによって変わります。そのキーワードを使ってプロジェクトのマテリアルの設定を行い、ランタイムに C# スクリプトから値を変更しない場合は、“shader feature” を使用してプロジェクトのシェーダーキーワードとバリアントの数を減らしてください。ランタイムに C# スクリプトを使用してキーワードを有効化/無効化する場合は、“multi compile” を使用して、バリアントが誤ってストリッピングされるのを防いでください。シェーダーのストリッピングについての詳細は、シェーダーバリアントのストリッピング を参照してください。
ノート: Graphics 設定ウィンドウの Always Included Shaders のリストにシェーダーを追加すると、Unity は、ビルド内の全てのセットの全てのキーワードを (たとえそれが “shader feature” を使って宣言されていたとしても) 含めます。
この値を設定するには、以下のドキュメントを参照してください。
キーワードのセットを宣言する際に、セット内のキーワードがローカルとグローバルのどちらの スコープ を持つか選択します。これにより、ランタイムにグローバルシェーダーキーワードを使用してこのキーワードの状態をオーバーライドできるかどうかが決まります。
デフォルトでは、グローバルスコープでキーワードを宣言します。これは、ランタイムにグローバルシェーダーキーワードを使用してそのキーワードの状態をオーバーライドできることを意味します。ローカルスコープでキーワードを宣言すると、ランタイムにグローバルシェーダーキーワードを使用してキーワードの状態をオーバーライドできません。詳細およびコード例は、C# スクリプトでのシェーダーキーワードの使用 を参照してください。
ノート: 同じ名前のキーワードがシェーダーソースファイル内とその依存関係内に存在する場合、ソースファイル内のキーワードのスコープが、依存関係内のスコープを上書きします。依存関係は、Fallback コマンド を介して含まれている全てのシェーダーと、UsePass コマンド を介して含まれているパスで構成されます。
この値を設定するには、以下のドキュメントを参照してください。
デフォルトでは、Unity はシェーダーの各ステージに対してキーワードバリアントを生成します。例えば、シェーダーに頂点ステージとフラグメントステージが含まれている場合、頂点シェーダープログラムとフラグメントシェーダープログラムの両方に、キーワードの全ての組み合わせのバリアントが生成されます。また、あるキーワードセットがどちらか一方のステージでしか使われていない場合、もう一方のステージにも同じバリアントが生成されます。Unity は同じバリアントを自動的に識別して 複製しない ため、ビルドサイズは増加しませんが、それでもコンパイル時間が浪費され、シェーダーのロード時間が増加し、ランタイムのメモリ使用量が増加する結果となります。
この問題を回避するために、ハンドコーディングされたシェーダー内でキーワードのセットを宣言する際に、特定のシェーダーステージに関してのみコンパイルするように Unity に指示することができます。これを行った場合は、そのキーワードが指定のシェーダーステージでのみ使用されることを確認する必要があります。
ノート: 以下のグラフィックス API は、ステージ固有のキーワードを完全にはサポートしていません。OpenGL と Vulkan では、コンパイル時に、Unity が全てのステージ固有キーワードディレクティブを通常のキーワードディレクティブに自動的に変換します。Metal では、頂点ステージをターゲットとする全てのキーワードはテッセレーションステージにも影響し、逆もまた同様です。
この値を設定するには:
シェーダーキーワードを使用してシェーダーの一部を条件付きにすることで、特定の動作を、特定のキーワードが特定の状態にある時にだけ実行されるようにすることができます。
これは以下の手順で行えます。
You can enable or disable shader keywords. When you enable or disable a shader keyword, Unity renders the appropriate shader variant, or the GPU executes the appropriate branch.
以下の 2 つの方法で、シェーダーキーワードを有効化/無効化できます。
Unity は、定義済みシェーダーキーワードのセットを使用して、共通の機能を実現するシェーダーバリアントを生成します。
Unity は、コンパイル時に以下のシェーダーバリアントキーワードのセットを追加します。
Unity can use up to 4,294,967,294 global shader keywords. Individual shaders and compute shaders can use up to 65,534 local shader keywords.
この合計数には、シェーダーのソースファイル内で宣言された全てのキーワードとその依存関係が含まれます。依存関係には、シェーダーが UsePass で含める パス や、フォールバック が含まれます。
Unity が同じ名前のシェーダーキーワードに複数回遭遇する場合は、1 回だけカウントされます。
シェーダーが合計で 128 個より多い数のキーワードを使用する場合、小さなランタイムパフォーマンスペナルティが発生します。したがって、キーワードの数は少なくすることが推奨されます。Unity は常に 1 つのシェーダーにつき 4 つのキーワードを確保します。
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.