【问题标题】:How to Copy Swap Chain Image to a VkBuffer in Vulkan?如何在 Vulkan 中将交换链图像复制到 VkBuffer?
【发布时间】:2016-08-16 21:54:40
【问题描述】:

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

  1. 我创建了具有交换链图像宽度和高度的 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. vkCmdDrawvkCmdEndRenderPass 之后调用命令缓冲区中的vkCmdCopyImageToBuffer

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

【问题讨论】:

  • "Int 因为Image格式是VK_FORMAT_R8G8B8_SINT" 两个问题。首先,如果交换链图像使用 24 位颜色格式,我会感到震惊。特别是非标准化格式。并且在此之上签名。其次,即使这确实是图像格式,SINT 也意味着它是有符号整数。 8s 告诉您每个通道使用了多少位。它是每像素 24 位,而不是每像素 3 * sizeof(int)。我想查看查询此图像格式的代码。另外,您是否检查过是否可以将图像用作传输操作的来源?
  • @NicolBolas 我将 int 更改为 int8_t。其次,因为它是交换链图像,所以我不知道在哪里将其用法设置为传输类型。我们可以通过 VkImageCreateInfo 设置使用,但不知道交换链图像。
  • @abhijitjagdale:您在传递给 vkCreateSwapchainKHR 的 VkSwapchainCreateInfoKHR 结构中设置了使用标志。因此,除了 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT 之外,如果您想从中读取并且支持它,您还必须在创建交换链之前设置 VK_IMAGE_USAGE_TRANSFER_SRC_BIT(请参阅 Nicol 的回答)。另请注意,Vulkan 不会为您进行任何图像格式转换,因此您应该在从中复制之前匹配实际的交换链格式。
  • @SaschaWillems 设置 swapchainCreateInfo.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT 工作。谢谢。

标签: buffer vulkan


【解决方案1】:

Vulkan 中的交换链图像不属于您的代码;他们属于平台。因此,您无法控制它们的大部分方面。您改为通过vkGetPhysicalDeviceSurfaceCapabilitiesKHR查询它们的各个方面。特别重要的是VkSurfaceCapabilitiesKHR::supportedUsageFlags

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

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

假设你已经验证了表面可以被读取:

在 vkCmdDraw、vkCmdEndRenderPass 之后调用 Command Buffer 中的 vkCmdCopyImageToBuffer。

您的渲染通道将需要在写入图像和传输阶段之间存在执行依赖关系。

【讨论】:

  • 我在尝试将交换链图像复制到缓冲区时遇到问题。我已经进行了设置,然后尽我所能遵循错误输出并获得了接近的感觉。错误告诉我不允许使用VK_IMAGE_USAGE_TRANSFER_SRC_BIT 集创建交换链图像,但是在检查supportedUsageFlags 时,它们的值为31,这意味着所有前5 位都已设置,包括VK_IMAGE_USAGE_TRANSFER_SRC_BIT。有没有我可能遗漏的明显问题?
猜你喜欢
  • 1970-01-01
  • 2020-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-07
  • 2018-12-18
  • 2016-06-28
  • 2020-09-28
相关资源
最近更新 更多