在哪个流水线阶段执行混合?

During which pipeline stage is blending performed?

Vulkan 规范指出:

VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT specifies the stage of the pipeline after blending where the final color values are output from the pipeline.

这似乎暗示片段着色器和颜色附件输出之间发生混合的某个未定义阶段。

但是假设在写入图像后我想将其用作颜色附件,并使用 srcStageMask=VK_PIPELINE_STAGE_TRANSFER_BITsrcAccessMask=VK_ACCESS_TRANSFER_WRITE_BITdstStageMask=VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT、[=13= 添加内存依赖性].如果混合发生在之前 color-attachment-output 阶段,它可以读取尚不可见的数据。

那么规范在这种情况下的实际含义是什么?

记住几个事实很重要:

  1. 您只能在渲染过程中进行混合。
  2. 无法传输在渲染过程中用作附件的图像。

鉴于这些事实,渲染过程必须在传输到图像和尝试与该图像混合之间开始。请注意,您的混合操作依赖于图像中的数据是渲染通道开始时的数据。这意味着该附件的 loadOp 需要加载图像,而不是清除它。

并且为了让渲染过程开始加载图像...它必须同步与之前对该图像的修改。规范 确实 阐明了实际执行加载操作的阶段以及所有这些工作的工作原理:

The load operation for each sample in an attachment happens-before any recorded command which accesses the sample in the first subpass where the attachment is used. Load operations for attachments with a depth/stencil format execute in the VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT pipeline stage. Load operations for attachments with a color format execute in the VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT pipeline stage.

因此您不需要将传输与混合操作同步;您需要将传输与渲染过程同步。舞台是 COLOR_ATTACHMENT_OUTPUT.

至于你问题的更深层次(混合在哪个阶段),答案是 Vulkan 不允许它重要。在渲染过程中用作附件的图像只能以非常有限的方式使用。如前所述,您不能只对它们执行任意传输操作。您不能对它们执行任意写操作。您只能将他们的数据作为 color/depth/stencil 附件访问 and/or 作为输入附件。

自动处理不同渲染命令(在同一个渲染通道中)混合之间的同步。而且您不能通过输入附件写入图像(因此得名)。所以没有特别需要让混合产品对其他操作可见。

基本上,由于渲染通道模型的限制以及混合和其他 per-sample 操作的顺序保证,混合永远 不需要 显式阶段。