如需标记 着色器在 GPU 上运行的程序。 更多信息
参见 术语表 代码的某些部分,具体取决于是否在某个集合中启用或禁用某个着色器关键字,则使用 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 会为每个关键字状态创建单独的 着色器变体某个着色器程序的某个版本,由 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
。