シェーダーコードの一部をセット内のシェーダーキーワードの有効または無効に基づく条件付きとしてマークするには、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 に変更することがより難しくなります。