2016-09-12 4 views
1

コンピュートシェーダにGL_TEXTURE_3Dの色をミックス:OpenGLは、私はそれがドライバのバグであるかどうかわかりませんが、以下の問題が発生した

計算-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整数形式ではありません。それはの正規化フォーマットです。つまり、浮動小数点形式に相当します。したがってusampler3Dではなくsampler3Dを使用してください。または、ピクセル転送形式を使用して、GL_RGBA8UIのような整数形式にデータをアップロードする必要があります。

    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を参照してください。 –

    関連する問題