7. Render Pass
一个render pass表示一系列附件、subpass、subpass之间的依赖关系的集合,描述了附件在subpass的过程中是 如何被使用的。 在命令缓冲区中render pass的使用 是一个 render pass实例 。
render pass由VkRenderPass
类型的handle表示:
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkRenderPass)
一个 附件描述 描述了一个附件的属性,包含它的格式、采样数、在每一个render pass实例的开始和结束时它的内容是被看作了什么。
一个 subpass 代表渲染中的一个读写render pass 的附件子集的阶段 。 渲染命令被记录在render pass实例的某一个subpass中。
一个 subpass 描述了参与到subpass执行的附件的子集。 每一个subpass都可以被当作_输入附件_ 的附件中读取数据,写入数据到被当作颜色、深度、模板附件的附件中,并对解析附件执行多采样解析操作。 一个subpass描述也可以包含多个 保留附件,这些附件不被subpass读取或者写入,但是它们的内容在subpass之间被一直保留。
如果附件是该subpass的颜色、深度、模板、解析或者输入附件(如VkSubpassDescription
的成员 pColorAttachments
, pDepthStencilAttachment
, pResolveAttachments
, and pInputAttachments
所描述),一个subpass就可以使用它。 如果一个附件在subpass之间被保留,subpass就不会使用它。 序号最小的subpass第一次使用附件。序号最大的subpass最后一次使用附件。
一个renderpass的所有subpass都渲染到同一维,每一个像素对应的单subpass的多个片元可读取前一个subpass在同一个 (x,y,layer)位置写入的内容。
注意
通过提前描述一个完整的subpass集合,render pass提供了在不同subpass之间优化存储和转移附件数据的机会。 实际上,这意味着带有一个简单帧缓冲区空间依赖的subpass也许会被合并到一个tiled rendering pass,一个render pass实例内附件的数据保持在芯片上。 然而,一个render pass仅仅包含一个subpass也很常见。 |
subpass依赖 描述了subpass之间的执行和内存依赖。
一个 subpass依赖链 是render pass内部多个subpass之间的一系列依赖关系,每一个subpass依赖的源subpass就是前一个依赖关系的目标subpass。
多个subpass也许会重叠或者乱序的执行,除非强制指定执行的依赖顺序。每一个subpass只参考记录到同一个subpass的命令submission order , 和划分renderpass界限的vkCmdBeginRenderPass
、 vkCmdEndRenderPass
命令(在另一个subpass的命令并没有被包含)。 这影响力大多数其他的implicit ordering guarantees。
一个render pass描述了subpass和独立于任何特定图像视图的附件的结构。 这个特定的图像视图(将被用于附件)和附件的维度,通过VkFramebuffer
对象指定。 缓冲区是参考特定的render pass(和缓冲区兼容的,参考Render Pass 兼容性)来创建的。 总的来说,一个render pass和一个帧缓存器给一个或多个subpass定义了完整的渲染状态,也包括多个subpass之间的依赖性。