0

GL_TEXTURE_2D_ARRAYwithのさまざまなレイヤーに書き込みたいコンピューティング シェーダーがありますimageStoreが、機能しません。

テクスチャを初期化するために使用するコードは次のとおりです。

void Manager::initTextures(){
    texId = 0;

    GLsizei width = ofGetWidth();
    GLsizei height = ofGetHeight();
    GLsizei layerCount = NB_TEX;
    GLsizei mipLevelCount = 1;

    GLfloat texels[width*height*4*NB_TEX];
    for(int i = 0; i < width*height*4*NB_TEX; ++i){
        texels[i] = 1.0;
    }

    glGenTextures(1,&texId);
    glBindTexture(GL_TEXTURE_2D_ARRAY,texId);

    glTexStorage3D(GL_TEXTURE_2D_ARRAY, mipLevelCount, GL_RGBA32F, width, height, layerCount);

    glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, width, height, layerCount, GL_RGBA, GL_FLOAT, texels);

    glBindTexture(GL_TEXTURE_2D_ARRAY, 0);
}

シェーダー呼び出しを計算します (各フレームで呼び出されます):

void Manager::update(){
    cs.begin();
        glBindImageTexture(0, texId, 0, GL_TRUE, 0, GL_READ_WRITE, GL_RGBA32F);
        glUniform1i(cs.getUniformLocation("pathTex"), 0);
        cs.dispatchCompute(NB_TEX, 1, 1);
        glMemoryBarrier(GL_ALL_BARRIER_BITS);
    cs.end();
}

計算シェーダー:

#version 430

layout(rgba32f, binding=0) uniform coherent restrict image2DArray pathTex;

layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;

void main(){
    imageStore(pathTex, ivec3(0, 0, 0), vec4(0.0, 0.0, 0.0, 1.0));  
}

計算シェーダーは何もしていないようです。ただし、フラグメント シェーダーでテクスチャのすべてのレイヤーにアクセスできます。

4

0 に答える 0