我试图为我的 vulkan 游戏引擎创建绽放效果。 为了实现这一点,我使用了多个 bulring pass,在每个 channel 中,我从一个图像中读取内容,并向另一张图像渲染/写入稍微模糊的图片。 在每次绘制过程之后,我都会交换这些图像的角色(并使用障碍),这意味着 - 渲染目标变成了着色器资源,用作着色器资源的变成了目标。 我将这两个图像绑定(bind)在同一描述符集上以节省不必要的“VkBindDescriptorSet”调用,但验证层告诉我,如果我想绑定(bind)图像的描述符,则所有图像的布局必须为“VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL”即使着色器在任何给定时间仅使用/读取其中之一(着色器仅从当前处于“VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL”状态的着色器读取)。 这是对验证层的过度谨慎吗?或者实际上绑定(bind)失败。
当我使用 DirectX12 时,我没有遇到此调试器问题!
我很高兴得到答案或解决方案的想法, 我对我的英语感到抱歉。
最佳答案
假设您的着色器在图像绑定(bind)到它时实际上不使用采样器,则验证层不正确(不是它可以知道)。 Vulkan标准只要求不使用附加的图像子资源:
Image subresources used as attachments in the current render pass must not be accessed in any way other than as an attachment by [a rendering command], ...
“访问”是由 Vulkan 内存模型定义的,对于绑定(bind)图像,涉及调用图像访问命令。只要您不对描述符执行此操作,它就不会被“访问”,因此不会违反此规则。
话虽如此,在不使用输入附件的情况下在图像之间进行乒乓操作需要停止和启动渲染 channel ,更不用说每个 channel 之间的执行障碍。 VkBindDescriptorSet
的成本将是 GPU 分析数据中除所有这些之外的舍入误差。
因此,您应该更改描述符集并关闭验证层。
关于绑定(bind)图像而不在 Vulkan 中全部使用它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70689903/