Offscreen Rendering (rendu hors écran) est une technique de rendu d'une scène 3D non pas à l'écran, mais dans un tampon de texture (FBO — Framebuffer Object), qui peut ensuite être utilisé comme texture. Selon Apple Metal Documentation, 2025, le rendu hors écran est utilisé pour créer des ombres, des réflexions, des post-effets et le prétraitement graphique. Offscreen Rendering permet de diviser une scène complexe en passes sans perte de qualité.
Points Clés
Offscreen Rendering est une méthode de rendu de contenu graphique dans un tampon intermédiaire dans la mémoire vidéo, plutôt que dans le framebuffer principal qui est affiché à l'écran. Le résultat du rendu hors écran est sauvegardé dans une texture ou un renderbuffer.
Le principal objectif du rendu hors écran est le rendu multi-passes (multi-pass rendering). Une scène complexe est divisée en plusieurs passes : d'abord la scène est rendue dans une texture (offscreen), puis cette texture est utilisée comme entrée pour la passe suivante, et ainsi de suite jusqu'à l'obtention de l'image finale. Cette approche permet de réaliser des effets impossibles en une seule passe.
Le mécanisme clé du rendu hors écran dans OpenGL ES est le Framebuffer Object (FBO). Un FBO est un conteneur auquel des images de texture ou des objets renderbuffer peuvent être attachés. Après avoir lié le FBO, toutes les commandes de rendu suivantes sont dirigées vers la texture attachée, pas vers l'écran.
Offscreen Rendering est implémenté en créant un objet framebuffer séparé, en y attachant une texture ou un renderbuffer, en basculant le contexte de rendu vers ce FBO et en exécutant des commandes de dessin. Une fois la passe terminée, le contexte revient au framebuffer principal.
Le processus comprend trois étapes : création du FBO et attachement d'une texture — rendu de la scène dans la texture hors écran — utilisation de la texture résultante dans la passe suivante. GL_COLOR_ATTACHMENT0 détermine dans quelle texture de couleur le rendu sera effectué.
// Création d'un FBO pour le rendu hors écran (OpenGL ES 3.0)
GLuint fbo, offscreenTex;
glGenFramebuffers(1, &fbo);
glGenTextures(1, &offscreenTex);
glBindTexture(GL_TEXTURE_2D, offscreenTex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
width, height, 0,
GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER),
GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
offscreenTex, 0);
Offscreen Rendering est utilisé pour une large gamme d'effets graphiques. Chaque technique nécessite une ou plusieurs passes hors écran et une configuration FBO spécifique.
| Technique | Nombre de passes | Objectif |
|---|---|---|
| Shadow Mapping | 2+ | Génération d'une carte d'ombres depuis la source lumineuse |
| Reflection Mapping | 1-2 | Rendu des réflexions dans une cube map |
| Bloom Effect | 3-5 | Lueur sur les zones lumineuses de l'image |
| HDR Rendering | 2 | Tonemapping pour les images HDR |
| Depth Prepass | 1 | Pré-remplissage du depth buffer |
Une technique de base dans laquelle le résultat du rendu est sauvegardé dans une texture pour une utilisation ultérieure. Render-to-Texture est utilisé pour créer des mini-cartes, des textures d'objets dynamiques et la prévisualisation de matériaux complexes.
Les effets complexes (HDR, bloom, depth of field) nécessitent plusieurs passes séquentielles. Chaque passe rend la scène dans une texture hors écran, applique un filtre et transmet le résultat à la passe suivante. Cette approche permet d'accumuler les effets sans perte de qualité de l'image finale.
Shadow Mapping est un exemple classique d'utilisation du rendu hors écran. L'ombre est créée en deux passes : d'abord la scène est rendue du point de vue de la source lumineuse dans une texture de profondeur (offscreen), puis lors du rendu principal chaque fragment est comparé à cette carte de profondeur pour déterminer s'il est dans l'ombre.
Première passe : la caméra est placée à la position de la source lumineuse, la scène est rendue dans un tampon hors écran, enregistrant uniquement la profondeur dans la texture. Deuxième passe : rendu principal avec vérification de chaque fragment — si sa profondeur est supérieure à la valeur dans la carte de profondeur, le fragment est ombré.
// Fragment Shader pour le shadow mapping
in vec4 vShadowCoord;
uniform sampler2D uShadowMap;
float calcShadow(vec4 coord) {
vec3 uvw = coord.xyz / coord.w;
float depth = texture(uShadowMap, uvw.xy).r;
return (uvw.z > depth + 0.005) ? 0.3 : 1.0;
}
Offscreen Rendering ajoute des passes GPU supplémentaires, ce qui augmente la charge de calcul globale et la consommation d'énergie. Dans le développement mobile, c'est particulièrement critique : chaque changement de FBO nécessite un vidage de pipeline et du temps supplémentaire.
Pour les appareils mobiles, il est recommandé : d'utiliser un renderbuffer au lieu d'une texture si la lecture du résultat n'est pas nécessaire (passe de profondeur uniquement) ; de choisir la résolution minimale nécessaire pour les textures hors écran ; de fusionner les passes lorsque c'est possible avec MRT (Multiple Render Targets).
Offscreen Rendering sur différentes plateformes est implémenté via leurs propres API. Voyons des exemples pour OpenGL ES et Apple Metal.
// Configuration FBO et rendu de scène vers texture
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glViewport(0, 0, texWidth, texHeight);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(offscreenProgram);
glBindVertexArray(sceneVAO);
glDrawElements(GL_TRIANGLES, indexCount, GL_UNSIGNED_SHORT, 0);
// Retour au framebuffer par défaut
glBindFramebuffer(GL_FRAMEBUFFER, 0);
// Metal : passe de rendu hors écran vers texture
MTLRenderPassDescriptor passDesc = [MTLRenderPassDescriptor renderPassDescriptor];
passDesc.colorAttachments[0].texture = offscreenTexture;
passDesc.colorAttachments[0].loadAction = MTLLoadActionClear;
passDesc.colorAttachments[0].clearColor =
MTLClearColorMake(0.0, 0.0, 0.0, 0.0);
id<MTLCommandBuffer> cmdBuffer = [commandQueue commandBuffer];
id<MTLRenderCommandEncoder> enc =
[cmdBuffer renderCommandEncoderWithDescriptor:passDesc];
[enc drawIndexedPrimitives:MTLPrimitiveTypeTriangle
indexCount:indexCount
indexType:MTLIndexTypeUInt16
indexBuffer:indexBuffer
indexBufferOffset:0];
[enc endEncoding];
Foire Aux Questions
Offscreen Rendering, c'est quand les graphiques sont dessinés non pas à l'écran, mais dans un tampon invisible (texture). Ce tampon est ensuite utilisé comme texture pour d'autres effets. Imaginez que vous dessinez sur une feuille transparente que vous superposez ensuite à l'image finale.
Le rendu hors écran permet de créer des effets impossibles en une seule passe : ombres (rendu du point de vue de la lumière), réflexions, flou, lueur (bloom) et tonification HDR. Chaque effet nécessite une passe séparée dans une texture hors écran.
Oui, chaque passe hors écran double la quantité de travail du GPU, car la scène est rendue à nouveau. L'optimisation inclut la réduction de la résolution des textures hors écran, l'utilisation de renderbuffers et la fusion des passes via MRT (Multiple Render Targets).
FBO (Framebuffer Object) est un conteneur auquel sont attachés des textures ou des renderbuffers. Texture permet de lire les résultats du rendu (nécessaire pour le shadow mapping, les post-effets). Renderbuffer est plus rapide, mais son contenu ne peut pas être utilisé comme texture.
Toutes les API graphiques modernes : OpenGL ES (via FBO), Apple Metal (via MTLRenderPassDescriptor), Vulkan (via VkFramebuffer), Direct3D (via Render Target View). Conceptuellement, le mécanisme est le même — rendu dans une texture au lieu de l'écran.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi