2016-11-13 14 views
0

Я довольно новичок в 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.

ответ

1

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

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

+0

Для чего это необходимо, перед этим вам также понадобится барьер памяти. Вы не сможете завершить выполнение вычисляющих шейдеров до того, как вы попытаетесь восстановить память без нее. –

+0

Спасибо, ребята, за ответ. Это решило мою проблему. – alpacacapla