计算着色器中的图像原子添加
Image atomic addition in a compute shader
我有以下计算着色器:
#version 430
layout(std430, binding=0) buffer wks{
ivec2 w[];
};
layout(r32i, binding=1) uniform writeonly iimage2D pathTex;
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
void main(){
imageAtomicAdd(pathTex, w[0], 1); // line 12
}
这给了我这个错误:
0(12) : error C1317: qualified actual parameter #1 cannot be converted to less qualified parameter ("im")
我找不到我做错了什么
根据 GLSL 4.50 规范,imageAtomicAdd()
需要具有 coherent
内存限定符的图像变量。
这是有道理的,因为原子添加需要读取旧值,向其添加一个值,然后写回结果。因此,它需要能够读取和写入图像。
要完成这项工作,您需要将声明更改为:
layout(r32i, binding=1) uniform coherent iimage2D pathTex;
顾名思义,writeonly
仅适用于专门写入图像的图像操作,例如 imageStore()
。
我有以下计算着色器:
#version 430
layout(std430, binding=0) buffer wks{
ivec2 w[];
};
layout(r32i, binding=1) uniform writeonly iimage2D pathTex;
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
void main(){
imageAtomicAdd(pathTex, w[0], 1); // line 12
}
这给了我这个错误:
0(12) : error C1317: qualified actual parameter #1 cannot be converted to less qualified parameter ("im")
根据 GLSL 4.50 规范,imageAtomicAdd()
需要具有 coherent
内存限定符的图像变量。
这是有道理的,因为原子添加需要读取旧值,向其添加一个值,然后写回结果。因此,它需要能够读取和写入图像。
要完成这项工作,您需要将声明更改为:
layout(r32i, binding=1) uniform coherent iimage2D pathTex;
顾名思义,writeonly
仅适用于专门写入图像的图像操作,例如 imageStore()
。