使用 Shader Graph 自定义 HDRP 材质
高清渲染管线 (High Definition Render Pipeline, HDRP) 对所有着色器都使用 Unity 的 Shader Graph,但 AxF 着色器除外。这意味着对于某些材质,创建和编辑这些材质的方式与普通材质不同。
使用 Shader Graph 的 HDRP 材质
HDRP 包括以下 Shader Graph:
- 贴花 (Decal)
- 织物 (Fabric)
- 毛发 (Hair)
- 光照 (Lit)
- StackLit
- 无光照 (Unlit)
光照、LayeredLit 和无光照着色器将作为标准着色器(不含 Shader Graph)来提供。这意味着你可以在不创建 Shader Graph 实例的情况下使用这些着色器,并可在 Inspector 中编辑这些着色器。要使用这些着色器,请选择一种材质以在 Inspector 中查看该材质,然后单击 Shader 下拉选单。找到 HDRP 部分以查看不需要 Shader Graph 实例的每个 HDRP 着色器的列表。
创建
要创建使用 Shader Graph(例如,StackLit Graph)的材质,请按以下步骤操作:
- 使用您希望材质使用的 Shader Graph 创建一个着色器。
- 选择 Assets > Create > Shader > HDRP 以查找 HDRP Shader Graph 的列表。对于此示例,请单击 StackLit Graph。
- 为 Shader Graph 提供一个唯一名称。这很重要,因为您需要在材质中引用此 Shader Graph。
- 选择 Assets > Create > Shader > HDRP 以查找 HDRP Shader Graph 的列表。对于此示例,请单击 StackLit Graph。
- 从着色器创建材质。
- 在 Project 窗口中,找到您刚刚创建的着色器,然后单击右键该着色器。
- 选择 Create > Material。这将创建一个使用所选着色器的材质。务必要以这种方式操作,这很重要;不要先创建默认材质,然后再在材质的 Shader 下拉选单中选择着色器。如需了解原因,请参阅已知问题。
- 为材质命名,然后按键盘上的回车键。
编辑
要编辑使用 Shader Graph 的材质的属性,Inspector 窗口仅允许访问有限数量的属性。要编辑所有材质属性,必须直接编辑 Shader Graph 的主节点。
- 双击 Shader Graph 资源以将该资源打开。窗口中会显示主节点和可用输入的列表。请参阅以下截屏的 Surface Inputs 部分。
- 要显示其余属性,请单击主节点右上角的齿轮图标。请参阅以下截屏的 Surface Options 部分中的其他属性。
- 使用与在 Inspector 窗口中相同的方式编辑齿轮图标下属性的值。主节点上的输入列表以及齿轮图标列表中的可用属性会根据你选择的选项而变化。
材质属性
编辑 Shader Graph 资源时,可以在 Blackboard 上为使用该资源的材质创建属性。这使您可以在运行时更改属性的值。
创建属性的最佳方法取决于您要如何使用属性:
- 如果您希望能够在编辑器中编辑属性,请使用 Blackboard,然后显示出该属性。
- 如果您希望能够在运行时而不是在编辑器中编辑属性,请使用 Blackboard,但不要显示出该属性。
- 如果您不想编辑属性,请使用具体节点。
Blackboard 中的材质属性
不管您是否显示出属性,每个 Blackboard 属性均会影响材质在磁盘上的大小。如果您根本不需要更改属性的值(在编辑器中或在运行时),请改用一个具体的节点,这样就不会增加材质的大小。
如果要在 Unity 编辑器 Inspector 中更改材质的属性值,则需要显示出该属性。要将 Blackboard 上的属性显示到 Inspector 中,请执行以下操作:
- 打开材质正在使用的 Shader Graph 资源。
- 转到 Blackboard,然后针对要在 Inspector 中显示的属性启用 Exposed 设置。
- 在工具栏中,单击 Save Asset。
- 从 Shader Graph 资源创建材质时,这些属性将显示在 Exposed Properties 部分中。
仅当您在编辑器中开发应用程序期间希望在 Inspector 中更改属性时,才应显示出属性。否则,最好不要显示出来,以免属性在 Inspector 中占用太多空间,并防止意外更改。
如果未显示出属性,仍然可以对属性进行编辑。要为使用选定着色器的每个材质实例编辑属性,请打开 Shader Graph 资源并直接在 Blackboard 中编辑该属性。要为使用着色器的单个材质实例编辑属性,请使用脚本。
⚠️ HDRP 保留了一组不应在 Blackboard 中使用的属性名称。如果使用其中任何属性名称,材质极有可能无法正常工作。 有关受限属性名称及其用途的列表,请参阅下表:
属性名称 | HDRP 用途 |
---|---|
_EmissionColor |
全局光照发光颜色。 |
_BaseColor |
全局光照 Alpha 裁剪。 |
_BaseColorMap |
全局光照 Alpha 裁剪。 |
_RenderQueueType |
由 HDRP 用于在渲染队列中安排材质的渲染队列类型。 |
_UseShadowThreshold |
HDRP 内部用途。 |
_RequireSplitLighting |
HDRP 内部用途。 |
_ReceivesSSR |
Surface Options。 |
_TransparentDepthPrepassEnable |
Surface Options。 |
_TransparentDepthPostpassEnable |
Surface Options。 |
_SurfaceType |
Surface Options。 |
_DoubleSidedEnable |
Surface Options。 |
_AlphaCutoffEnable |
Surface Options。 |
具体节点中的材质属性
如果您希望使用着色器的每个材质的属性值都相同,并且不需要在运行时或在编辑器中进行更改属性值,则可以使用一个具体节点。具体节点是指您可以在 Shader Graph 资源中创建的节点,并且定义了一个值。您可以为所有相同的值类型创建具体节点,就像在 Blackboard 中一样。应尽可能使用具体节点,因为着色器编译器可以执行自动优化以提高性能。
用于定义纹理(或纹理数组)的具体节点在着色器中定义了未显示的属性。这意味着它们会影响材质在磁盘上的大小,就像 Blackboard 属性一样。
材质表面选项属性
默认情况下,HDRP 主节点会显示许多 Surface Options 属性,这些属性使您可以通过材质(而不是在 ShaderGraph 中)控制某些常见设置(例如,Sorting Priority 或 Surface Type),从而避免复制整个要更改的图形。在主节点中,这些设置充当着色器中的默认值,因此当您从 Shader Graph 创建材质时(右键单击 Shader Graph 资源 > Create > Material),材质将具有主节点的配置。
该系统非常适合避免图形重复,但也存在某种与属性同步有关的问题。例如,如果您从透明 Shader Graph 创建材质,之后决定在主节点设置中将 Surface Type 选项切换为 Opaque,那么创建的材质仍将是不透明的 (Opaque)。创建材质后,即使您没有更改材质上的任何内容(主要是因为没有覆盖系统),该材质的所有属性也会被保存,并且绝不会再与 Shader Graph 同步。
请注意,只有在编辑模式下才可以切换这些表面选项,而在播放器中无法切换。因此,这不会在着色器编译过程中添加任何其他变体(我们使用着色器功能,而不是多重编译)。
已知问题
创建新材质时,新材质必须继承默认的 Shader Graph 属性(在主节点设置中)。为此,必须使用创建一节中描述的方法。如果不这样做,而是使用 Assets > Create > Material 来创建材质,则 Unity 会为材质分配光照着色器,然后将所有默认光照着色器属性写入其中。这意味着,当您将 Shader Graph 分配给材质时,材质将使用光照着色器中的默认属性,而不是 Shader Graph 主节点中的默认属性。
修改 Shader Graph 中的主节点的属性时,除非是在 Inspector 中打开了材质,否则 Unity 不会将这些属性与材质同步。这意味着,当您更改主节点设置中的某些属性时(例如 Material Type),在 Inspector 中未打开的材质将不同步,而这会破坏这些材质的渲染。要修复渲染并将材质的属性与材质的 Shader Graph 进行同步,则可以执行以下操作:
- 在 Inspector 中打开材质,更改材质某一属性的值,然后将其改回之前的值。这将触发主节点和材质之间的同步,并修复材质。
- 从项目中的 C# 脚本调用
HDEditorUtils.ResetMaterialKeywords(Material)
。这会将您传入的材质的属性与材质的 Shader Graph 进行同步。