Ich versuche herauszufinden, wie man am besten eine OpenGL-Textur mit einem Compute-Shader generiert. Bisher habe ich gelesen, dass Pixelpufferobjekte für nicht blockierende CPU-> GPU-Übertragungen geeignet sind und dass Compute-Shader Puffer lesen und schreiben können, unabhängig davon, wie sie gebunden sind. Im Idealfall möchte ich so viele Kopien wie möglich vermeiden. Mit anderen Worten, ich möchte einen Puffer auf der GPU zuweisen, komprimierte Texturdaten darauf schreiben und diesen Puffer dann als Texturobjekt in einem Shader verwenden.
Derzeit sieht mein Code ungefähr so aus:
GLuint buffer;
glGenBuffers(1, &buffer);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer);
glBufferStorage(GL_SHADER_STORAGE_BUFFER, tex_size_in_bytes, 0, 0);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
// Bind buffer to resource in compute shader
// execute compute shader
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer);
glCompressedTexImage2D(GL_TEXTURE_2D, 0, fmt, w, h, 0, tex_size_in_bytes, 0);
Ist das richtig? Ich habe auch irgendwo darüber gelesen, wie man Synchronisation garantiert. Was muss ich hinzufügen, um sicherzustellen, dass mein Compute-Shader die Ausführung vor dem Kopieren aus dem Pufferobjekt abschließt?