ShaderGraph 关键字
概述
您可以使用关键字为 Shader Graph 创建不同的变体。根据关键字的设置和编辑器中的设置,构建管线可能会剥离这些变体。
关键字的用途很多,例如:
创建具有可为每个材质实例打开或关闭的功能的着色器。
创建具有在某些平台上表现不同的功能的着色器。
创建可根据各种条件扩展复杂度的着色器。
关键字分为三种类型:Boolean、Enum 和 Built-in。根据其类型,Unity
在图形、着色器以及材质检视面板(可选)中定义了一个关键字。有关关键字类型的更多信息,请参阅布尔关键字、Enum 关键字
和Built-in 关键字。有关这些关键字如何影响最终着色器的更多信息,请参阅有关编写多个着色器程序变体文档。
在 Shader Graph 中,首先在 Blackboard
上定义一个关键字,然后使用一个 Keyword 节点在图形中创建一个分支。
编辑器能够在需要变体来呈现内容时按需编译变体。如果你声明许多不同的变体,你最终可能会得到数百万或数万亿种可能性。但是,播放器需要在构建时确定正在使用哪些变体,并在预编译着色器时包含它们。为了有效地管理内存,播放机会根据其关键字和编辑器设置剥离未使用的变体。请参阅下一节“通用参数”,详细了解如何向播放器提供提示,说明它需要编译的内容以及可以忽略的内容。当播放机在生成过程中剥离变体时,它会显示粉红色错误着色器。
通用参数
尽管特定类型的关键字有其特定的字段,但所有关键字都具有以下参数。
名称 | 类型 | 描述 |
---|---|---|
Display Name(显示名称) | 字符串 | 关键字的显示名称。Unity 会在引用相应关键字的节点的标题栏中显示此名称,如果暴露该关键字,也会在材质检视面板中显示此名称。 |
Exposed (暴露) | 布尔值 (Boolean) | 如果将其设置为 true,Unity 在材质检视面板中显示相应的关键字。如果将其设置为 false,关键字不会出现在材质检视面板中。 如果要访问 GLOBAL 着色器变量,请确保像通常添加输入变量一样添加它,但取消选择 Exposed。 |
Reference Name (引用名称) | 字符串 | 关键字在着色器中的内部名称。 如果您覆盖了此参数,请注意以下几点: 1. 关键字 Reference Name 始终为全大写,因此 Unity 将所有小写字母转换为大写字母。 2. 如果 Reference Name 包含任何 HLSL 不支持的字符,Unity 将用下划线替换这些字符。 3. 右键单击 Reference Name,然后选择 Reset Reference 可恢复为默认的 Reference Name。 |
Definition (定义) | 枚举 | 设置关键字在着色器中的定义方式。确定何时编译关键字变体。 有三个可用选项。 1. Shader Feature:Unity 在构建时剥离未使用的着色器变体。 2. Multi Compile:Unity 从不剥离任何着色器变体。 2. Predefined:表示活动的渲染管线已经定义了这个关键字,所以 Shader Graph 在它生成的代码中不再对其进行定义。 |
Scope (范围) | 枚举 | 设置定义关键字的范围。 1. Global Keywords:为整个项目定义关键字,并计入全局关键字限制。 2. Local Keywords:只为一个着色器定义关键字,它有自己的本地关键字限制。 3.使用预定义关键字时,Unity 将禁用此字段。 |
Stages (阶段) | 设置关键字适用的阶段。 可以使用以下选项: 1.全部 - 将此关键字应用于所有着色器阶段。 2.顶点 - 将此关键字应用于顶点阶段。 3.片段 - 将此关键字应用于片段阶段。 |
布尔关键字
布尔关键字要么打开,要么关闭。这会产生两个着色器变体。如果 Exposed 参数设置为 true 时,Unity 会在 Material Inspector
中公开布尔关键字。若要从脚本启用关键字,请在关键字的引用名称上使用 EnableKeyword。DisableKeyword
禁用关键字。要了解有关布尔关键字的详细信息,请参阅着色器变体和关键字。
特定于类型的参数
除了上面列出的常用参数外,布尔关键字还有一个特定于布尔值的参数。
名字 | 类型 | 描述 |
---|---|---|
Default | 布尔 | 启用此参数可将关键字的默认状态设置为打开,禁用此参数可将关键字的默认状态设置为关闭。 此参数确定着色器图生成预览时要用于关键字的值。它还定义了使用此着色器创建新材质时关键字的默认值。 |
Enum 关键字
枚举关键字可以有两个或更多状态,这些状态由您在 条目 列表中定义。如果您暴露一个枚举关键字,其 条目 列表中的 显示名称 会出现在材质检查器的下拉菜单中。
在枚举关键字的 条目名称 中,特殊字符如 ( ) 或 ! @ 是无效的。Shader Graph 会将无效字符转换为下划线 ( _ )。
当您定义一个枚举关键字时,Shader Graph 会显示每个状态的标签,由枚举的 条目名称 的净化版本附加到主 引用名称。
通过脚本使用 Material.EnableKeyword 或 Shader.EnableKeyword 函数 控制关键字时,以 {REFERENCE}_{REFERENCESUFFIX} 的格式输入状态标签。例如,如果您的引用名称是 MYENUM 并且所需的条目是 OPTION1,那么您将调用 Material.EnableKeyword(“MYENUM_OPTION1”)。当您选择一个选项时,这会禁用其他选项。
特定于类型的参数
除了上面列出的常用参数外,枚举关键字还具有以下附加参数。
名字 | 类型 | 描述 |
---|---|---|
Default | 枚举 | 从下拉菜单中选择一个条目,以确定在 Shader Graph 生成预览时将哪个值用于关键字。这也定义了使用此着色器创建新材质时关键字的默认值。编辑“条目”列表时,Shader Graph 会自动更新此控件中的选项。 |
Entries | Reorderable List(可重新排序列表) | 此列表定义关键字的所有状态。每个状态都有单独的“显示名称”和“引用后缀”。 • 显示名称:显示在关键字的下拉菜单中内部检查员和材料检查员。Shader Graph 还对引用关键字的节点上的端口标签使用此名称。 • 参考后缀:这是最后一个关键字,以.Reference_ReferenceSuffix |
Built-in 关键字
内置关键字始终是布尔型或枚举型,但它们的行为与您创建的布尔型或枚举型关键字略有不同。Unity 编辑器或活动的渲染管线设置它们的值,您无法编辑这些。
在图检查器的 节点设置 标签中,所有内置关键字字段都是灰色的,除了可以启用或禁用以显示 Shader Graph 预览中差异的 默认值 字段。您也无法在材质检查器中暴露内置关键字。
在 HDRP 项目中,您可以在 HDRP 资产的材料部分找到当前的质量级别。对于 URP 项目,不支持此功能,但您可以使用 SetGlobalShaderKeywords 命令在脚本中设置 MaterialQuality 枚举。例如,以下行将材料质量设置为高:
1 | MaterialQualityUtilities.SetGlobalShaderKeywords(MaterialQuality.High); |