J'essaie de comprendre quelle est la meilleure façon de générer une texture OpenGL à l'aide d'un shader de calcul. Jusqu'à présent, j'ai lu que les objets tampons en pixels sont bons pour les transferts CPU non bloquants -> GPU, et que les shaders de calcul sont capables de lire et d'écrire des tampons quelle que soit la façon dont ils sont liés. Idéalement, j'aimerais éviter autant de copies que possible. En d'autres termes, j'aimerais allouer un tampon sur le GPU, y écrire des données de texture compressées, puis utiliser ce tampon comme objet de texture dans un shader.
Actuellement, mon code ressemble à ceci:
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);
Est-ce correct? J'ai lu quelque part sur la garantie de la synchronisation aussi. Que dois-je ajouter pour m'assurer que mon shader de calcul termine l'exécution avant de copier à partir de l'objet tampon?