首页 > 解决方案 > 如何读取和写入 uint 格式的图像?

问题描述

我想从存储无符号整数的图像中读取和写入。我如何阅读和写作?读取和写入图像的标准方法是使用imageLoad/imageStore,但是当使用格式限定符 r32ui 时,编译器会出现no matching overloaded function found.

无法编译:

#version 450

layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;

layout(set = 0, binding = 0, r32ui) uniform writeonly uimage3D img;

void main() {
    imageStore(img, ivec3(1,2,3), uint(4));
}

编译得很好

#version 450

layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;

layout(set = 0, binding = 0, rgba8ui) uniform writeonly uimage3D img;

void main() {
    imageStore(img, ivec3(1,2,3), uvec4(4,5,6,7));
}

我尝试使用 uvec3 而不是 ivec3 来表示坐标,并使用 uvec4 来写入数据,以防我误解了格式存储的内容。使用二维图像也没有区别。

标签: imageglslshadervulkanuint

解决方案


您收到的错误消息是正确的,根本没有imageStore采用单个无符号整数的重载版本(请参阅规范)。

因此,在使用r32ui限定符时,您仍然需要像在第二个示例中一样传递一个 4 分量无符号向量,而是从单个值构造它:

void main() 
{
    imageStore(img, ivec3(1,2,3), uvec4(4));
}

推荐阅读