版本:Unity 6 (6000.0)
语言:English
着色器关键字
着色器关键字作用域基础

着色器关键字基础

着色器关键字允许您在条件行为中使用着色器在 GPU 上运行的程序。 更多信息
术语表中查看
代码。您可以创建共享一些公共代码的着色器,但在启用或禁用特定关键字时具有不同的功能。

您可以将着色器关键字与动态分支着色器变体Unity 根据着色器关键字及其状态的特定组合生成的着色器程序版本。着色器对象可以包含多个着色器变体。 更多信息
术语表中查看
一起使用。在使用着色器关键字之前,了解这些技术的运作方式以及哪种技术适合您的项目非常重要。

注意:在着色器图中,术语有所不同:一组关键字称为关键字,而集合中的关键字称为状态。在内部,功能相同:Unity 以相同的方式编译它们,您以相同的方式使用 C# 脚本一段代码,允许您创建自己的组件,触发游戏事件,随时间推移修改组件属性,并以您喜欢的任何方式响应用户输入。 更多信息
术语表中查看
等等。

声明着色器关键字

您以集合的形式声明着色器关键字。一个集合包含相互排斥的关键字。

  • 在手动编码的着色器中,请参阅在 HLSL 中声明和使用着色器关键字
  • 在着色器图中,请参阅关键字注意:“动态分支”选项在着色器图中不可用。您只能在着色器图中将着色器关键字与着色器变体一起使用。

例如,以下集合包含三个关键字

  • COLOR_RED
  • COLOR_GREEN
  • COLOR_BLUE

声明着色器关键字的方式会影响许多方面

  • 类型会影响 Unity 是否以及如何使用关键字生成着色器变体,或者是否将其用于动态分支。
  • 作用域会影响关键字是局部的还是全局的。这决定了它们在运行时的行为。
  • 阶段会影响关键字影响的着色器阶段(在适用情况下)。

定义类型:多编译、着色器特性或动态分支

当您声明一组关键字时,您可以选择是将它们与着色器变体还是动态分支一起使用。如果您选择着色器变体,您还必须选择 Unity 在内部如何定义关键字;这会影响 Unity 编译的变体数量。

有关详细信息,请参阅选择在着色器中使用哪种类型的条件

在运行时管理关键字集合

当您编写着色器时,您会以集合的形式声明关键字。一个集合包含相互排斥的关键字。

在运行时,Unity 没有这些集合的概念。它允许您独立启用或禁用任何关键字,并且启用或禁用关键字不会影响任何其他关键字的状态。这意味着可以启用同一集合中的多个关键字,或者禁用集合中的所有关键字。

如果您将关键字与着色器变体一起使用,当集合中启用多个关键字或集合中未启用任何关键字时,Unity 会选择一个它认为“足够好”的匹配的变体。无法保证究竟会发生什么,并且可能会导致意想不到的结果。最好通过仔细管理关键字状态来避免这种情况。

如果您将关键字与动态分支一起使用,当集合中启用多个关键字或集合中未启用任何关键字时,条件分支将相应执行。例如,如果同时启用了KEYWORD_AKEYWORD_B,则if (KEYWORD_A)if (KEYWORD_B)的分支都将执行。

着色器关键字限制

Unity 可以使用多达 4,294,967,294 个全局着色器关键字。单个着色器和计算着色器可以使用多达 65,534 个局部着色器关键字。这些总数包括用于变体的关键字和用于动态分支的关键字。

在着色器源文件中声明的每个关键字及其依赖项都会计入此限制。依赖项包括着色器使用UsePass包含的Pass回退

如果 Unity 在多个地方遇到名称相同的着色器关键字,则只计入限制一次。

如果着色器总共使用超过 128 个关键字,它会产生很小的运行时性能损失;因此,最好将关键字数量保持在较低水平。Unity 始终为每个着色器保留 4 个关键字。

着色器关键字
着色器关键字作用域基础