Filament 渲染引擎剖析 之 FrameGraph 2 动态构建渲染管线

一、渲染通道的设计与实现

1 Frostbite 构建FrameGraph的准则

我们先看下Frostbite 构建FrameGraph原则,包括三个阶段:
设置阶段 setup、编译阶段compile、执行阶段execute。Filament 渲染引擎剖析 之 FrameGraph 2 动态构建渲染管线_第1张图片

2 Filament使用FrameGraph动态构建渲染管线流程

如下图所示:

Filament 渲染引擎剖析 之 FrameGraph 2 动态构建渲染管线_第2张图片
如果不考虑渲染通道的并行计算与同步问题,FrameGraph 的实现还是比较直观的。
实现 FrameGraph 的关键点:
(1)虚拟资源的定义,虚拟资源可以被实例化成具体的资源。
(2)渲染通道的设计,如何抽象渲染通道及其关联的资源的定义,为用户提供统一定义渲染通道的接口。
(3)如何将实现编译,将没有使用到的渲染通道及其资源从渲染管线中剔除。
(4)执行渲染,这个过程应该不算难点,最多要考虑资源如何实例化的问题。

虚拟资源的定义,在前面已经详细讨论过了,在这里就不应成为难点了。下面重点介绍渲染通道的设计和编译的实现。我们先看看Filament 渲染通道是如何创建的,再看看其定义。

3 Filament 渲染通道的创建

Filament 渲染引擎剖析 之 FrameGraph 2 动态构建渲染管线_第3张图片
FrameGraph 的 addPass 函数来创建 渲染通道 FrameGraphPass,下面看看 FrameGraphPass的定义:

Filament 渲染引擎剖析 之 FrameGraph 2 动态构建渲染管线_第4张图片
FrameGraphPass 包含渲染资源数据 mData 及 渲染执行的匿名函数(lambda) mExecute。 这个类模版可以被实例化为具有不同渲染数据和执行函数的FrameGraphPass。Data渲染资源定义的数据类型就是在addPass的时候确定好的,具体如何实现由用户设计。
Filament 渲染引擎剖析 之 FrameGraph 2 动态构建渲染管线_第5张图片
addPass 过程中调用 createPass 创建 PassNode ,并将PassNode 添加到 FrameGraph 的渲染通道节点数组中,接下来看看PassNode 的定义:

Filament 渲染引擎剖析 之 FrameGraph 2 动态构建渲染管线_第6张图片
可以看出 PassNode 的作用跟上一节中的ResourceNode 的作用很类似,都是为FrameGraph的构建提供支持,它包含渲染通道如何使用资源的一些信息,管理这些资源在什么阶段执行初始化和销毁操作。

二、编译渲染通道生成FrameGraph

1. 准备好渲染资源

当我们通过 FrameGraph 的 addPass 接口构建完帧图时,FrameGraph 实例中应该记录了所有待编译资源使用状态及渲染通道状态,FrameGraph 的资源如下:
Filament 渲染引擎剖析 之 FrameGraph 2 动态构建渲染管线_第7张图片

成员名称 说明
mPassNodes 渲染通道节点数组。渲染通道节点是在编译期间记录通道资源使用情况的代理类,为通道的剔除服务。
mResourceNodes mResourceNodeEntries `这两个FrameGraph的成员对象,目前来看保存的是一类东西,区别是UniquePtr可以在资源超出作用域时自动析构资源。ResourceNode 类记录了资源在编译阶段的使用情况,比如引用计数。因为资源可以被导入共享,多个ResourceNode可能指向同一个具体的资源。
mResourceEntries 虚拟资源入口类,是虚拟资源的代理类,可以通过实例化创建具体的资源, 是 ResourceNode 的关联的具体资源。

2. 下一步最有意思的地方就是编译帧图的过程

这里你会看到,filament 是如何剔除掉没有使用的渲染资源和渲染通道,也是FrameGraph的核心思想所在。
Filament 渲染引擎剖析 之 FrameGraph 2 动态构建渲染管线_第8张图片
Filament 渲染引擎剖析 之 FrameGraph 2 动态构建渲染管线_第9张图片
Filament 渲染引擎剖析 之 FrameGraph 2 动态构建渲染管线_第10张图片
Filament 渲染引擎剖析 之 FrameGraph 2 动态构建渲染管线_第11张图片

上一节 Filament 渲染引擎剖析 之 FrameGraph 1 虚拟资源的定义与创建

你可能感兴趣的:(Filament)