vulkan学习(五)——RenderPass与SubPass

举报
lutianfei 发表于 2022/04/12 17:38:37 2022/04/12
【摘要】 一、RenderPass与 SubPass 基础理论 1.1 基础概念说明RenderPass: 每次提交Draw call命令之后,到输出一张或多张图片结果,这个过程称为RenderPass,在Vulkan中可以创建其对象,主要描述了Pass当中的输入输出相关信息。SubPass:存在很多渲染方式,需要多次Pass才能渲染得到最后的结果,比如:第一个Pass,先渲染一张图片,然后将其作为...

一、RenderPass与 SubPass 基础理论

1.1 基础概念说明

  • RenderPass: 每次提交Draw call命令之后,到输出一张或多张图片结果,这个过程称为RenderPass,在Vulkan中可以创建其对象,主要描述了Pass当中的输入输出相关信息。

  • SubPass:存在很多渲染方式,需要多次Pass才能渲染得到最后的结果,比如:

    1. 第一个Pass,先渲染一张图片,然后将其作为纹理,输送到下一个Pass
    2. 第二个Pass,对图片上像素进行采样,卷积运算,将图片中边缘高光化
      以上两个过程就是两个SubPass
  • Attachment(RenderPass附着): 每一个Pass,都要有选然后的输出画布,那么一张画布,我们就称为一个Attachment。

    • ColorAttachment:每一个Pass,负责承接颜色输出的画布;一个Pass可以有多个ColorAttachment,分别输出不同含义的颜色信息
    • DepthStencilAttachment:每一个Pass,负责承接深度/模板信息输出的画布;一个Pass只能有一个此类Attachment
  • Depth深度信息:对于屏幕上每一个像素,都有可能输出多个物体的Fragment,那么就需要知道谁在前,谁在后,从而确定彼此之间的遮挡信息。
    深度信息处理流程:

    1. 初始Attachment的每个像素都是MAX最大值(一般是1.0)
    2. 第一个物体绘制后,更新相关区域的Depth信息
    3. 第二个物体绘制,会用其深度与当前值进行对比,如果比当前值小,则进行绘制,否则丢弃
      image.png
  • Stencil模板信息:对屏幕上每一个像素,可以通过渲染一个物体,针对其覆盖区域输出模板参数,再针对模板参数进行绘制。

    1. 初始Attachment的每个像素都是0
    2. 开启模板写权限,绘制一个三角形,其覆盖区域会被设置为1
    3. (在新的RenderPass下)关闭模板写权限,绘制下一个更大的三角形,并且规定 模板为1的地方输出的图元会丢弃掉
      一般情况下,深度与模板Attachment是在一张图片上的,比如每个像素:24位是Depth,8位是Stencil。
      image.png

1.2 RenderPass知识点总结

  1. 附着分为colo附着与深度模板附着
  2. Color附着可以有多个,分别输出不同含义的信息,也可以输入到下一个subpass作为输入纹理
  3. 深度模板附着可以选择开启,但只能有一个附着,下一个阶段也可以继续沿用,深度与模板合一
  4. 附着创建之后,绑定在RenderPass上,作为RenderPass的模板

1.3 RenderPass 附着索引

附着索引:在创建了N个ColorAttachment以及一个DepthStencilAttachment之后,我们会将他们一起放在一个数组当中传递给RenderPass,那么在SubPass当中,需要确定使用这个数组中的哪些附着。
因此,用于描述附着在数组中位置以及格式信息的结构,就称为附着索引

image.png
注意:其中每个索引都描述了当前附着在输入subpass前应该转换成什么样的格式。

1.4 Attachment图片格式

图片格式:一个Attachment其实就是一张图片,就得有自己的存储格式。如:

VK_IMAGE_LAYOUT_UNDEFINED:不关心其格式
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:适合颜色附着的优化格式
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:适合深度模板附着的优化格式

格式转换:每个SubPass对于附着都有自己的要求,那么在进入本SubPass之前,Vulkan会做一次隐性的图片格式转换,相当于插入了一个VkBarrier

二、SubPass及其依赖

Vulkan同步机制理解
一般同步机制:
image.png

vulkan中的并行同步机制
image.png

问题:如果只是规定了两个SubPass之间的调用过程依赖,那么就完美了吗?
答案:不完美!
原因:粒度还不够细致,每个ShaderStage都会有很多操作,比如读入,写入等,如果上一个SubPass没有写入完毕,下一个就开始了,那就GG了。

有如下问题需要思考:

  • 第二个SubPass在等待上一个SubPass设定的哪一个Stage的什么操作执行完毕后才可以执行?
  • 第二个SubPass的哪一个Stage的什么操作需要停止下来,等待阻塞完成呢?

为了解决以上问题:
每两个SubPass之间的依赖都需要设置两组数据:

  1. srcPassStage,srcAccess:规定了上一个SubPass的哪一个Stage的哪一个操作完成后才能执行。
  2. dstPassStage,dstAccess:规定了下一个SubPass阻塞在哪一个Stage的哪一个操作后。

内存同步问题:思考两个Pass在资源交接的时候到底发生了什么?

内存同步

SM(Stream Multiprocessor:GPU当中存在多个流水线运算单元。

类似CPU,每个SM都拥有自己的ControlUnit,存在多级缓存架构,寄存器,L0,L1,L2等cache,上一个SubPass执行完毕的结果,会存储在当前SM的Cache中,必须完全同步到主存当中之后,才可以被另一个SM流水线过程“看到”。

image.png

总结:
我们在使用多个SubPass做级联渲染的时候,需要给各个SubPass之间设置好彼此依赖:

  1. 运行Stage的依赖
  2. Stage内操作的依赖

二、整体总结回顾

2.1 Pipeline与RenderPass工作流程

EXTERN 一进一出,表示两个虚拟流程
每两个流程之间有一个dependency依赖

image.png

Pipeline与RenderPass都是渲染模式设置,并不会设置真实数据,比如图片、顶点数据等,数据都是渲染期间动态绑定到命令上的。

2.2 FrameBuffer 信息整合

image.png

2.3 图片流程

image.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。