要根据是否启用或禁用着色器关键字集合来将着色器代码的某些部分标记为“有条件的”,请使用 HLSL if 语句。
例如:
#pragma multi_compile QUALITY_LOW QUALITY_MED QUALITY_HIGH
if (QUALITY_LOW)
{
// code for low quality setting
}
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 创建一组两个或多个关键字的集合,或使用 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 就会更加困难。