将RGBA8图像写成R32UI

Write a RGBA8 image as a R32UI

我有一张格式为 R8G8B8A8 (Unorm) 的图像。

我想在上面写入 uint 数据(以便能够使用原子函数)。

所以,当我想 "write" 它时,我在 glsl 中使用 :

layout(set = 0, binding = 2, r32ui) restrict writeonly uniform uimage3D dst;

但是,当我执行类似

的操作时
imageStore(dst, coords, uvec4(0xffffffff));

RenderDoc(还有我的应用程序)告诉我所有值都是 0(而不是 1.0 (255 unorm))。

如果我用 rgba8 替换 r32ui 一切正常,但我不能使用原子值。所以我想知道是否有可能做这样的事情。 (但是,如果我使用 r32f 而不是 rgba8,它也能正常工作)。

你有什么解决办法吗?

Vulkan 规范保证只有 R32_UINT 和 R32_SINT 格式的存储图像 (VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) 必须支持原子操作。实现也可以为其他格式添加此类支持,但这不是强制性的。因此,原子操作不适用于 rgba8 格式也就不足为奇了。

接下来。您可以创建格式与图像格式不同的图像视图。在这种情况下,图像视图的格式必须与图像的格式兼容。对于 R8G8B8A8 格式,SINT 和 UINT R32 格式都是兼容的(具有相同的位数)。但是为了能够创建具有不同格式的图像视图,必须使用 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT 标志创建图像本身。

最后一件事 - 规范中有一条关于格式 compatibility/mutable 图片的说明:

Values intended to be used with one view format may not be exactly preserved when written or read through a different format. For example, an integer value that happens to have the bit pattern of a floating point denorm or NaN may be flushed or canonicalized when written or read through a view with a floating point format. Similarly, a value written through a signed normalized format that has a bit pattern exactly equal to -2^b may be changed to -2^b + 1 as described in Conversion from Normalized Fixed-Point to Floating-Point.

也许这就是问题所在?虽然看起来 rgba8 (unorm) 和 r32 (uint) 之间应该没有转换。验证层是否报告了任何警告或错误?当您尝试在其中存储数据时,您的图像采用什么布局?别忘了:

Load and store operations on storage images can only be done on images in the VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR or VK_IMAGE_LAYOUT_GENERAL layout.