包含此页的版本:
不含此页的版本:
使用关键字时,您可以选择 Unity 如何编译着色器在 GPU 上运行的程序。更多信息
请参阅术语表法典。选项包括:
要使用动态分支,请使用#pragma dynamic_branch声明关键字。例如:
#pragma dynamic_branch RED GREEN
...
if (RED)
{
// Output red
}
else if (GREEN)
{
// Output green
}
在编译时,Unity 将每个关键字转换为编译后的着色器代码中的统一整数变量,该变量的值可以是0或1.在运行时,对于每个绘制调用,Unity 都会将每个关键字整数的状态发送到 GPU。
您可以使用dynamic_branch如果着色器在快速 GPU 上运行,并且没有非对称代码分支,其中一个分支比另一个分支更长或更复杂。
要使用着色器变体,请使用#pragma multi_compile或#pragma shader_feature声明关键字。例如:
#pragma multi_compile RED GREEN
if (RED)
{
// Output red
}
else if (GREEN)
{
// Output green
}
在编译时,Unity 将之前的代码拆分为 2 个独立但相似的着色器文件,称为着色器变体。一个文件包含输出红色的代码,另一个文件包含输出绿色的代码。每次绘制调用,Unity 都会向 GPU 发送正确的着色器变体。
如果只需要着色器根据材质属性进行分支,请使用shader_feature.Unity 会为构建中的材质使用的关键字组合编译着色器变体,并删除其他着色器变体。这样可以缩短构建时间并缩小文件大小。
注意:在运行时,如果您使用在构建时未使用的关键字组合,Unity 会尝试找到与之非常匹配的着色器变体。可以改为在运行时突出显示缺少的着色器,或者在预加载的着色器列表中包含着色器变体集合。
如果需要使用 C# 脚本在运行时创建着色器分支,请使用multi_compile.Unity 会编译着色器变体,无论它们是否被构建中的材质使用。例如,您可以使用multi_compile让用户动态控制游戏中是否出现雾。
重要提示:如果您使用multi_compile,Unity 可能会花费很长时间进行编译,因为关键字的每个组合都成为着色器变体。例如,如果您有 8 个关键字集,每个关键字集有 3 个关键字,则 Unity 可能会编译 6,000 多个着色器变体。用shader_feature相反,或使用不同的方法来剥离着色器变体。