Estoy tratando de descubrir cuál es la mejor manera de generar una textura OpenGL usando un sombreador de cómputo. Hasta ahora, he leído que los objetos de búfer de píxeles son buenos para CPU sin bloqueo -> transferencias de GPU, y que los sombreadores de cómputo son capaces de leer y escribir búferes independientemente de cómo estén vinculados. Idealmente, me gustaría evitar tantas copias como sea posible. En otras palabras, me gustaría asignar un búfer en la GPU, escribir datos de textura comprimidos y luego usar ese búfer como un objeto de textura en un sombreador.
Actualmente, mi código se parece a esto:
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);
¿Es esto correcto? También leí en alguna parte sobre garantizar la sincronización. ¿Qué necesito agregar para asegurarme de que mi sombreador de cómputo complete la ejecución antes de copiar desde el objeto de búfer?