Я довольно новичок в opengl, и я оказался в ситуации, когда мне нужно получить данные из вычислительного шейдера, но поскольку я пропустил некоторые критические знания, я не могу заставить его работать. Поэтому я пришел сюда, чтобы, может быть, вы могли дать мне несколько намеков.Получение данных обратно из вычислительного шейдера
Скажем, у меня есть Compute Shader вроде этого:
#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");
}
где имя = "TriangleBuffer" и индекс = 9
Я знаю, как получить доступ к ssbo, который я создал в своем приложении. Я не знаю, как назначить/передать данные TriangeBuffer в мой ssbo.
Для чего это необходимо, перед этим вам также понадобится барьер памяти. Вы не сможете завершить выполнение вычисляющих шейдеров до того, как вы попытаетесь восстановить память без нее. –
Спасибо, ребята, за ответ. Это решило мою проблему. – alpacacapla