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

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

1 Frostbite 构建FrameGraph的准则

我们先看下Frostbite 构建FrameGraph原则,包括三个阶段:
设置阶段 setup、编译阶段compile、执行阶段execute。Alt

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

如下图所示:

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

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

3 Filament 渲染通道的创建

在这里插入图片描述
FrameGraph 的 addPass 函数来创建 渲染通道 FrameGraphPass,下面看看 FrameGraphPass的定义:

在这里插入图片描述
FrameGraphPass 包含渲染资源数据 mData 及 渲染执行的匿名函数(lambda) mExecute。 这个类模版可以被实例化为具有不同渲染数据和执行函数的FrameGraphPass。Data渲染资源定义的数据类型就是在addPass的时候确定好的,具体如何实现由用户设计。
在这里插入图片描述
addPass 过程中调用 createPass 创建 PassNode ,并将PassNode 添加到 FrameGraph 的渲染通道节点数组中,接下来看看PassNode 的定义:

在这里插入图片描述
可以看出 PassNode 的作用跟上一节中的ResourceNode 的作用很类似,都是为FrameGraph的构建提供支持,它包含渲染通道如何使用资源的一些信息,管理这些资源在什么阶段执行初始化和销毁操作。

二、编译渲染通道生成FrameGraph

1. 准备好渲染资源

当我们通过 FrameGraph 的 addPass 接口构建完帧图时,FrameGraph 实例中应该记录了所有待编译资源使用状态及渲染通道状态,FrameGraph 的资源如下:
在这里插入图片描述

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

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

这里你会看到,filament 是如何剔除掉没有使用的渲染资源和渲染通道,也是FrameGraph的核心思想所在。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值