Maison >développement back-end >C++ >Comment puis-je effectuer un rendu efficace hors écran dans OpenGL ?
Le rendu de scènes hors écran dans OpenGL permet de générer des images sans avoir besoin d'une fenêtre visible. Cette technique est particulièrement utile lors de l'exécution de calculs lourds pour le traitement hors écran ou la capture d'images pour une utilisation ultérieure.
Une façon d'effectuer un rendu hors écran consiste à lire directement le contenu du framebuffer. Ceci peut être réalisé en utilisant la fonction glReadPixels :
std::vector<std::uint8_t> data(width * height * 4); glReadBuffer(GL_BACK); glReadPixels(0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, &data[0]);
Cette méthode lit les pixels du tampon spécifié (dans ce cas, le tampon arrière) dans un tampon mémoire pré-alloué. Cependant, cette approche présente des limites, telles qu'elle est plus lente et peut potentiellement interférer avec d'autres opérations de rendu.
Les objets Framebuffer (FBO) offrent un moyen plus optimisé de rendu hors écran. Ils vous permettent de créer un framebuffer hors écran dédié, qui peut être dessiné et lu indépendamment :
GLuint fbo, render_buf; glGenFramebuffers(1, &fbo); glGenRenderbuffers(1, &render_buf); glBindRenderbuffer(render_buf); glRenderbufferStorage(GL_RENDERBUFFER, GL_BGRA8, width, height); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo); glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, render_buf);
Une fois le FBO configuré, vous pouvez le lier en tant que cible de dessin et y effectuer un rendu à la place de le framebuffer par défaut. Lorsque vous êtes prêt à lire les pixels rendus, liez le FBO comme cible de lecture :
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo); // Draw to the offscreen framebuffer glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo); glReadBuffer(GL_COLOR_ATTACHMENT0); glReadPixels(0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, &data[0]);
Les objets tampon de pixels (PBO) peuvent être utilisé pour rendre les transferts de pixels plus efficaces en effectuant des opérations de manière asynchrone :
GLuint pbo; glGenBuffers(1, &pbo); glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo); glBufferData(GL_PIXEL_PACK_BUFFER, width * height * 4, NULL, GL_DYNAMIC_READ);
Au lieu de passer un pointeur vers le données de pixels dans glReadPixels, un décalage de PBO peut être fourni. Le PBO est mappé ultérieurement à la mémoire système à l'aide de glMapBuffer :
glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo); glReadPixels(0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, 0); // Offset in the PBO pixel_data = glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
La méthode de rendu hors écran optimale dépend des exigences spécifiques de l'application. Les FBO offrent généralement le meilleur équilibre entre performances et flexibilité, tandis que les PBO sont utiles dans les situations où une vitesse maximale est cruciale. Pour des tâches simples, une lecture directe du framebuffer peut suffire.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!