2016-09-12 2 views
1

Я не уверен, является ли это ошибка водителя, но происходит следующее:OpenGL смешивает цвета для GL_TEXTURE_3D в Compute Shader

вычислительных 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); 

Есть ли разумные объяснения для этого? Примечание. Я не хочу использовать hack val.ragb (если это даже существует).

+0

Есть ли у вас доказательства того, что 'grid.data' находится в заказе RGBA? –

+0

Да, я сделал тот же пример с '' 'uimage3D''' вместо' '' usampler3D''', который работал нормально. –

ответ

2
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 от re-specifying the format in the shader itself. Вы не можете сделать это с помощью текстур.

+0

немного обратная связь. Похоже, что '' 'GL_RGBA8UI'' /' '' GL_RGBA_INTEGER'''/'' 'GL_UNSIGNED_BYTE'' не фильтруется. См. Https://www.khronos.org/opengles/sdk/docs/man3/html/glTexStorage3D.xhtml. –

Смежные вопросы