Pass介绍
Pass是具有输入和输出的渲染过程。
在最终渲染帧中看到的每个细节都是通过一系列Pass(前一个Pass的输出是下一个Pass的输入)计算出来的。Pass可以生成图像(作为纹理、缓冲区或渲染目标)。每个图像都包含关于场景的特定信息,例如颜色、法线和深度。将这些图像组合在一起可以产生更复杂的效果,如阴影、照明、模糊、光晕和其他后处理效果。
- .(输入要渲染的对象列表)——> forward render pass ——>(输出从场景中的摄影机视角观看到那些对象对应的渲染图像)
- 输入图像和深度缓冲区(记录了每个像素的深度值) ——> depth of field pass ——> 输出模拟真实世界相机聚焦特定区域的能力的新图像
- 输入网格的顶点 ——> skinned mesh pass ——> 通过计算顶点的移动距离输出新顶点
如何构建和使用pass
Pass System Overview - Open 3D Engine (o3de.org)https://docs.o3de.org/docs/atom-guide/dev-guide/passes/pass-system/
Pass可以是代码端(C++)、或数据端(JSON)格式、或两者的组合。
C++代码端里定义PASS的结构,如其属性和功能,并实现管理PASS的系统,如PASS创建和注册。数据端使用JSON格式将C++的PASS结构存储下来,允许使用JSON文件来编写PASS。通过编辑JSON文件,你可以修改PASS的属性和设置,而无需直接修改C++代码。这种架构将JSON的灵活配置和C++的实现能力结合在一起,使得编写和管理pass更加模块化和灵活。
PS:一般我们只会修改.pass(json格式),json格式会将Pass作为资产使用,所以此过程不需要重新rebuild程序。
.pass文件是把C++里的pass结构持久化到磁盘的文件,下面是一个.pass文件(里面是json格式)
PassTemplate File Specification - Open 3D Engine (o3de.org)https://docs.o3de.org/docs/atom-guide/dev-guide/passes/pass-template-file-spec/
{
"Type": "JsonSerialization", // JSON Serialization Header
"Version": 1,
//被序列化的类叫PassAsset,PassTemplate被序列化并包含在PassAsset中
"ClassName": "PassAsset",
"ClassData": {
"PassTemplate": { // PassTemplate
"Name": "DownsamplePassTemplate",
"PassClass": "ComputePass",
"Slots": [ ... ],
"PassRequests": [ ... ],
"ImageAttachments": [ ... ],
"Connections": [ ... ],
"FallbackConnections": [ ... ],
"PassData": { ... },
}
}
}
PASS系统中的类:Pass(所有类的基类) 、Parent Pass、Render Pass 类。
Pass类
Pass Attachments 是指PASS使用的渲染硬件接口 (RHI) 的附件,例如纹理、缓冲区和渲染目标。流程中的附件分为三种类型: 输入 (Input)、输出 (Output) 和输入输出 (InputOutput)。
附件类型的描述如下:
-
输入 (Input):如果一个PASS只读取附件而不对其进行写入(修改)操作,则该附件槽位应该设置为输入类型。例如,在 SSAO(屏幕空间环境光遮蔽)中,深度缓冲区被绑定为输入类型,因为它只需要读取内容。
-
输出 (Output):如果一个流程对附件进行写入操作,而且不需要保留附件的先前状态,则该附件槽位应该设置为输出类型。输出类型的附件可能会被清空或覆写。例如,在深度预处理流程中,深度缓冲区被绑定为输出类型,因为它只需要写入内容。另一个例子是全屏流程会将渲染结果写入目标渲染目标,该目标会被设置为输出类型。
-
输入输出 (InputOutput):如果一个流程对附件进行写入操作,并且需要保留附件的先前状态,则该附件槽位应该设置为输入输出类型。输入输出类型的附件会保留先前状态。例如,在前向透明流程中,渲染目标就是一个输入输出类型的附件,因为该渲染目标已经包含了在不透明流程中渲染的像素。
Pass Behavior 是Pass具有的功能,被定义在虚拟函数中,这些虚拟函数的名称末尾有一个后缀Internal。
Parent Pass类
Parent Pass是由其他PASS组成的PASS,Parent Pass继承其他PASS。
Render Pass 类
Render Pass 负责执行某种形式的GPU工作。
Atom提供了以下Render Pass ,这些pass实现了最常见的渲染用例
Name | Description | API |
---|---|---|
光栅 Pass | 将场景中的对象转换为二维像素图。 | RasterPass |
Compute Pass | 激活计算着色器以调度渲染命令. | ComputePass |
全屏三角 Pass | 渲染一个覆盖整个屏幕的三角形。此PASS可用于全屏渲染其他视觉效果。 | FullScreenTrianglePass |
Copy Pass | 在GPU上复制图像和缓冲区。 | CopyPass |
创建Pass
创建PASS中,涉及四个组件: Pass
, Pass System
, Pass Template
, and Pass Request。
创建PASS时,PASS系统使用PASS模板中定义的信息来创建PASS的实例。PASS请求可用于通知PASS系统创建PASS。
Pass中包含两部分:Name and Pass Descriptor(一个携带了老PASS的名字和功能的类,可以作为新PASS构造函数的输入)。
自定义PASS的步骤https://docs.o3de.org/docs/atom-guide/dev-guide/passes/authoring-passes/