我通过分配适当的内存(VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)创建了自己的vkCreateImage交换链。并通过映射与之关联的内存来获取vkQueueSubmit和vkQueueWaitIdle之后的图像数据。
由于暂存缓冲区的优点,我使用VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT创建了上面的内存,并在命令缓冲区中执行了vkCmdCopyImageToBuffer,但结果是所有值0.但是如果我只是将vkCreateBuffer与上面的图像相关联并执行vkCmdCopyBuffer我会得到所有渲染的图像。
这是否是我们无法做的预期行为vkCmdCopyImageToBuffer,除非它是系统交换链?
编辑1:
我正在使用内存类型VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT呈现给vkCreateImage。事情是,当我做vkCmdCopyImageToBuffer时,此缓冲区中的图像数据全部为0。 现在,当我创建一个vkCreateBuffer并使用vkBindBufferMemory绑定到上面的图像内存时。之后我做了vkCmdCopyBuffer,我确实得到了图像数据。为什么vkCmdCopyImageToBuffer不起作用?是因为我为图像分配内存吗?因为在我们不分配内存的交换链图像的情况下,使用vkCmdCopyImageToBuffer可以正常工作。为什么我需要额外的开销来将缓冲区绑定到我分配的映像内存以使其工作。
答案 0 :(得分:0)
检查您是否注意图像布局。您可能需要一个屏障来适当地转换布局。
您也可以打开验证图层,看看它们是否有任何内容。
(我对描述也感到困惑,很抱歉我的回答很简单。)