1

我不确定这是否是驱动程序错误,但会发生以下情况:

计算着色器.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完全打乱:

  • 阿尔法=蓝色
  • 红色 = 红色
  • 绿色=阿尔法
  • 蓝色=绿色

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

4

1 回答 1

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像素传输格式将数据上传为整数格式,例如 。

您可能通过在着色器本身中重新指定格式来使用图像加载/存储来摆脱它。你不能用纹理做到这一点。

于 2016-09-12T16:27:18.927 回答