vkCmdCopyImageToBuffer 生成纯色图像
vkCmdCopyImageToBuffer results in solid color image
我试图将 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
执行内存域操作。
您的代码还应包含带有dstStage = VK_PIPELINE_STAGE_HOST_BIT
的vkCmdPipelineBarrier
。
相关文章:
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 如何定义一个纯抽象基类
- 如何在C++中获得"静态纯虚拟"功能?
- 平均图像时图像损坏
- 将 MFC 图像初始化为纯色
- vkCmdCopyImageToBuffer 生成纯色图像
- SystemParametersInfo将背景设置为纯色,而不是实际设置图片
- 使用纯 c++ 模糊图像
- 如何在 Win32 应用中拖动纯色矩形,而不会产生白色闪烁,也不会干扰其他屏幕对象
- OpenGL,纹理输出为纯色
- 试图显示纹理,但只能使用OpenGL获得纯色
- 如何在OpenCV中过滤具有邻域主色的图像
- 用c++创建一个单一的纯色图像
- 照明不工作在OpenGL -纯色
- 为QProgressBar上的图像设置上色
- 在纹理/纯色中绘制透明孔
- 如果无法加载纹理,则退回到纯色