Атомарное добавление изображения в вычислительном шейдере

У меня есть следующий вычислительный шейдер:

#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")

Я не могу найти, что я делаю неправильно, согласно OpenGL wiki


person Elie Génard    schedule 04.02.2015    source источник


Ответы (1)


Согласно спецификации GLSL 4.50, для imageAtomicAdd() требуется переменная изображения с квалификатором памяти coherent.

Это имеет смысл, потому что атомарное добавление должно прочитать старое значение, добавить к нему значение и записать результат. Следовательно, он должен иметь возможность как читать, так и записывать образ.

Чтобы это работало, вам нужно изменить объявление на:

layout(r32i, binding=1) uniform coherent iimage2D pathTex;

Как видно из названия, writeonly будет работать только для операций с изображением, которые записывают исключительно в образ, например imageStore().

person Reto Koradi    schedule 05.02.2015