渲染流程的子流程会自动进行图像布局变换。这一变换过程由子流程
的依赖所决定。
子流程的依赖包括子流程之间的内存和执行的依赖关系。
虽然我们现在只使用了一个子流程,
但子流程执行之前和子流程执行之后的操作也被算作隐含的子流程。
在 渲 染 流 程 开 始 和 结 束 时 会 自 动 进 行 图 像 布 局 变 换,但 在 渲 染 流
程 开 始 时 进 行 的 自 动 变 换 的 时 机 和 我 们 的 需 求 不 符, 变 换 发 生 在 管
线 开 始 时,但 那 时 我 们 可 能 还 没 有 获 取 到 交 换 链 图 像。
有 两 种 方 式 可
以解决这个问题。一个是设置 imageAvailableSemaphore 信号量的 wait-
Stages 为 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,确保渲染流
程 在 我 们 获 取 交 换 链 图 像 之 前 不 会 开 始。
一 个 是 设 置 渲 染 流 程 等 待
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 管线阶段。在这里,为了让读者能够了解子流程依赖如何控制图像布局变换,
我们使用第二种方式。
配置子流程依赖需要使用 VkSubpassDependency 结构体。
VkSubpassDependency dependency = { } ;
dependency . s r c S u b p a s s = VK_SUBPASS_EXTERNAL;
dependency . dstSubpass = 0 ;
srcSubpass 和 dstSubpass 成员变量用于指定被依赖的子流程的索引和
依赖被依赖的子流程的索引。
VK_SUBPASS_EXTERNAL 用来指定我们
之前提到的隐含的子流程,对 srcSubpass 成员变量使用表示渲染流程开始
前的子流程,对 dstSubpass 成员使用表示渲染流程结束后的子流程。
这里
使用的索引 0 是我们之前创建的子流程的索引。为了避免出现循环依赖,
我们给 dstSubpass 设置的值必须始终大于 srcSubpass。
dependency . srcStageMask =VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
dependency . srcAccessMask = 0 ;
srcStageMask 和 srcAccessMask 成员变量用于指定需要等待的管线阶
段和子流程将进行的操作类型。
我们需要等待交换链结束对图像的读取才
能对图像进行访问操作,也就是等待颜色附着输出这一管线阶段。
dependency . dstStageMask =VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
dependency . dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT
| VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
dstStageMask 和 dstAccessMask 成员变量用于指定需要等待的管线阶
段和子流程将进行的操作类型。在这里,我们的设置为等待颜色附着的输
出阶段,子流程将会进行颜色附着的读写操作。