Vulkan小白 -- RenderPass

引入

  RenderPass是Pipeline的一次执行,涉及渲染目标切换或强制刷新,是现在图形API的新概念。RenderPass本质是由CPU发起的一系列绘制任务,即DrawCall,其本身没有任何真正的数据,旨在明确渲染执行步骤,确保GPU执行的规范化。在OpenGL或其它传统API时代,渲染FrameBuffer的命令交给GPU后实际的执行上没有严谨的次序,并且渲染相对比较随意,而Vulkan将更多的细节暴露给了开发者,因此Vulkan定义了RenderPass来帮助驱动程序来更加明确渲染次序,而不再是随意的渲染,并为进一步性能的优化提供了机会。总结起来其优势有以下几点

  • 优化GPU状态管理 在渲染之前可以优化抓鬼太,减少状态切换开销,给开发者更大的空间来提供性能
  • 并行同步 一次RenderPass需要在一个Command Buffer中执行,Commanf Buffer可以并行构建,这需要同步机制
  • 适用TB(D)R RenderPass要求每个附件描述必须清楚定义Load/Store操作,这可以帮助Driver更加有效地管理On-Chip内存,减少不必要数据移动和带宽消耗,尤其对于将缓冲区切割成多个Tile来渲染的TD(D)R架构
  • 减少CPU开销 RenderPass的命令可以批处理,这可以减低CPU与GPU的通信次数,从而降低CPU功耗
  • 提高一致性 所有的渲染步骤都被定义出来,能够降低帧时间波动,使游戏/app帧率更加稳定
  • 更高的资源管理 资源的控制更加细致

在这里插入图片描述
  Graphics Pipeline可以简单的表示成上图,CPU向GPU提交RenderPass,包括设置管线状态、准备渲染数据,提交DrawCall,不同RenderPass可并行处理。

Attachment

SubPass

  RenderPass的概念其实是没有明确定义的,通常走完一次渲染流程,都能被看作一次RenderPass,但这放到Deferred shading之类存在多次Pipeline的流程里似乎不太准确,因此Vulkan在RenderPass里新增了SubPass概念:共用FrameBuffer的存有依赖的子通道
在这里插入图片描述

  如图,在一次RenderPass中执行两次SubPass,第一个SubPass将填充颜色和深度图像,第二个SubPass将从任一图像中读取(取决于用户选择)对它们应用过滤器并写入Image。
  传统的Deferred Renderer的工作并不利于mobile,依旧存在带宽问题,以下面过程为例:

  • GBuffer Pass
    在这里插入图片描述

  这里有一个4个texture的GBuffer Layerout(Diffuse, Specular, Normals and LightAccumulation),① 为GBuffer和Depth分配内存;② 将GBuffer和Depth设置为RenderTarget;③ 逐Tile渲染GBuffer和Depth,完成后从Tile Memory写入显存。

  • Lighting Pass
    在这里插入图片描述
      现在使用GBuffer作为输入纹理来渲染lighting pass,① 将Light Accumulation设置为RenderTarget,加载到Tile Mmeory;② 加载GBuffer和Depth,此时需要从显存取读取;③ 逐tile渲染Light Accumulation,完成后从Tile Memory写入显存。
    在这里插入图片描述

  可见涉及很多次外部内存的读写操作,功耗增加,也会影响性能,显然是不利于移动设备的,而Vulkan的Subpass加入后,每个SubPass都可以使用上一个的输出作为输入,前一次处理好的缓冲区数据可以保留在片上内存,而不是将这些数据移至主存储器。这节省了大量的外部存储器带宽,这对于移动设备来说非常重要,之前两步与外部内存交互的过程就变成一次,逐tile渲染,每个tile渲染完GBuffer和Depth后,直接基于Tile Memory中信息接着渲染Lighting Pass,待Lighting Pass渲染完毕后再将结果写入显存(不再将GBuffer从Tile Memory写入显存;不再从显存将GBuffer读到Tile Memory)。

Attachment

  Attachment是RenderPass中的资源描述,其本身没有实际数据,只是定义资源得加载与存储,如颜色附件(Color Attachments)、深度/模板附件(Depth/Stencil Attachments)、解析附件(Resolve Attachments)以及输入附件(Input Attachments)等。

Dependency

  同一个RenderPass中的SubPass都共用一个FrameBuffer,因此不同SubPass间势必存在依赖,典型的Deferred shading中Lighting Pass依赖GBuffer Pass结果。

RenderPass的创

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值