在 Vulkan 中有多个子通道时如何将交换链图像复制到 VkBuffer

How to copy Swap chain Image to VkBuffer in case of multiple subpasses in Vulkan

我正在查看此演示以使用深度剥离顺序独立透明度在 vulkan 中渲染场景

博客:https://matthewwellings.com/blog/depth-peeling-order-independent-transparency-in-vulkan/ 代码:https://github.com/openforeveryone/VulkanDepthPeel

我修改了代码,以便能够在呈现以渲染到表面之前将最终渲染保存在输出图像 (png) 中。

一旦由负责绘图操作的次要命令缓冲区组成的主要命令缓冲区被提交到队列以执行并完成渲染,我正在使用 vkCmdCopyImageToBuffer 从当前交换链图像复制数据(复制操作在之后完成引入图像屏障以确保首先完成渲染)到 VkBuffer & 然后将缓冲区内存映射到 unsigned char 指针并将此信息写入 PNG 文件。但是我在 PNG 中看到的输出与 window 上呈现的输出不同,因为框几乎完全透明,带有一些 RGB 信息,如下图所示。

我猜这可能是由于这个涉及多个子通道的特定演示,我没有正确复制数据,但唯一困扰我的是,因为我在最终呈现给表面,我应该在图像中有最终的颜色数据,因此 PNG 和渲染应该匹配。

渲染帧: 保存帧:

如果我没有解释任何细节,请告诉我,我们将不胜感激。谢谢!

您在保存的图像中有 alpha 值 41

如果我只是将其重写为 255 那么图像是相同的。

您可能正在将 VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR 与交换链一起使用,它会自动执行此操作。但是典型的图像查看器会将 alpha 视为预乘 - 因此会感知到(更亮的)图像差异。