我目前正在修改Triangle的Adreno SDK Vulkan示例。我想读取渲染的交换链图像的颜色值。我遵循的流程如下:
我使用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
在vkCmdCopyImageToBuffer
,vkCmdDraw
之后在命令缓冲区中呼叫vkCmdEndRenderPass
。
然后执行vkQueueSubmit
和vkQueueWaitIdle
。
为缓冲区内存调用vkMapMemory
并读取数据,但它们是垃圾值。对于malloc
,我将数据格式保留为int。
答案 0 :(得分:3)
Vulkan中的Swapchain图像不属于您的代码;他们属于平台。因此,您无法控制它们的大多数方面。您可以通过vkGetPhysicalDeviceSurfaceCapabilitiesKHR
查询方面的内容。特别重要的是VkSurfaceCapabilitiesKHR::supportedUsageFlags
。
这些是交换链图像支持的图像使用标记。他们需要支持颜色附件,但这是仅用法,需要支持。这包括使用图像作为传输操作的来源。
如果未在该标志中设置VK_IMAGE_USAGE_TRANSFER_SRC_BIT
,则无法从交换链图像中复制。因此,您必须将所需内容呈现给不同的图像,然后复制到交换链图像。假设它当然有TRANSFER_DST_BIT
;如果没有,那么你将不得不渲染它。
假设您已经验证表面可以完全读取:
在vkCmdDraw,vkCmdEndRenderPass之后,在命令缓冲区中调用vkCmdCopyImageToBuffer。
您的renderpass在写入图像和传输阶段之间需要执行依赖。