Estou tentando descobrir qual é a melhor maneira de gerar uma textura OpenGL usando um sombreador de computação. Até agora, eu li que os objetos de buffer de pixel são bons para transferências de CPU -> GPU sem bloqueio e que os sombreadores de computação são capazes de ler e escrever buffers, independentemente de como eles estejam vinculados. Idealmente, gostaria de evitar o maior número possível de cópias. Em outras palavras, eu gostaria de alocar um buffer na GPU, gravar dados de textura compactados e usá-lo como objeto de textura em um shader.
Atualmente, meu código é algo como isto:
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);
Isso está correto? Também li em algum lugar sobre a garantia de sincronização. O que preciso adicionar para garantir que meu sombreador de computação conclua a execução antes de copiar do objeto de buffer?