OpenGL смешивает цвета для GL_TEXTURE_3D в вычислительном шейдере

Я не уверен, является ли это ошибкой драйвера, но происходит следующее:

compute-shader.glsl:

#version 320 es
precision mediump float;

layout(local_size_x = 16, local_size_y = 8, local_size_z = 1) in;
layout(rgba8ui, binding = 0) writeonly uniform mediump uimage2D image;
layout(binding = 1) uniform mediump usampler3D grid;

void main() {
    uint i = gl_GlobalInvocationID.y;
    uint j = gl_GlobalInvocationID.x;

    uvec4 val = texture(grid, vec3(float(i)/480.0,float(j)/640.0,0.5));

    imageStore(image, ivec2(j,i), val);
}

Цветовые каналы val полностью зашифрованы:

  • альфа = синий
  • красный = красный
  • зеленый = альфа
  • синий = зеленый

main.cpp:

    glActiveTexture(GL_TEXTURE1);
    glEnable(GL_TEXTURE_3D);
    glBindTexture(GL_TEXTURE_3D, grid_tex_id);
    glTexStorage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 256, 256, 256);
    glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, 256, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, grid.data);
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

Есть ли этому какое-то разумное объяснение? Примечание: я не хочу использовать хак val.ragb (если он вообще существует).


person Armen Avetisyan    schedule 12.09.2016    source источник
comment
У вас есть доказательства того, что grid.data находится в порядке RGBA?   -  person Nicol Bolas    schedule 12.09.2016
comment
Да, я сделал тот же пример с uimage3D вместо usampler3D, который работал очень хорошо.   -  person Armen Avetisyan    schedule 12.09.2016


Ответы (1)


layout(binding = 1) uniform mediump usampler3D grid;
...
glTexStorage3D(GL_TEXTURE_3D, 1, GL_RGBA8, 256, 256, 256);

GL_RGBA8 не является целочисленным форматом; это нормализованный формат. Это означает, что он эквивалентен формату с плавающей запятой. Поэтому вы должны использовать sampler3D, а не usampler3D. Или вы должны загрузить свои данные в целочисленный формат, например GL_RGBA8UI, используя формат передачи GL_RGBA_INTEGER пикселей.

Возможно, вам это сошло с рук, используя загрузку/сохранение изображений, повторно указав формат в самом шейдере. Вы не можете сделать это с текстурами.

person Nicol Bolas    schedule 12.09.2016