Nur das erste Compute Shader-Array-Element wird aktualisiert angezeigt

Wenn Sie versuchen, ein Array mit einer Ganzzahl an einen Compute-Shader zu senden, setzen Sie für jede Ganzzahl einen beliebigen Wert und lesen Sie dann CPU / HOST zurück. Das Problem ist, dass nur das erste Element meines Arrays aktualisiert wird. Mein Array wird mit allen Elementen = 5 in der CPU initialisiert, dann versuche ich, alle Werte im Compute Shader auf 2 zu setzen:

C ++ Code:

   this->numOfElements = std::vector<int> numOfElements; //num of elements for each voxel

   //Set the reset grid program as current program
    glUseProgram(this->resetGridProgHandle);

    //Binds and fill the buffer 
    glBindBuffer(GL_SHADER_STORAGE_BUFFER, this->counterBufferHandle);
    glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(int) * numOfVoxels, this->numOfElements.data(), GL_DYNAMIC_DRAW);
    glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, this->counterBufferHandle);

    //Flag used in the buffer map function
    GLint bufMask = GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT;

    //calc maximum size for workgroups
    //glGetIntegerv(GL_MAX_COMPUTE_WORK_GROUP_SIZE, &result);

    //Executes the compute shader
    glDispatchCompute(32, 1, 1); // 
    glMemoryBarrier(GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT);

    //Gets a pointer to the returned data
    int* returnArray = (int *)glMapBuffer(GL_SHADER_STORAGE_BUFFER, GL_READ_WRITE);

    //Free the buffer mapping
    glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);

Shader:

#version 430
layout (local_size_x = 32) in;
layout(binding = 0) buffer SSBO{
    int counter[];
};

void main(){
    counter[gl_WorkGroupID.x * gl_WorkGroupSize.x + gl_LocalInvocationID.x] = 2;
}

Wenn ich returnArray [0] drucke, ist es 2 (richtig), aber jeder Index> 0 gibt mir 5, was der Anfangswert ist, der im Host initialisiert wurde.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage