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

1 Frostbite 构建FrameGraph的准则

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

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

如下图所示:


如果不考虑渲染通道的并行计算与同步问题,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 虚拟资源的定义与创建

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

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

    Filament 使用了可扩展渲染管线(FrameGraph)来组织渲染通道和管理渲染资源,网上也搜了下可扩展渲染管线的相关的文章,一般认为可扩展渲染管线是次时代渲染引擎应该具备的比较先进的管线组织架 ...

  2. pyqt创建窗口没有句柄_Filament 渲染引擎剖析 之 FrameGraph 1 虚拟资源的定义与创建...

    Filament 使用了可扩展渲染管线(FrameGraph)来组织渲染通道和管理渲染资源,网上也搜了下可扩展渲染管线的相关的文章,一般认为可扩展渲染管线是次时代渲染引擎应该具备的比较先进的管线组织架 ...

  3. Filament渲染引擎剖析 之 通过图元构建几何体

    Filament渲染引擎剖析 之 通过图元构建几何体 什么是图元 filament可绘制的图元类型 构建图元的工具 VertexBuffer IndexBuffer Primitive 什么是图元 图 ...

  4. Filament 渲染引擎剖析 之 多线程渲染 2

    Filament 渲染一帧流程 Filament 是一款针对多核硬件系统开发的并行渲染引擎,内部通过多线程的合理调度,尤其在android移动平台上针对大小核心架构做了很多优化设计,比如通过设置线程亲 ...

  5. Filament 渲染引擎剖析 之 创建渲染对象 1

    Filament 渲染对象的创建 Filament 将实体(Entity)属性看成组件(component)的形式,实体可以是相机,光源,可绘制实体, 全局光照(IBL)实体等类型.一个场景包含最多. ...

  6. Filament 渲染引擎剖析 之 ECS模式

    一.什么是 ECS 模式 ECS Entity-Component-System(实体-组件-系统) 是基于组合优于继承原则的一种模式,每一渲染对象都是一个实体,每个实体由一个或者多个组件构成,每个组 ...

  7. 【我的渲染技术进阶之旅】基于Filament渲染引擎绘制一个不停旋转的彩色矩形

    一.绘制三角形回顾 在上一篇博客 [我的渲染技术进阶之旅]Google开源的基于物理的实时渲染引擎Filament源码分析:Android版本的Filament第一个示例:sample-hello-t ...

  8. Filament 渲染引擎简介

    Filament 是一款基于物理的实时渲染引擎.引擎核心主要使用C++开发完成.支持平台包括 Android,IOS,Linux,macOS, Windows, and WebGL.尤其对Androi ...

  9. Cryengine渲染引擎剖析

    ms,OpenGPU这些天又冷下去了, 转篇Napoleon314 大牛的分析,排版好乱,见谅,耐心读,这是个好东西,注意看他自己的实现,是个技术狂人啊,Ogre焕发次时代的光芒啊~~~努力 ---- ...

最新文章

  1. php调用python脚本_Window环境下,PHP调用Python脚本
  2. [Ubuntu]更改所有子文件和子目录所有者权限
  3. SAP账户1405001000对于业务/事件代码BSX,可直接记账
  4. 印象笔记无法连服务器(internet explore的问题)
  5. clone git 要输入yes_GitHub,git与python连接使用
  6. java 声波 噪音过滤_攻略||让噪音一边去的隔音材料全解析!
  7. 原生JS实现HTML文件上传,HTML5 js实现拖拉上传文件功能
  8. 使用idea创建项目并通过git上传到码云
  9. 创建Android Virtual Device
  10. 改写js原装的alert样式
  11. 51nod 1268最大距离
  12. #include stdafx.h
  13. 人工智能在医疗领域的应用
  14. Android基础整合项目之节日群发助手
  15. Rabbit MQ消息队列原理
  16. 为 windows cmd 设置代理
  17. h3c无线认证服务器,H3C无线路由器配置样例之无认证接入
  18. 腾讯云服务器搭建网站详细教程(新版)
  19. Python出租车GPS数据的路网匹配(TransBigData+leuvenmapmatching)
  20. 2013-04《信息资源管理 02378》真卷解析,逐题解析+背诵技巧

热门文章

  1. 虚拟现实汽车模拟仿真项目
  2. 使用Java解决远程文件下载解决方案
  3. 周怎么换算成月_嘉会班三年级第十六周(2020年12月14日—12月18日)
  4. Linux scp 远程复制
  5. 学习modbus(八)——单片机RS485通信接口、控制线、原理图及程序实例
  6. 油猴脚本推荐:讨厌广告的进,去除百度、360、搜狗、必应的广告和重复内容!广告害人,且用且珍惜
  7. Experiment(英语笔记)
  8. 全志B288驱动移植3-修改tps65185的VCOM
  9. NIO中的零拷贝--transferTo
  10. 快速排序(基于顺序容器vector;基于数组array)