Render Graph 是现代渲染引擎的一个中间层,下接RHI层,上接渲染管线.

为什么使用Render Graph

传统渲染管线背景:

Render Graph 优势:

  • 高效内存管理,只分配实际使用的资源 -一个pass的资源
  • 自动处理同步点 -graph可以处理pass之间依赖
  • 可维护性高 -pass高内聚,低耦合

名词

  • Render Graph: 渲染图,管理 Pass DAG
  • Pass: 一个完成的渲染过程,是Render Graph 的一个节点

主要原则

  • Resource Haldles:
    你无法直接处理资源,而是通过Handle来间接处理,如RTHandles,ComputeBuffers,RendererLists
  • 资源访问限制:
    你只被允许在 Render Pass 的 Execution 中访问资源
  • 显示Pass声明:
    你必须明确每个 Pass 读取和写入的资源
  • No Persistence
    每次Excute之间,资源没有持久性,即上次创建的资源无法在下一次中使用
  • 持久性资源解决办法
    对于需要持久性的资源,你需要在Render Graph外部创建后导入.注意,Render Graph不负责他们的生命周期管理
  • RTHadle的处理
    由于使用RTHandle管理纹理资源, 这要求开发者了解如何在shader中正确设置他们

资源管理

Render Graph 只在需要时创建资源,在不需要时销毁资源.

也就是如果你使用 RenderGraph API 创建资源时,Render Graph 并不会立即创建该资源.相反,API 返回一个资源句柄,你可以使用这个句柄与所有 RenderGraph API 进行交互

Execution

Render Graph 的执行分为三个步骤. Render Graph 每帧都会这么做,以让 Render Graph 可以根据用户操作在帧与帧之间动态变化.

Setup

在这一步骤,你需要声明所有需要执行的 pass 和 每个 pass 使用的资源.

Compilation

这一步骤中, Render Graph 做了两件事情:

  1. 计算资源生命周期,在异步管道上应用合适的同步点
  2. 剔除无用通道

Execution

按顺序执行所有未被剔除的 Pass

在执行 Pass 前后, Render Graph 会自动创建与释放资源.

使用 Render Graph