Я пытаюсь выяснить, как лучше всего создать текстуру OpenGL с помощью вычислительного шейдера. До сих пор я читал, что объекты пиксельного буфера хороши для неблокирующей передачи CPU -> GPU, и что вычислительные шейдеры способны читать и записывать буферы независимо от того, как они связаны. В идеале я хотел бы избежать как можно большего количества копий. Другими словами, я хотел бы выделить буфер на GPU, записать сжатые данные текстуры в него, а затем использовать этот буфер в качестве объекта текстуры в шейдере.
В настоящее время мой код выглядит примерно так:
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);
Это правильно? Я тоже где-то читал о гарантии синхронизации. Что мне нужно добавить, чтобы убедиться, что мой вычислительный шейдер завершает выполнение до копирования из объекта буфера?