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

时间:2019-12-23 17:07:37

标签: vulkan

我写了一个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完成。我尽力避免写后写的危险。(我不确定它是否正确使用?)

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

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

第二,我编写了四个VkImageView,用于绑定VkFrameBuffer(请注意FB)的颜色和深度缓冲区。我指定了四个ImageView,如下所示:

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

最后,我可以看到结果是我的期望。但是我对此渲染流程有一些疑问。

第一个是关于多个子通道。我发现了一些信息,它们告诉我子遍之间的执行是异步的。是真的吗?

如果它是真实的(命令执行是子遍之间的异步),那么第二个问题来了。

同一子遍进度中绘制命令的流水线步骤是逐步的吗?

例如,C00和C01是SP0中的绘制cmds。这样执行关于C00和C01的操作吗?

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

(因为我认为它应该按照本示例中的步骤执行,所以VkSubPassDependency可以用于同步子通道。)

这是我的两个问题。

B.R。

1 个答案:

答案 0 :(得分:0)

1。

是的,就像Vulkan中的大多数内容一样,子通道是彼此异步的。任何类型的同步都只能由这些Subpass依赖项明确给出。

出于完整性考虑,“异步”表示在子通道之间未指定任何时序。它们可以依次执行,重新排序,并行执行,抢占或介于两者之间执行。驾驶员的选择。

2。

在单个子通道中,绘制命令的附件会隐式\自动同步(规范中出于理智的考虑,大约有两个例外之一)。这称为栅格化顺序。并且尊重原始顺序,这意味着第二次抽奖的三角形将在第一次抽奖的三角形之上。

其他任何事情都需要显式同步。

所有命令的TOP在技术上确实在ordrer中执行。尽管“执行”有点用词不当。舞台什么都不做。

您的舞台顺序只是许多可能的顺序之一。另一个一致的顺序是例如C00上的所有阶段-> C01上的所有阶段。尽管这是一个高度的理论差异。就这一点而言,我们将不得不观察到一些副作用,这是我无法想象的。

Subpass Dependency可以以任何一种方式工作,因此不确定两个问题之间的关系。当您指所有阶段时,我建议使用ALL而不是TOP或BOTTOM;可读性更高,更不易出错。