c++ - vkCmdCopyImageToBuffer 生成纯色图像
问题描述
我尝试替换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, ©Cmd));
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
.
您的代码还应该包含一个vkCmdPipelineBarrier
with dstStage = VK_PIPELINE_STAGE_HOST_BIT
。
推荐阅读
- png - Nib.load() 错误 - 尝试加载要为 FCNN 调整大小的 PNG 和 DICOM 图像
- java - 在 TeamCity 上使用 Gradle 构建时失败:Task :app:processDebugResources FAILED
- javascript - 如何使用 Axios 和 React 更新文件
- python - 编写异步生成器的正确 Pythonic 方法是什么?
- python - Python 努力理解 return 和 print 之间的区别
- python - 如何从 Flask 中的 IAP 获取 jwt 令牌?
- c# - 泛型的 C# 类型检查
- php - 尝试从服务器获取数据时出错
- reactjs - 无法访问从 Firestore 获取数据函数中的上下文 api 传递的值
- c# - Xamarin.forms - 字体大小取决于手机设置