如何在Vulkan中将交换链图像复制到VkBuffer?

时间:2016-08-16 21:54:40

标签: buffer vulkan

我目前正在修改Triangle的Adreno SDK Vulkan示例。我想读取渲染的交换链图像的颜色值。我遵循的流程如下:

  1. 我使用Swap Chain图像的宽度和高度创建VkBuffer。 细节:

    VkBufferCreateInfo outputinfo = {};
    outputinfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
    outputinfo.size = m_width * m_height * 3 * sizeof(int8_t);
    outputinfo.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
    outputinfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;`
    

    Int因为图片格式为VK_FORMAT_R8G8B8_SINT 然后分配内存并将其绑定到类型为VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT

  2. 的缓冲区
  3. vkCmdCopyImageToBuffervkCmdDraw之后在命令缓冲区中呼叫vkCmdEndRenderPass

  4. 然后执行vkQueueSubmitvkQueueWaitIdle。 为缓冲区内存调用vkMapMemory并读取数据,但它们是垃圾值。对于malloc,我将数据格式保留为int。

1 个答案:

答案 0 :(得分:3)

Vulkan中的Swapchain图像不属于您的代码;他们属于平台。因此,您无法控制它们的大多数方面。您可以通过vkGetPhysicalDeviceSurfaceCapabilitiesKHR 查询方面的内容。特别重要的是VkSurfaceCapabilitiesKHR::supportedUsageFlags

这些是交换链图像支持的图像使用标记。他们需要支持颜色附件,但这是用法,需要支持。这包括使用图像作为传输操作的来源。

如果未在该标志中设置VK_IMAGE_USAGE_TRANSFER_SRC_BIT,则无法从交换链图像中复制。因此,您必须将所需内容呈现给不同的图像,然后复制到交换链图像。假设它当然有TRANSFER_DST_BIT;如果没有,那么你将不得不渲染它。

假设您已经验证表面可以完全读取:

  

在vkCmdDraw,vkCmdEndRenderPass之后,在命令缓冲区中调用vkCmdCopyImageToBuffer。

您的renderpass在写入图像和传输阶段之间需要执行依赖。