绑定图像而不在 Vulkan 中全部使用它们
Binding Images without using them all in Vulkan
我正在尝试为我的 vulkan 游戏引擎创建绽放效果。
为了实现这一点,我使用了几个 bulring pass,在每个图像中我从一张图像中读取,并且 render/write 一张稍微模糊的图片到另一张 。
在每次绘制过程之后,我交换这些图像的角色(并使用障碍),这意味着 - 一个渲染目标变成了着色器资源,而用作着色器资源的那个变成了目标。
我将这两个图像绑定到相同的描述符集 以节省不必要的 'VkBindDescriptorSet' 调用,但验证层告诉我如果我想绑定图像的描述符那些所有图像的布局必须 'VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL' 即使着色器 used/read 在任何给定时间仅来自其中之一(着色器仅从当前处于 'VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL' 状态的着色器读取)。
这是对验证层的过度谨慎吗?或者绑定实际上失败了。
当我使用 DirectX12 时,我没有遇到这个调试器问题!
我很乐意得到答案或解决方案的想法,
我对我的英语感到抱歉。
假设您的着色器在其图像绑定到它时实际上不使用采样器,则验证层不正确(它不知道)。 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内存模型定义,对于绑定图像,涉及调用图像访问命令。只要您不对描述符执行此操作,它就不会被“访问”,因此不会违反此规则。
也就是说,在不使用输入附件的情况下在图像之间切换需要停止和启动 渲染通道 ,更不用说每个通道之间的执行障碍了。 VkBindDescriptorSet
的成本将是所有这些旁边的 GPU 分析数据中的 舍入误差。
所以你应该只更改描述符集并关闭验证层。
我正在尝试为我的 vulkan 游戏引擎创建绽放效果。 为了实现这一点,我使用了几个 bulring pass,在每个图像中我从一张图像中读取,并且 render/write 一张稍微模糊的图片到另一张 。 在每次绘制过程之后,我交换这些图像的角色(并使用障碍),这意味着 - 一个渲染目标变成了着色器资源,而用作着色器资源的那个变成了目标。 我将这两个图像绑定到相同的描述符集 以节省不必要的 'VkBindDescriptorSet' 调用,但验证层告诉我如果我想绑定图像的描述符那些所有图像的布局必须 'VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL' 即使着色器 used/read 在任何给定时间仅来自其中之一(着色器仅从当前处于 'VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL' 状态的着色器读取)。 这是对验证层的过度谨慎吗?或者绑定实际上失败了。
当我使用 DirectX12 时,我没有遇到这个调试器问题!
我很乐意得到答案或解决方案的想法, 我对我的英语感到抱歉。
假设您的着色器在其图像绑定到它时实际上不使用采样器,则验证层不正确(它不知道)。 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内存模型定义,对于绑定图像,涉及调用图像访问命令。只要您不对描述符执行此操作,它就不会被“访问”,因此不会违反此规则。
也就是说,在不使用输入附件的情况下在图像之间切换需要停止和启动 渲染通道 ,更不用说每个通道之间的执行障碍了。 VkBindDescriptorSet
的成本将是所有这些旁边的 GPU 分析数据中的 舍入误差。
所以你应该只更改描述符集并关闭验证层。