着色器关键字允许您在条件行为中使用着色器在 GPU 上运行的程序。 更多信息
在术语表中查看代码。您可以创建共享一些公共代码的着色器,但在启用或禁用特定关键字时具有不同的功能。
您可以将着色器关键字与动态分支或着色器变体Unity 根据着色器关键字及其状态的特定组合生成的着色器程序版本。着色器对象可以包含多个着色器变体。 更多信息
在术语表中查看一起使用。在使用着色器关键字之前,了解这些技术的运作方式以及哪种技术适合您的项目非常重要。
注意:在着色器图中,术语有所不同:一组关键字称为关键字,而集合中的关键字称为状态。在内部,功能相同:Unity 以相同的方式编译它们,您以相同的方式使用 C# 脚本一段代码,允许您创建自己的组件,触发游戏事件,随时间推移修改组件属性,并以您喜欢的任何方式响应用户输入。 更多信息
在术语表中查看等等。
您以集合的形式声明着色器关键字。一个集合包含相互排斥的关键字。
例如,以下集合包含三个关键字
声明着色器关键字的方式会影响许多方面
当您声明一组关键字时,您可以选择是将它们与着色器变体还是动态分支一起使用。如果您选择着色器变体,您还必须选择 Unity 在内部如何定义关键字;这会影响 Unity 编译的变体数量。
有关详细信息,请参阅选择在着色器中使用哪种类型的条件。
当您编写着色器时,您会以集合的形式声明关键字。一个集合包含相互排斥的关键字。
在运行时,Unity 没有这些集合的概念。它允许您独立启用或禁用任何关键字,并且启用或禁用关键字不会影响任何其他关键字的状态。这意味着可以启用同一集合中的多个关键字,或者禁用集合中的所有关键字。
如果您将关键字与着色器变体一起使用,当集合中启用多个关键字或集合中未启用任何关键字时,Unity 会选择一个它认为“足够好”的匹配的变体。无法保证究竟会发生什么,并且可能会导致意想不到的结果。最好通过仔细管理关键字状态来避免这种情况。
如果您将关键字与动态分支一起使用,当集合中启用多个关键字或集合中未启用任何关键字时,条件分支将相应执行。例如,如果同时启用了KEYWORD_A
和KEYWORD_B
,则if (KEYWORD_A)
和if (KEYWORD_B)
的分支都将执行。
Unity 可以使用多达 4,294,967,294 个全局着色器关键字。单个着色器和计算着色器可以使用多达 65,534 个局部着色器关键字。这些总数包括用于变体的关键字和用于动态分支的关键字。
在着色器源文件中声明的每个关键字及其依赖项都会计入此限制。依赖项包括着色器使用UsePass包含的Pass和回退。
如果 Unity 在多个地方遇到名称相同的着色器关键字,则只计入限制一次。
如果着色器总共使用超过 128 个关键字,它会产生很小的运行时性能损失;因此,最好将关键字数量保持在较低水平。Unity 始终为每个着色器保留 4 个关键字。