版本:Unity 6(6000.0)
语言:英语
申明着色器关键字
将着色器关键字添加到检查器窗口

根据关键字设定着色器行为

如需标记 着色器在 GPU 上运行的程序。 更多信息
参见 术语表
代码的某些部分,具体取决于是否在某个集合中启用或禁用某个着色器关键字,则使用 HLSL if 语句

例如

#pragma multi_compile QUALITY_LOW QUALITY_MED QUALITY_HIGH

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

您可以启用和禁用关键字,使用“检查器”C# 脚本

Unity 对您的着色器代码执行的操作取决于您使用的着色器指令。

如果您使用 dynamic_branch,Unity 会为每个关键字创建一个统一的整型变量。启用某个关键字后,Unity 将该变量的整型设置成 1,您的 GPU 开始使用该关键字的 if 语句中的代码。这是动态分支。

如果您使用 shader_featuremulti_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_featuredynamic_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_featuredynamic_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

申明着色器关键字
将着色器关键字添加到检查器窗口