2016-09-12 139 views
1

我不知道它是否是一个驱动程序错误,但以下情况发生:OpenGL的混合颜色GL_TEXTURE_3D在计算着色器

计算-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(如果存在的话)。

+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_RGBA_INTEGER像素传输格式将数据上传到像GL_RGBA8UI这样的整数格式。

您可能使用Image Load/Store by 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 –