1

我试图为我的 vulkan 游戏引擎创建一个绽放效果。 为了实现这一点,我使用了几个 bulring pass,在每一个中我从一个图像中读取并将一个稍微模糊的图片渲染/写入另一个。在每次绘制过程之后,我交换这些图像的角色(并使用障碍),这意味着 - 一个渲染目标变成了着色器资源,而用作着色器资源的那个变成了目标。 我将这两个图像绑定在同一个描述符集上保存不必要的“VkBindDescriptorSet”调用,但验证层告诉我,如果我想绑定图像的描述符,所有图像的布局必须是“VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL”,即使着色器在任何给定时间仅使用/读取其中一个(着色器仅从当前处于“VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL”状态的着色器中读取)。这是对验证层的过度谨慎吗?或者绑定实际上失败了。

当我使用 DirectX12 时,我没有这个调试器问题!

我会很高兴得到答案或解决方案的想法,我对我的英语感到抱歉。

4

1 回答 1

1

假设您的着色器在其图像绑定到它时实际上不使用采样器,则验证层是不正确的(不是它可以知道的)。Vulkan 标准只要求不使用附加的图像子资源:

在当前渲染过程中用作附件的图像子资源不得以任何方式访问,除非通过 [渲染命令] 作为附件,...

“访问”由 Vulkan 内存模型定义,对于绑定图像,它涉及调用图像访问命令。只要您不对描述符执行此操作,它就不会被“访问”,因此不会违反此规则。

话虽如此,在不使用输入附件的情况下在图像之间进行乒乓操作需要停止和启动渲染通道,更不用说每次通道之间的执行障碍了。的代价VkBindDescriptorSet将是您的 GPU 分析数据中的舍入误差

因此,您应该只更改描述符集并关闭验证层。

于 2022-01-13T03:08:41.740 回答