使用图形合成器
要在 Unity 编辑器中打开 Graphics Compositor 窗口,请从菜单中选择 Window > Render Pipeline > Graphics Compositor。在此窗口中,可以启用图形合成器 (Graphics Compositor) 并控制其配置。首次启用图形合成器时,它将自动使用默认的“直通”合成配置文件,该配置文件可以将主摄像机的输出转发到最终合成帧。可以将更多图层添加到此配置文件并编辑其属性,也可以从磁盘加载另一个配置文件。如需了解 Compositor 窗口中的属性,请参阅 Compositor 窗口。
常规工作流程
- 合成输出在 Game 视图中进行渲染,而你可以在 Scene 视图中编辑场景。要实时预览输出,最佳做法是并排放置 Scene 视图和 Game 视图,或者从编辑器中取消停靠 Game 视图,然后将其放在单独的监视器(如果有)上。
- 如果 Game 视图设置为显示 Display 1,请确保图形合成器输出(在 Compositor 窗口中)到 Display 1。此外,应该将场景中的所有摄像机设置为输出到其他显示器,例如 Display 2 或 Display 3。这样可确保不会发生不必要的绘制操作,并且不会在显示输出中产生任何冲突。
基于 Alpha 的合成
许多合成操作都需要 Alpha 通道。为了正确使用图形合成器的所有功能,建议(但不是必要)执行以下操作:
- 将渲染的颜色缓冲区格式设置为 16 位半浮点数 (R16G16B16A16)
- 将后期处理的缓冲区格式设置为 16 位半浮点数 (R16G16B16A16)
两个缓冲区格式选项都在 HDRP 资源中。如果合成器检测到没有 Alpha 通道的缓冲区格式,则会显示警告。有关更多信息,请参阅 Alpha 输出。
图层类型
图形合成器工具通常处理两种类型的图层:
- 合成图层:合成图层是合成器混合在一起(以生成最终图像)的渲染目标(图像)。可以在合成图中定义它们。合成图可以定义图层数以及如何组合它们,但不会定义每个图层的内容。
- 子图层:子图层负责生成合成图层的内容。可以在 Graphics Compositor 窗口的 Render Schedule 部分中定义它们。可以堆叠多个子图层来定义一个合成图层的内容。在此情况下,所有子图层共享同一个渲染目标。
合成图
为了生成输出图像,图形合成器使用一个包含合成操作的图形,这些操作可以将许多合成图层组合起来。特别是,图形合成器使用具有无光照主节点 (Unlit Master Node) 的 Shader Graph 作为其目标。为了指定输出图像,合成器使用连接到 Color 端口的值。无需连接主节点上的任何其他端口。
注意:合成输出到渲染目标时,从主节点创建的材质必须为双面材质。
创建合成图时,可以显示出两种主要类型的输入属性:
- 合成图层 (Composition Layer):任何 Texture2D 属性均充当合成图层,它们对应的图层将由图形合成以生成最终帧。这些属性在 Graphics Compositor 窗口的 Render Schedule 部分中自动显示为合成图层。在 Shader Graph 中,它们的 Mode 选项对应于 Render Schedule 列表中关闭图层可见性时着色器使用的默认值。
注意:默认情况下,此值设置为白色,但是对于许多合成操作和行为,可能需要将其改为黑色。 - 合成参数 (Composition Parameters):这指的是 Texture2D 以外的任何公开属性。合成参数可以控制合成的各个方面。合成参数的示例包括用于控制整体亮度的 Float 输入或用于为 Texture2D 着色的 Color 输入。这些属性自动显示在 Graphics Compositor 窗口的 Composition Parameters 部分中。
下图包含上述属性类型的示例。Logo 属性是合成图层的示例,而 Opacity 属性是用于控制合成方面的输入属性示例:
Unity 将图形合成器属性保存在一个与合成图同名的 .asset 文件中。图形合成器加载合成图时,如果存在相应的资源文件,它也会从该文件加载属性,否则,它将使用默认设置来创建一个新资源。
添加和移除合成图层
要添加新的合成图层,请在合成图中创建新的 Texture2D 输入属性。为了方便起见,必须在 Graph Inspector 的 Node Settings 中的 Reference 字段内提供一个简短的指示性名称(例如 BackGround Layer)。 后续保存合成图时,新图层将在 Graphics Compositor 窗口的 Render Schedule 部分中自动显示为用作参考的名称。你可以在这个位置控制图层属性并指定如何填充图层的内容。
同样,要删除合成图层,请在合成图中移除相应的 Texture 2D 属性。
向合成图层添加内容
每个合成图层都可以从一个或多个子图层获取内容。有三种类型的子图层:
- 摄像机子图层:内容的来源是 Unity 摄像机。可以在子图层的属性中选择要使用的摄像机。
- 视频子图层:内容的来源是 Unity 视频播放器。可以在子图层的属性中选择要使用的视频播放器。
- 图像子图层:内容的来源是静态图像。可以在子图层的属性中选择要使用的图像。
要将子图层添加到合成图层,请选择该合成图层,然后单击 Add 下拉选单按钮。从下拉选单中,选择子图层的类型。
要移除子图层,请选择该子图层,然后单击 Delete 按钮。
注意:只能以此方式删除子图层,而不能删除合成图层。要删除合成图层,请在合成图中移除相应的 Texture2D 属性。
后期处理和子图层
合成图层中的每个子图层都可以具有一组独特的后期处理效果。要配置这种基于每个图层的后期处理,必须:
- 在场景中为每个需要独特后期处理效果的子图层添加唯一的体积。
- 在 Unity 编辑器中为每个体积创建并设置唯一的图层遮罩。
- 在每个子图层的属性中,覆盖并设置相应的体积遮罩。
合成器对子图层执行后期处理时,后期处理操作仅影响 Alpha 值大于零的像素。为了确保后期处理仅影响此子图层绘制的像素,请在 Sub-layer Properties 中选择 Clear Alpha 选项。如果未选择 Clear Alpha 选项,则后期处理还会影响先前绘制到当前图层的子图层。
请注意,在多个子图层中启用资源密集型后期处理效果(例如景深和泛光)会对运行时性能产生负面影响。因此,最佳做法是,如有可能,对图层组进行后期处理。为此,请使用 Sub-layer Properties 中的 Clear Alpha 选项。
基于 Alpha 的合成以及泛光
后期处理的一般规则是,它仅影响 Alpha 值大于零的像素。该规则的一个例外是泛光效果,这种情况下,生成的发光也会传播到 Alpha 值为零的像素。但是,只有 Alpha 值大于零的源像素才会影响泛光效果(影响程度与 Alpha 值成正比)。
摄像机堆叠
使用多个子图层来指定合成图层的内容时,这会将子图层“堆叠”在同一渲染目标之上。若要指定渲染目标的大小和格式,请使用父合成图层的属性。子图层继承其父合成图层的大小和格式,并且你不能为特定子图层单独更改这些属性。这意味着每个堆叠的摄像机/子图层都具有相同的大小和格式。
要更改堆叠顺序,请在 Graphics Compositor 窗口的 Render Schedule 部分中重新排列这些子图层。合成操作具有深度感知,这意味着对于具有不透明表面的图层,子图层的重新排序不会对结果图像产生任何影响。这一结论的前提是不选择子图层中的 Clear Depth 选项(用于保留子图层之间的深度)。
对于不绘制任何深度的元素(例如 UI 元素),以及通常情况下为了获得图层之间的正确屏幕空间反射和透明度,选择正确的子图层顺序非常重要。例如,如果一个图层中的半透明 UI 元素应在 3D 世界之上渲染,该图层应最后出现在合成图层的堆叠子图层中。
Sub-layer Properties 部分可以控制堆叠操作的类型。
Render Schedule
Render Schedule 是包含合成图层和子图层并可重新排序的列表。子图层会在其相应的父合成图层下方缩进显示,因此更便于查看层次关系。多个子图层出现在一个父图层下方时,它们将形成摄像机堆叠。Unity 首先渲染顶部图层。要将列表重新排序,可以单击并移动合成图层和子图层。通过这种方式可以更改摄像机堆叠中的渲染顺序,或将子图层从一个父合成图层移到另一个父图层。
Composition Parameters
此部分显示非输入合成图层的每个公开属性(例如,用于控制最终合成亮度的 Float 或用于为 Texture2D 着色的 Color)。在此部分中,窗口允许在合成图之外编辑每个属性值。最好是将图中的属性公开到 Graphics Compositor 窗口中,而不是将它们的值硬编码到合成图中。这样便于在项目之间共享合成配置文件,因为无需打开合成图来编辑任何值。
屏幕空间 UI 的合成
可以使用图形合成器来合成屏幕空间画布 (UI) 元素。画布使用 Screen Space - Camera 渲染模式时,必须将 Render Camera(在 Canvas Inspector 中)设置为绘制 UI 的子图层摄像机。但是,在此情况下,绘制 UI 的摄像机子图层:
- 应该被分配唯一的摄像机。不应在其他任何子图层中使用此摄像机。
- 不应覆盖任何摄像机状态(抗锯齿、剔除遮罩、体积遮罩等)。可以在子图层使用的源摄像机中更改这些属性。
此外,不能将图形合成器的输出摄像机 (Output Camera) 用作渲染摄像机 (Render Camera) 在合成器的输出之上绘制画布元素。为了达到相同效果,可以在 Render Schedule 中添加一个新的子图层,将该图层的摄像机用作 UI 的渲染摄像机,然后使用可用的合成操作(堆叠或基于图的合成)对生成的图层进行合成。
性能注意事项
图形合成器具有相当高的 CPU 和 GPU 开销,因此不建议用于诸如视频游戏之类对性能要求很高的应用程序。
以下一些技巧有助于提高使用图形合成器的应用程序的性能:
减少 Render Schedule 中的子图层数。每个子图层在内部使用唯一的摄像机。即使将同一源摄像机分配给 UI 中的多个子图层,也应该如此。
对于渲染简单对象的子图层,请选择源摄像机,然后在 Inspector 中选择“Custom Frame Settings”。在这个位置禁用尽可能多的 HDRP 功能。例如,如果知道该子图层无需屏幕空间反射 (SSR),可以禁用对 SSR 的支持。
可以降低特定合成图层的分辨率(这会影响堆叠在该图层上的所有子图层),同时将视觉上重要的元素以全分辨率保持在单独图层中。