在渲染通道的不同子通道中写入相同的颜色缓冲区

Write same color buffer in different sub-passes of the render pass

我写了一个VkRenderPass。有两个颜色和深度附件 VkAttachmentDescriptions,我们注意到它们是 C0、C1、D0 和 D1。我列出每个VkAttachmentDescription的详细信息如下:

C0 : LoadOp clear, StoreOp Store.
D0 : LoadOp clear, StoreOp Store.
C1 : LoadOp load, StoreOp Store.
D1 : LoadOp load, StoreOp Store.

我为这个 VkRenderPass 写了两个子通道,第一个子通道(注意 SP1)使用 C0 作为颜色附件,D0 作为深度附件。第二个子通道(注意 SP2)使用 C1 作为颜色附件,使用 D1 作为深度附件。 SP1和SP2之间的VkSubPassDependency描述如下:

srcPipelineStage : Bottom.
dstPipelineStage : Top

表示SP2中的绘图命令需要等待SP1完成。我尽量避免写后写的危险。(我不确定它的用法是否正确?)

现在让我们看看我的渲染流程。

首先,我有两个VkImages,一个用作颜色缓冲(注意Cb)。另一个用作深度缓冲区(注意 Db)。

其次,我写了四个VkImageViews来绑定VkFrameBuffer的颜色和深度缓冲区(注意FB)。我指定四个 ImageViews 如下:

ImageView 0 bind with color buffer Cb.
ImageView 1 bind with depth buffer Db.
ImageView 2 bind with color buffer Cb.
ImageView 3 bind with depth buffer Db.

然后,绘制流程如下:

BeginRenderPass with FB( current is SP0)
vkCmdDraw for quad1. (we call this C00)
vkCmdDraw for quad2. (we call this C01)
vkCmdNextRenderPass (current should be SP1)
vkCmdDraw for quad1. (we call this C00)
vkCmdDraw for quad2. (we call this C01)
EndRenderPass

终于可以看到结果是我的预期了。但是我对这个渲染流程有一些疑问。

首先是关于多个子通道。我找到了一些信息,他们告诉我子通道之间的执行是异步的。是真的吗?

如果是真的(命令执行是子pass间异步),第二题来了

同一个sub-pass进程中绘制命令的pipeline stages是step-by-steps的吗?

比如C00和C01是SP0中的绘图命令。 C00和C01的执行是这样的吗:

SP0 => C00 TOP -> C01 TOP -> C00 VERTEX INPUT -> C01 VERTEX INPUT -> C00 VERTEX SHADER -> C01 VERTEX SHADER -> … C00 BOTTOM -> C01 BOTTOM.

(因为我觉得应该按照这个例子的步骤来执行,所以VkSubPassDependency可以用来同步子pass。)

这是我的两个问题。

B.R.

1.

是的,就像 Vulkan 中的大部分内容一样,子通道彼此异步。任何类型的同步仅由那些 Subpass Dependencies 明确给出。

为了完整起见,"asynchronous" 表示子通道之间没有指定时间。它们可以串行执行、重新排序、并行执行、抢占或介于两者之间。司机的选择。

2.

在单个子通道中,绘制命令的输出附件是同步的 implicitly\automatically(规范为健全而做出的大约两个例外之一)。这称为光栅化顺序。它尊重原始顺序,这意味着第二次绘制的三角形将在第一次绘制的三角形之上。

其他任何东西都需要显式同步。

所有命令中的 TOP 在技术上确实按顺序执行。虽然 "execute" 有点用词不当。舞台什么都不做。

您的舞台订单只是众多可能订单之一。另一个符合要求的命令是例如C00 上的所有阶段 -> C01 上的所有阶段。尽管这是一个高度理论上的差异。重要的是我们必须观察其中的一些 side-effect,我无法想象这是可能的。

Subpass Dependency 以任何一种方式工作,所以不确定这两个问题是如何关联的。当您指的是所有阶段时,我建议使用 ALL 而不是 TOP 或 BOTTOM;更具可读性,更少 error-prone.