Version: 6000.3
语言: 中文
着色器关键字工作流程
声明着色器关键字

Unity 如何编译分支着色器

使用关键字时,您可以选择 Unity 如何编译着色器在 GPU 上运行的程序。更多信息
请参阅术语表
法典。选项包括:

  • 动态分支:Unity 将分支代码保留在一个已编译的着色器程序中。
  • 着色器变体:Unity 为每个分支编译一个单独的着色器程序,称为着色器变体。这是静态分支的一种形式,可以帮助最小化着色器代码。

动态分支

要使用动态分支,请使用#pragma dynamic_branch声明关键字。例如:

#pragma dynamic_branch RED GREEN

...

if (RED)
{
    // Output red
}
else if (GREEN)
{
    // Output green
}

在编译时,Unity 将每个关键字转换为编译后的着色器代码中的统一整数变量,该变量的值可以是01.在运行时,对于每个绘制调用,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相反,或使用不同的方法来剥离着色器变体

其他资源

着色器关键字工作流程
声明着色器关键字