Optimisation du splatting temps réel
Par Alewinn le jeudi 15 octobre 2009, - Technique - Lien permanent
Cette procédure montre comment utiliser les informations RVB d'une image pour mixer ensemble plusieurs motifs afin de texturer de grands espaces, comme des terrains, par exemple. Nous ajoutons également la possibilité de peindre et/ou calculer l'occlusion ambiante, ainsi que la possibilité de peindre des effets de lumière directement sur le modèle.

Théorie :
Les performances de l'affichage temps réel sont conditionnés par la place mémoire assignée aux textures et au nombres d'opérations parallèles que doit traiter la carte graphique. Ainsi si l'empreinte mémoire des textures d'une scène (textures des décors/personnages/objets) est suffisamment petite, ces données sont chargées dans la mémoire de la carte graphique, accélérant le rendu de l'image. En revanche, si l'empreinte mémoire des textures de la scène dépasse les capacités de la carte graphique, les textures doivent transiter de la mémoire centrale à la mémoire de la carte graphique,ceci pouvant occasionner des ralentissements au niveau de l'affichage.
D'autre part, le nombre de matériaux (shaders) augmente sensiblement la charge de calcul d'une scène ; les calculs de l'illumination doivent s'effectuer pour chaque matériau, en fonction de ses propriétés (Spécularité, transparance Alpha, ombres projetées, Normal Map, spec map, propriété spéciales d'illumination spécialement programmées dans le pipeline de shading de la carte graphique, etc...). Il vaut donc mieux n'utiliser qu'un nombre limité de matériaux, pour éviter les soucis de baisse du framerate.
Pour alléger un peu le calcul et l'empreinte mémoire nous pouvons partager les même textures et matériaux sur des matériaux nodaux qui partagent également une fraction de leurs traitements, sans pour autant trop perdre en qualité visuelle. Nous utilisons également les propriétés de spécialisation des entitées de blender pour partager des fonctionnalités communes aux différents matériaux.
Ainsi, nous allons créer un processus générique qui vise à effectuer sur l'objet :
- Le mélange alpha des couleurs des textures (Color Texture Blending par Texture splating)
- Le calcul de l'occlusion ambiante
- Les effets de lumière (glow)
![]() |
Mise en place :
1- Dépliage des UV
Cette procédure fonctionne avec des objets dont l'UV map à été déplié par rapport à une vue orthogonale (par exemple la vue de dessus pour un terrain -> en mode édition "TAB" de l'objet sélectionné, "7" du pavé numérique, menu "Mesh > UV Unwrap > Project from view (Bounds)" ) mais fonctionne aussi avec des uv dépliés manuellement. En revanche Il faut absolument que l'UV soit correctement déplié pour que la procédure puisse fonctionner.
2- Création des textures et matériaux
Une ensemble de trois textures plus un matériau "basique" est utilisé dans cet exemple. Il est tout à fait possible d'utiliser 4 matériaux ou 4 textures, ou 2 matériaux et 2 textures, etc.... Les changements à faire à ce moment là n'impacteront que le node "Texture Pack" (voir plus loin).
Il est conseillé de génériciser ces textures et matériaux au sein d'un groupe dans un fichier à part, comme indiqué dans La methode de multi-texturing , de façon à pouvoir les utiliser en suite en effectuant un lien sur le groupe.
Dans cet exemple nous utilisons les matériaux ci-dessous :
![]() |
![]() |
![]() |
![]() |
3- Mise en place du matériau nodal
Affecter un matériau au terrain (ou à l'objet) et rendre nodal ce matériau (boutton "Nodes" du matériau). Créer une nouvelle fenêtre et lui affecter le node éditor.
Nous allons utiliser les nodes par défaut de Blender pour créer un ensemble de nodes "évolués" qui permettrons, une fois interconnectés entre eux, de gérer le shading du modèles, voire de plusieurs modèles, partageant la même méthode de shading.
Avant de commencer le montage nodal juste une petite précision sur le partage de ressources à l'intérieur d'un fichier blender. Dans l'interface de blender on peut parfois noter de petits numéros dans un boutton qui se situe souvent à droite des noms de ressources (matériaux, textures, nodes, etc....). Ils indiquent le nombre d'entitées (matériaux, animations, objets, node, etc...) qui partagent cette même ressource (cette même donnée).
Ces numéros se présentent comme suit :
![]() |
Lorsqu'une donnée est partagée par plusieurs entitées (numéro élevé à côté du nom de la donnée) on dit qu'elle est générique. En revanche lorsqu'il n'y a pas de numéro ou lorsqu'il n'y a qu'un "1" dans le boutton, la ressource est unique ou spécifique.
![]() |
Donnée Générique (partagée par 12 objets) |
ou ![]() |
Donnée spécifique |
Par défaut Blender crée des données génériques lorsqu'on duplique un objet, ou lorsqu'on réutilise des objets groupés. Le fait de créer des données génériques ou spécifiques lors du clonnage d'un objet se paramètre dans le panneau des options de blender.
Et là vous me direz... Qu'est-ce que ça fait ?
Concrètement, lorsqu'on modifie une ressource générique (partagée par plusieurs objets,dans ce cas le numéro dans le boutton est >1) on modifie cette ressource POUR TOUS LES OBJETS UTILISANT CETTE RESSOURCE. La généricité des données est une mutualisation des ressources système ; la donnée n'est présente qu'à un seul et même endroit en mémoire, diminuant ainsi drastiquement les temps de calcul lors du rendu d'un nombre d'objets important partageant la même donnée.
En revanche si on veut une variation d'une donnée générique pour un objet sans pour autant la changer sur les autres objets, alors il faut la rendre spécifique ; il faut sélectionner l'objet en question, puis cliquer sur le petit boutton avec le nombre dedans.
En mutualisant nos données génériques pour les traitements et les ressources identiques à tout un ensemble d'objet (comme notre jeu de textures, par exemple) on gagne de la place mémoire.
Maintenant que nous savons faire la différence entre une donnée générique et une donnée spécifique, il est temps de mettre en place le montage nodal, qui se présente(ra au final) comme suit :
![]() |
Chacun de ces nodes sont en fait des groupes de nodes faisant intervenir des masques utilisés pour peindre les différentes méthodes et des textures.
Le node générique "Textures Pack" renferme les 4 composants (Textures ou matériaux ou les deux) qui vont servir au mélange alpha des couleurs des textures.
![]() |
Il est tout à fait possible d'utiliser des matériaux à la place des nodes texture. Cela dit les performances de rendu risquent de chuter en fonction du nombred'objets sur lesquels est appliquée la méthode.
Le groupe de nodes suivant "Splat and shadows méthod" est le plus complexe du montage nodal car il contiens deux méthodes de shading et permet de combiner les principales couches de shading :
![]() |
Les deux masques (Splat Mask et Shadow and ambiant occlusion Mask) sont directement utilisés dans blender :
- En texture paint dans le cas du splat Mask pour peindre les textures sur l'objet, les cannaux Noir + RGB désignent une texture ou un matériaux.
- En Backing de l'occlusion ambiante et des ombres pour le maske Shadow and ambiant occlusion. Théoriquement il faudrait alors faire deux backings successifs si on veut avoir les ombres et l'occlusion ambiante sur le même masque, ou encore effectuer le montage des deux sous Gimp ou photoshop (je n'ai pas essayé, mais ça devrait marcher)...
Vient en suite le node spécifique qu'on utilise pour le masque de glow (Lighting Method), extrêmement simple :
![]() |
Enfin un dernier gros morceau, le node qui permet d'effectuer la fusiion du glow avec les autres méthodes (platting et shadow) et aussi de gérer la direction de la lumière (Light Direction Node) :
![]() |
Le montage nodal du matériau est terminé. Ouf !
Utilisation :
Maintenant il ne reste plus qu'a ... utiliser l'outil !
C'est en fait relativement simple ; il suffit d'affecter un des trois masques (Splat,Shadow et Glow) directement dans l'image editor et en suite de peindre directement sur l'objet en mode "texture paint"
- "Tab" passage de l'objet sélectionné en mode édition
- "a" pour sélectionner toute la géométrie de l'objet
- Dans la fenêtre "image editor" sélectionner le masque sur lequel on veut travailler (Splat, Shadow ou Glow)
- Passer en mode texture paint
- Sortir du mode édition et peindre directement sur le modèle
Pour l'exemple initial, nous avons généré les masque suivants :
![]() |
Splat Mask |
![]() |
Shadow Mask |
![]() |
Glow Mask |
Objet final :
![]() |
|
===> Fichier Blend : Splatting.rar <====
|







ou 








