GDC2017:Framegraph-extensible-rendering-architecture-in-frostbite

https://www.slideshare.net/DICEStudio/framegraph-extensible-rendering-architecture-in-frostbite

J:\Download\GDC\2017\GDC-FrameGraph.pptx

FrameGraph-Extensible_Rendering_Architecture_in_Frostbite.mp4
442386-20180303165514283-195124921.png

442386-20180303165518949-23834348.png
  • 改进引擎的扩展性
  • 简化一步计算
  • ESRAM


442386-20180303165526284-2045471755.png
  • DICE次时代引擎
  • EA引擎


442386-20180303165541854-441505176.png
  • 游戏列表

442386-20180303165600500-547932138.png
  • 07年引擎的渲染系统

442386-20180303165607620-493674039.png
  • 对比17年的
  • 除了绿色部分,整体架构貌似差不多

442386-20180303165614690-2052780324.png
  • 简版的渲染系统
  • 前向、后向
  • 渲染上下文(RC),
  • WR:

442386-20180303165620695-755915434.png
  • 详细解释一下WR
  • 代码驱动?
  • 负责分配渲染资源(RT,Buffers)

442386-20180303165628122-1837557985.png
  • 战地四 用到渲染特性


442386-20180303165636135-1624192059.png
  • WR的挑战:

  • 资源管理
    • 各自手工管理ESRAM
    • 每个Team有各自的实现方式

  • 和渲染系统高耦合
  • 可扩展性差
  • 代码量:4k行上涨到15K行
    • 单个函数超过2k行
    • 维护代码合并、集成代码代价很大

442386-20180303165643051-492342161.png
  • 模块化的WR实现目标:

    • 改进可扩展性
      • 低耦合、组件式代码模块
      • 自动化资源管理
    • 可视化、可调试

442386-20180303165648845-1006049962.png
  • 新架构中,添加了FrameGraph和Transient Resouces


442386-20180303165654816-1957629655.png
  • 现在解释FG
  • FG主要解决的问题
    • 能构建整个帧的图节点
      • 简化资源管理
      • 简化渲染管线的配置
      • 简化异步计算和资源隔离
    • 能DIY
    • 可视化和Debug

442386-20180303165700914-899052149.png
  • 举一个FG的例子
  • 橙色节点是渲染操作节点,蓝色节点是资源节点
  • 能看到整个渲染管线流程


442386-20180303165707062-1348332160.png
  • 战地4中的一个FrameGraph
  • 上百个Pass和Resouce节点

  • 超级大的Graph


442386-20180303165713581-166224566.png
  • 演示内存分布

442386-20180303165719289-1511907501.png
  • 脱离Immediate mode (底层模式)
  • 渲染的代码抽取到passes
  • 多阶段 retained mode (高端模式)
    • Setup
    • Compile
    • Execute
  • 这样做就是要统一模式,固定?
  • 代码驱动架构?

442386-20180303165724988-458148338.png
  • 详细及时FG的每个阶段
  • 解释Setup阶段
    • 定义了RenderPass和ComputePass
    • 定义了资源的输入输出
    • 代码流程类似于ImmediateMode


442386-20180303165731105-2059603963.png
  •  在RenderPass中需要控制所有可用资源
    • 可读
    • 可写
    • 可创建
  • 其他永久性的资源用Import形式到FrameGraph
    • Historybuffer
    • BackBuffer
    • 全局buffer?
    • 固定

442386-20180303165736853-1151488085.png
  • 举例说明一个Resource例子
  • 创建一个renderTarget

442386-20180303165742403-1769217803.png



442386-20180303165747751-732730724.png
  • Setup的一个例子


442386-20180303165753802-209035693.png
  • 高级操作
    • 延迟创建资源
    • 继承资源参数
    • 移动子资源?

442386-20180303165800228-1140826679.png
  • 延迟渲染模块到反射模块
  • 解释MoveSubresource


442386-20180303165806816-241345961.png
  • 编译阶段:
  • 去除没有引用到的资源
  • 分配实在的GPU资源


442386-20180303165814285-1522944685.png
  • 禁用掉Lighting过程
  • 插入DebugView
  • 再将结果Move到FinalTarget上
  • 这就是截断的例子

442386-20180303165820870-1050895140.png
  • 执行阶段:
    • 执行回调
    • ImmediateMode
      • 调用渲染API
      • 设置state、resource、Shader
      • Draw、Dispatch
    • 在这个阶段获取GPU的实际使用资源(GPU层)


442386-20180303165826896-1618835411.png
  • 异步计算:
    • 自动继承过来
    • 手动控制的问题
      • 内存增长
      • 滥用影响性能



442386-20180303165832702-82952476.png
442386-20180303165838372-1237879699.png
  • 主线程到异步线程过程


442386-20180303165843912-985748074.png

442386-20180303165849336-1017176829.png
  • 采用C++类形式改造的问题:
    • 破坏代码流程
    • 需要大量引用?
    • 导出现有代码到C++类太费力
  • 考虑使用 C++Lambdas (C++14)
    • 保存原有代码流程
    • 在原有基础上最小的改动
      • 在原有代码上包裹一层Lambda
      • 添加一个ResourceUsage定义

442386-20180303165855886-797128206.png
  • 一个例子
  • &和= 重载?


442386-20180303165902901-668801841.png
  • 渲染模块(每种Feature?)
  • 渲染模块有两种类型
    • 独立无状态函数?
      • 输入输出是FG的Resource
      • 可以嵌套Pass
      • 这个是最常用的类型
    • 常驻类型
      • 常驻资源相关(LUTs History buffers)
  • WR仍然属于高层级的渲染
    • 不会去分配GPU资源
    • 仅仅是控制各个渲染模块的开关
    • 更加易于扩展
    • 代码量从15K行减到5K行

442386-20180303165909995-535999418.png
  • modules之间的通信
  • 通过blackboard(黑板)通信
    • component的hash表
  • 举例说明
    • BlurModule和TonemapModule通信
    • blackboard.get<BlurPyramidData>

442386-20180303165917011-1926858118.png
  • 临时资源管理

  • FG中的关键组件?

442386-20180303165923276-2059281786.png
  • 【临时资源系统底层】
  • 不同平台下的不同处理
    • XB1
    • DX12 PS4
    • DX11
  • Texture的内存池


442386-20180303165929272-1360000140.png
442386-20180303165934997-1443668857.png
442386-20180303165940380-1748192448.png
  • PS4上面的Texture的例子
  • 在不同时期分配不同地址
  • DX12上,分不同Heap
  • XB1上,LightBuffer被分开了,
    • 因为随申请随用?

442386-20180303165946212-690221875.png
  • 【关于内存对齐的一些建议】


442386-20180303165952887-479232677.png
  • 优先考虑DiscardResource而不是Clear

442386-20180303165959968-1673791500.png
442386-20180303170008371-1456762151.png
442386-20180303170016573-1841199063.png
  • 对齐隔离带
  • CS Compute share
  • PS Pixel Share

442386-20180303170021397-1498101252.png
442386-20180303170023431-1570902720.png
442386-20180303170025788-416406618.png
442386-20180303170027789-24142643.png
  • 以战地4为例
  • 147M为没有对齐的内存
  • 不同平台的数据
    • DX12 80M
    • PS4 77M
    • XB1 76M

442386-20180303170030357-1931098738.png
  • 【总结】



442386-20180303170033624-749794277.png
  • 【将来的工作】

442386-20180303170035914-1110623726.png

他的Blog














转载于:https://www.cnblogs.com/username/p/8497150.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值