【发布时间】:2016-08-16 21:54:40
【问题描述】:
我目前正在修改 Triangle 的 Adreno SDK Vulkan 示例。我想读取渲染交换链图像的颜色值。我遵循的过程如下:
-
我创建了具有交换链图像宽度和高度的 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的缓冲区中 在
vkCmdDraw、vkCmdEndRenderPass之后调用命令缓冲区中的vkCmdCopyImageToBuffer。然后执行
vkQueueSubmit和vkQueueWaitIdle。 为 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 工作。谢谢。