Version: Unity 6.0 (6000.0)
言語 : 日本語
シェーダーキーワードの宣言
Inspector ウィンドウへのシェーダーキーワードの追加

シェーダー動作をキーワードで条件付きにする

シェーダーコードの一部をセット内のシェーダーキーワードの有効または無効に基づく条件付きとしてマークするには、HLSL if ステートメント を使用します。

例:

#pragma multi_compile QUALITY_LOW QUALITY_MED QUALITY_HIGH

if (QUALITY_LOW)
{
    // code for low quality setting
}

キーワードは、Inspector を使用 するか C# スクリプトを作成 して有効または無効にできます。

Unity がシェーダーコードで行うことは、使用するシェーダーディレクティブによって異なります。

dynamic_branch を使用する場合、Unity はキーワードごとに均一整数変数を作成します。キーワードを有効にすると、Unity はその変数の整数を 1 に設定し、GPU はそのキーワードの if ステートメント内のコードを使用するように切り替えます。これは動的分岐です。

shader_feature または multi_compile を使用する場合、Unity はキーワード状態ごとに個別の シェーダーバリアント を作成します。各バリアントには、そのキーワードの if 分岐のコードが含まれます。キーワードを有効にすると、Unity は一致するバリアントを GPU に送信します。これは静的分岐です。

どのシェーダーディレクティブをいつ使用するかに関する詳細は、シェーダーにおける条件 を参照してください。

キーワードが存在する場合の分岐

セット内のキーワードごとに、Unity は自動的に _KEYWORD_DECLARED キーワードを追加します。例えば、QUALITY_LOW キーワードを宣言すると、Unity は QUALITY_LOW_KEYWORD_DECLARED キーワードを追加します。

これを使用して、キーワードが有効か無効かに関係なく、キーワードが存在するかどうかを確認できます。

例:

#pragma multi_compile QUALITY_LOW QUALITY_MED QUALITY_HIGH

#if defined(QUALITY_LOW_KEYWORD_DECLARED)
{
    // The QUALITY_LOW keyword exists
}

セット内のすべてのキーワードが無効のときの分岐

セット内のすべてのキーワードが無効のときにコードを実行するには、Unity はその状態に追加のシェーダーバリアントまたは均一整数を作成する必要があります。

shader_feature または dynamic_branch を使用して単一のキーワードを作成する場合、Unity は自動的に追加のバリアントまたは均一整数を作成します。 例:

// Creates a variant for when FEATURE_1_ON is enabled, and another for when FEATURE_1_ON is disabled. 
#pragma shader_feature FEATURE_1_ON

// Creates a uniform integer for when FEATURE_2_ON is enabled, and another for when FEATURE_2_ON is disabled. 
#pragma dynamic_branch FEATURE_2_ON

shader_feature または dynamic_branch を使用して 2 つ以上のキーワードを含むセットを作成するか、multi_compile を使用する場合は、キーワードセットを宣言するときに _ を追加して、Unity が追加のバリアントまたは均一整数を作成するようにします。 例:

// Creates 5 shader variants, including one for when RED, GREEN, BLUE, and WHITE are all disabled. 
#pragma shader_feature _ RED GREEN BLUE WHITE

// Creates 2 shader variants, including one for when FEATURE_3_ON is disabled.
#pragma multi_compile _ FEATURE_3_ON

// Creates 4 uniform integers, including one for when QUALITY_LOW, QUALITY_MED, and QUALITY_HIGH are all disabled.
#pragma dynamic_branch _ QUALITY_LOW QUALITY_MED QUALITY_HIGH

他のステートメントを使用してシェーダー動作を条件付きにする

以下の HLSL プリプロセッサーディレクティブを使用して、条件付きコードを作成することもできます。

if の代わりにこれらを使用すると、後で #pragma キーワードディレクティブを変更することがより難しくなります。例えば、シェーダーバリアントの数を減らす必要がある場合に、dynamic_branch に変更することがより難しくなります。

シェーダーキーワードの宣言
Inspector ウィンドウへのシェーダーキーワードの追加