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
(если это вообще существует).
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
формат передачи пикселей.
Вы, вероятно, справились с этим, используя Image Load/Store, повторно указав формат в самом шейдере. Вы не можете сделать это с текстурами.