У меня есть код, похожий на этот:
uint ssboId;
glGenBuffers(1, &ssboId);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssboId);
//initialize
glBufferData(GL_SHADER_STORAGE_BUFFER, size, 0, GL_STATIC_DRAW);
// memory barrier here?
// glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);
//start writes
glBufferSubData(GL_SHADER_STORAGE_BUFFER, offset1, sourceSize1, data1);
glBufferSubData(GL_SHADER_STORAGE_BUFFER, offset2, sourceSize2, data2);
...
// Ensure changes are applied before shader grabs it.
glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);
Нужно ли раскомментировать вызов glMemoryBarrier, который находится между glBufferData и glBufferSubData?Если материал SSBO непоследователен, не может ли быть так, что glBufferSubData проходит до glBufferData и, таким образом, вылетает?
Мое приложение работает, но я не уверен, работает ли оно просто по счастливой случайности.