Проблемы с SSBO в JOGL
Я пытался инициализировать SSBO и передать его в вычислительный шейдер.
int ssbo = glGenBuffers();
FloatBuffer buff = BufferUtils.createFloatBuffer(4);
buff.put(0.1f);
buff.put(0.4f);
buff.put(1.5f);
buff.put(0.2f);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
glBufferData(GL_SHADER_STORAGE_BUFFER, buff, GL_DYNAMIC_READ);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
int block_index = glGetProgramResourceIndex(programID, GL_SHADER_STORAGE_BLOCK, "shader_data");
System.out.println(block_index);
int ssbo_binding_point_index = 1;
glShaderStorageBlockBinding(programID, block_index, ssbo_binding_point_index);
int binding_point_index = 1;
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, binding_point_index, ssbo);
а в шейдере у меня есть:
layout(binding = 1) buffer shader_data {
vec4 sph;
};
Когда я запускаю это, sph заполняется нулями. Пытался прочитать данные из буфера:
FloatBuffer a = BufferUtils.createFloatBuffer(4);
glGetBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, a);
System.out.println(glGetError());
//and then print a...
И это вызывает ошибку 1281, также известную как 0 + a.size() > размер ssbo. Затем я проверил реальный размер SSBO:
IntBuffer b = BufferUtils.createIntBuffer(1);
glGetBufferParameteriv(GL_SHADER_STORAGE_BUFFER, GL_BUFFER_SIZE, b);
System.out.println("buffer size: " + b.get(0));
И это дает мне 0. Я использовал эту статью. Я новичок в OpenGL, поэтому в моем коде может быть действительно очевидная ошибка, поэтому я и включил сюда так много ее.
Спасибо за совет!
Изменить: версия LWJGL - 3.2.1 сборка 12
1 ответ
Решение