Обновляется только первый элемент массива Compute Shader

Пытаясь отправить массив целых чисел в вычислительный шейдер, устанавливает произвольное значение для каждого целого числа, а затем выполняет чтение обратно на CPU / HOST. Проблема в том, что обновляется только первый элемент моего массива. Мой массив инициализируется со всеми элементами = 5 в CPU, затем я пытаюсь установить все значения в 2 в Compute Shader:

Код C ++:

   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;
}

Если я печатаю returnArray [0], это 2 (правильно), но любой индекс> 0 дает мне 5, что является начальным значением, инициализированным в хосте.

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);

Бит, который вы используете для glMemoryBarrier представляет собой то, как вы хочу читать данные, записанные шейдером. GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT говорит: «Я собираюсь прочитать эти записанные данные, используя буфер для массивов атрибутов вершин». На самом деле, вы собираетесь читать буфер отображение Это.

Таким образом, вы должны использовать правильный бит барьера:

glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]