Vulkan Framebuffer 附件图像使用冲突

Vulkan Framebuffer conflict on attachments image usage

当我尝试通过 vkCreateFramebuffer 创建帧缓冲区时,我在调试报告回调中收到有关 VkFramebufferCreateInfo 附件冲突的错误。它说我的 图像视图 在图像使用上有冲突,但我不希望出现此错误,因为通常其中一个必须是颜色附件,另一个必须是深度模板附件。

确切的错误信息是:

Framebuffer Attachment(0) conflicts with image's IMAGE_USAGE flags (VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT).

我什至已经看到其他例子了,它们完全一样。

我的源代码 (Rust):
https://github.com/Hossein-Noroozpour/vulkust/blob/master/src/vulkan/swapchain.rs#L218

好吧,我可以解释错误是如何发生的。如果有疑问,深入了解图层源代码很有用:
https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/tree/master/layers

将于 vkCreateFramebuffer() 发布。

它将检查提供的渲染通道及其子通道与图像视图。

如果 VkImageView 至少被用作输入附件一次,则它期望 VkImageViewVkImage 是使用 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT 创建的。

VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT 的颜色附件和 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 的 DS 附件类似。

检查您是否满足这些要求。
图层错误也是一回事。如果您是 运行 最新的并确认了一个错误,那么报告属于这里:
https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/issues

更新(在看到您的源代码之后):
我没看到你在哪里设置 depth_reference.attachment。您将其预初始化为 0,这可能意味着您将颜色附件作为深度分配给子通道。

帧缓冲区中图像的使用由 renderpass 定义。这意味着如果附件 0 在 renderpass 中用作 depth/stencil,则需要使用 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT

创建图像

这意味着您需要仔细检查您传递给渲染通道创建的子通道描述,并确保您没有不小心使用附件 0 作为深度。