Vulkan规范指出:
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT指定 混合后的 管道,用于输出最终颜色值 从管道中。
这似乎暗示了片段着色器和颜色附着输出之间发生混合的不确定阶段。
但是,假设写入图像后,我想将其用作颜色附件,并使用srcStageMask=VK_PIPELINE_STAGE_TRANSFER_BIT
,srcAccessMask=VK_ACCESS_TRANSFER_WRITE_BIT
,dstStageMask=VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
,dstAccessMask=VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT
添加内存依赖项。如果混合是在颜色附加输出阶段之前完成的,则它可以读取尚不可见的数据。
那么在这种情况下,规范实际上意味着什么?
答案 0 :(得分:1)
记住一些事实很重要:
鉴于这些事实,必须在 转移到图像以及尝试与图像融合之间进行渲染过程。并请注意,您的混合操作依赖于图像中的数据,即渲染过程开始时的状态。这意味着您用于附件的loadOp
需要加载图像,而不是清除图像。
然后为了使渲染过程开始加载图像...它必须与该图像的先前修改进行同步。规范做了阐明了哪个阶段实际执行了加载操作以及所有这些工作如何工作:
对附件中每个样本的加载操作发生在使用该附件的第一个子通道中访问该样本的任何记录命令之前。具有深度/模板格式的附件的加载操作在
VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
流水线阶段执行。以彩色格式加载附件的操作在VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
流水线阶段。
因此,您不需要将传输与混合操作同步;您需要将传输与渲染过程同步。而该阶段是COLOR_ATTACHMENT_OUTPUT
。
关于您问题的更深层次(什么阶段进行了混合),答案是Vulkan不允许这样。在渲染过程中用作附件的图像只能以非常有限的方式使用。如前所述,您不能只对它们执行任意传输操作。您不能对它们执行任意的写操作。您只能以颜色/深度/模板附件和/或输入附件的形式访问其数据。
自动处理不同渲染命令(在同一渲染过程中)的混合之间的同步。而且您无法通过输入附件(因此称为名称)写入图像。因此,没有特别需要使混合产品对其他操作可见。
基本上,由于渲染过程模型的局限性以及混合和其他按样本操作的顺序保证,混合永远不需要显式阶段。