vulkan学习(五)——RenderPass与SubPass
一、RenderPass与 SubPass 基础理论
1.1 基础概念说明
-
RenderPass
: 每次提交Draw call
命令之后,到输出一张或多张图片结果,这个过程称为RenderPass
,在Vulkan中可以创建其对象,主要描述了Pass当中的输入输出相关信息。 -
SubPass
:存在很多渲染方式,需要多次Pass才能渲染得到最后的结果,比如:- 第一个Pass,先渲染一张图片,然后将其作为纹理,输送到下一个Pass
- 第二个Pass,对图片上像素进行采样,卷积运算,将图片中边缘高光化
以上两个过程就是两个SubPass
-
Attachment(RenderPass附着)
: 每一个Pass,都要有选然后的输出画布,那么一张画布,我们就称为一个Attachment。ColorAttachment
:每一个Pass,负责承接颜色输出的画布;一个Pass可以有多个ColorAttachment,分别输出不同含义的颜色信息DepthStencilAttachment
:每一个Pass,负责承接深度/模板信息输出的画布;一个Pass只能有一个此类Attachment
-
Depth深度信息
:对于屏幕上每一个像素,都有可能输出多个物体的Fragment,那么就需要知道谁在前,谁在后,从而确定彼此之间的遮挡信息。
深度信息处理流程:- 初始Attachment的每个像素都是MAX最大值(一般是1.0)
- 第一个物体绘制后,更新相关区域的Depth信息
- 第二个物体绘制,会用其深度与当前值进行对比,如果比当前值小,则进行绘制,否则丢弃
-
Stencil模板信息
:对屏幕上每一个像素,可以通过渲染一个物体,针对其覆盖区域输出模板参数,再针对模板参数进行绘制。- 初始Attachment的每个像素都是0
- 开启模板写权限,绘制一个三角形,其覆盖区域会被设置为1
- (在新的RenderPass下)关闭模板写权限,绘制下一个更大的三角形,并且规定 模板为1的地方输出的图元会丢弃掉
一般情况下,深度与模板Attachment是在一张图片上的,比如每个像素:24位是Depth,8位是Stencil。
1.2 RenderPass知识点总结
- 附着分为colo附着与深度模板附着
- Color附着可以有多个,分别输出不同含义的信息,也可以输入到下一个subpass作为输入纹理
- 深度模板附着可以选择开启,但只能有一个附着,下一个阶段也可以继续沿用,深度与模板合一
- 附着创建之后,绑定在RenderPass上,作为RenderPass的模板
1.3 RenderPass 附着索引
附着索引
:在创建了N个ColorAttachment以及一个DepthStencilAttachment之后,我们会将他们一起放在一个数组当中传递给RenderPass,那么在SubPass当中,需要确定使用这个数组中的哪些附着。
因此,用于描述附着在数组中位置以及格式信息的结构,就称为附着索引
。
注意:其中每个索引都描述了当前附着在输入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同步机制理解
一般同步机制:
vulkan中的并行同步机制
问题:如果只是规定了两个SubPass之间的调用过程依赖,那么就完美了吗?
答案:不完美!
原因:粒度还不够细致,每个ShaderStage都会有很多操作,比如读入,写入等,如果上一个SubPass没有写入完毕,下一个就开始了,那就GG了。
有如下问题需要思考:
- 第二个SubPass在等待上一个SubPass设定的哪一个Stage的什么操作执行完毕后才可以执行?
- 第二个SubPass的哪一个Stage的什么操作需要停止下来,等待阻塞完成呢?
为了解决以上问题:
每两个SubPass之间的依赖都需要设置两组数据:
- srcPassStage,srcAccess:规定了上一个SubPass的哪一个Stage的哪一个操作完成后才能执行。
- dstPassStage,dstAccess:规定了下一个SubPass阻塞在哪一个Stage的哪一个操作后。
内存同步问题:思考两个Pass在资源交接的时候到底发生了什么?
内存同步
SM(Stream Multiprocessor
:GPU当中存在多个流水线运算单元。
类似CPU,每个SM都拥有自己的ControlUnit,存在多级缓存架构,寄存器,L0,L1,L2等cache,上一个SubPass执行完毕的结果,会存储在当前SM的Cache中,必须完全同步到主存当中之后,才可以被另一个SM流水线过程“看到”。
总结:
我们在使用多个SubPass做级联渲染的时候,需要给各个SubPass之间设置好彼此依赖:
- 运行Stage的依赖
- Stage内操作的依赖
二、整体总结回顾
2.1 Pipeline与RenderPass工作流程
EXTERN 一进一出,表示两个虚拟流程
每两个流程之间有一个dependency依赖
Pipeline与RenderPass都是渲染模式设置,并不会设置真实数据,比如图片、顶点数据等,数据都是渲染期间动态绑定到命令上的。
2.2 FrameBuffer 信息整合
2.3 图片流程
- 点赞
- 收藏
- 关注作者
评论(0)