Возвращение данных из вычислительного шейдера

Я довольно новичок в opengl, и я оказался в ситуации, когда мне нужно получить данные из вычислительного шейдера, но, поскольку мне не хватает некоторых критических знаний, я не могу заставить их работать. Итак, я пришел сюда, чтобы вы могли дать мне несколько советов.

Скажем, у меня есть вычислительный шейдер, например так:

#version 430 core
struct rmTriangle
{
  vec4 probeCenter;
  vec4 triangles[3];
};

layout(std430, binding=9) buffer TriangleBuffer {
  rmTriangle triangles[];
}trBuffer;

//other uniforms, variables and stuff

void main()
{
  //here I make some computations and assign values to the
  //trBuffer's triangles array
}

Теперь я хотел бы использовать данные trBuffer в моем приложении. Мне сказали создать буфер для хранения шейдеров. Вот что я сделал:

private int ssbo;
gl.glGenBuffers(1, &ssbo);
gl.glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
//just allocate enough amount of memory
gl.glBufferData(GL_SHADER_STORAGE_BUFFER, MAX_TRIANGLES * SIZEOF_TRIANGLE, null, GL_DYNAMIC_READ);

Тогда это:

int blockIndex = gl.glGetProgramResourceIndex(program,GL_SHADER_STORAGE_BLOCK, name.getBytes(), 0);
if (blockIndex != GL_INVALID_INDEX) {
    gl.glShaderStorageBlockBinding(program, blockIndex, index);
} else {
    System.err.println("Warning: binding " + name + " not found");
}

где name = "TriangleBuffer" и index = 9

Я знаю, как получить доступ к ssbo, который я создал в своем приложении. Чего я не знаю, так это как назначить / перенести данные TriangeBuffer в мою ОСБ.

1 ответ

Решение

Добавлять glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 9, ssbo);

Кроме того, когда я получаю данные из SSBOтогда я делаю glMapBufferRange а также memcpy вещи, которые мне нужны.

Другие вопросы по тегам