FrameGraph前提
资源动态管理前提是需要将DrawCall封装为Command在后面需要执行的时候再执行,这部分可参考之前写的另一篇帖子:Filament引擎分析–command抽象设备API
1.FrameGraph结构
FrameGraph整体是一个有向无环图的结构,Node和Edge以数组形式存储在DependencyGraph中
2. FrameGraph流程
主要分三个阶段:
3. setup阶段
FrameGraphPass→addPass(name, Setup , Execute)
Setup作用 :
创建虚拟资源
指定虚拟资源跟当前PassNode的关系(read/write)
根据read/write调用关系,将PassNode存储到DependencyGraph
Execute作用:
自定执行渲染过程回调函数,使用资源,调用Driver渲染接口
fg.addPass<ExportSSRHistoryData>("Export SSR history",
[&](FrameGraph::Builder& builder, auto& data) {
builder.sideEffect();
data.history = builder.sample(colorPassOutput);
},
[&view, projection](FrameGraphResources const& resources, auto const& data,
backend::DriverApi&) {
auto& history = view.getFrameHistory();
auto& current = history.getCurrent();
current.ssr.projection = projection;
resources.detach(data.history,rrent.ssr.color, ¤t.ssr.desc);
//driver.beginRenderPass(out.target, out.params);
//passExecutor.execute(engine, resources.getPassName());
//driver.endRenderPass();
//driver.flush();
}
);
4. compile阶段
遍历FramGraph中的所有PassNode:
- 通过graph找到该passNode读写的关系的VirtualResource,给VirtualResource的refCount+1
- VirtualResource记录第一个使用的passNode(first)并添加到其devirtualize和最后一个的pass(last)并添加到其destroy数组
5. execute阶段
遍历FramGraph中全部passNode:
- 申请其devirtualize中所有的VirtualResource对应的GPU资源
- 执行用户定义的渲染回调函数
- 销毁其destroy中的资源