2015-12-30 4 views
1

Попытка отправить массив целых чисел в вычислительный шейдер, задает произвольное значение для каждого целого числа и затем считывает обратно на CPU/HOST. Проблема в том, что обновляется только первый элемент моего массива. Мой массив инициализируется со всеми элементами = 5 в CPU, то я стараюсь наборы всех значений 2 в Compute Shader:Обновлен только первый элемент массива 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); 

 Смежные вопросы

  • Нет связанных вопросов^_^