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

时间:2017-02-24 14:51:00

标签: c++ graphics 3d 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中看到的输出与在窗口上显示的输出不同,因为盒子几乎完全透明,有一些RGB信息,如下图所示。

我猜这可能是因为这个特殊的演示涉及多个子通道和我没有正确地复制数据,但只有困扰我的是因为我在最终呈现到表面之前直接从交换链图像复制,所以我应该在图像和图像中获得最终的颜色数据。因此PNG&渲染应该匹配。

渲染帧: enter image description here 保存帧:

enter image description here

如果我错过了解释任何细节,请告诉我,任何帮助都表示赞赏。谢谢!

1 个答案:

答案 0 :(得分:0)

您保存的图片中包含Alpha值41

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

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