vkCmdCopyImageToBuffer 生成纯色图像

vkCmdCopyImageToBuffer results in solid color image

本文关键字:图像 纯色 vkCmdCopyImageToBuffer      更新时间:2023-10-16

我试图将 Vulkan API 的 Sascha Willems Render Headless 示例替换为使用缓冲区而不是主机端的图像。我将复制回图像的代码(第 687 - 775 行(更改为以下内容:

//create buffer
VkBuffer buffer;
VkDeviceMemory memory;
createBuffer(
VK_BUFFER_USAGE_TRANSFER_DST_BIT,
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
&buffer,
&memory,
width * height * 4,
nullptr
);
//create cmd buf
VkCommandBufferAllocateInfo cmdBufAllocateInfo = vks::initializers::commandBufferAllocateInfo(commandPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1);
VkCommandBuffer copyCmd;
VK_CHECK_RESULT(vkAllocateCommandBuffers(device, &cmdBufAllocateInfo, &copyCmd));
VkCommandBufferBeginInfo cmdBufInfo = vks::initializers::commandBufferBeginInfo();
VK_CHECK_RESULT(vkBeginCommandBuffer(copyCmd, &cmdBufInfo));
//build copy cmd
VkBufferImageCopy bufImgCpy{};
bufImgCpy.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
bufImgCpy.imageSubresource.layerCount = 1;
bufImgCpy.imageExtent.width = width;
bufImgCpy.imageExtent.height = height;
bufImgCpy.imageExtent.depth = 1;
vkCmdCopyImageToBuffer(copyCmd,
colorAttachment.image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
buffer, 1, &bufImgCpy);
VK_CHECK_RESULT(vkEndCommandBuffer(copyCmd));
submitWork(copyCmd, queue);
//map buffer
vkMapMemory(device, memory, 0, VK_WHOLE_SIZE, 0, (void**)&imagedata);

但是,虽然原始代码有效,但我的代码只是给了我一个只有背景颜色/清晰值的图像。我已经查阅了规范,但找不到关于我做错了什么的提示。

我运行的是AMD RTX 480(驱动程序:Radeon 19.12.12(,Windows 10 1909,版本为1.1.114.0的LunarG SDK。

原版对我来说看起来不正确。它应该通过VK_PIPELINE_STAGE_HOST_BIT执行内存域操作

您的代码还应包含带有dstStage = VK_PIPELINE_STAGE_HOST_BITvkCmdPipelineBarrier