retour à l'accueil dernière actualité articles interviews qcm dictionnaires bibliothèque forums inscription membre profile recherche sauvegardes contacts aides
entete 0titre de la page
menu du haut




Parallax bump mapping
 Auteur : JF Maquiné Dernière révision : 11 Juillet 2005
Faire un commentaire :   0 message(s)








Introduction
   

Je ne sais pas si vous êtes comme moi mais depuis 1 an ou 2 j'ai l'impression que le rendu graphique des jeux 3D ne change pas beaucoup. Certes les personnages sont plus détaillés, les textures plus fines et abondantes, mais l'ambiance générale ne change pas beaucoup, graphiquement s'entend. D'ailleurs les éditeurs en ont conscience et si des sociétés comme ID-Software (auteur de la série Quake, Doom) ou Valve (série Half-life) ont investi énormément dans leur prochain moteur 3D, ce n'est pas pour vous coller plus de textures ou plus de géométrie. Non, l'objectif c'est la gestion de l'éclairage dynamique et en particulier de générer des effets de variation d'éclairage et d'ombrage à vous faire trembler dans votre fauteuil douillet. Pour cela l'une des techniques les plus importantes est le bump mapping, c'est-à-dire une technique qui a pour but de donner l'illusion de vrais reliefs, tout en gérant un éclairage dynamique, c'est-à-dire que les reliefs des textures vont produire des ombres et que celles-ci seront recalculées d'images en images.

Toutefois si le bump mapping est une bonne technique elle a aussi certains défauts visuels. Le premier c'est qu'elle limite l'aspect réaliste des textures. Parfois on a l'impression qu'un objet a un aspect jouet en plastique. Le second c'est que dès qu'on s'approche trop près de la texture l'effet de relief tend à disparaître. Pour régler ce dernier problème on dispose d'une technique nommée displacement mapping qui modifie réellement la géométrie des objets au lieu de la simuler comme le fait le bump mapping. Le problème c'est que le displacement mapping non seulement n'est pas exempt de défauts, mais coûte très cher en temps de calcul pour les processeurs graphiques.

Toutefois depuis peu est apparue sur les forums du site OpenGL.org une solution d'une grande simplicité de mise en oeuvre associant les fonctionnalités du bump mapping et du displacement mapping tout en consommant peu de ressources processeur et mémoire. Cette méthode se nomme parallax bump mapping est a été mise au point par Terry Welsh. C'est cette méthode que nous allons décortiquer en vous en expliquant le principe général de fonctionnement, la technologie des pixels shaders sur laquelle elle se base et ses avantages et inconvénients.

Remarque : L'explication détaillée de le parallax bump mapping reste technique quoi qu'on fasse. Vous trouverez en conséquence en fin de seconde partie de cet article un résumé de cette méthode qui devrait permettre à tous les lecteurs de comprendre les grandes lignes de la méthode. Toutefois pour vous aider dans la compréhension de ce qui suit ayez toujours a l'esprit que le parallax bump mapping consiste à ajouter une déformation de la texture dans le sens du regard afin d'accentuer l'effet de relief.

Bonne lecture :)





Petits rappels sur le bump et le displacement mapping
   

Pour bien comprendre l’innovation de le parallax bump mapping, il faut d’abord faire un petit rappel du bump utilisé jusqu'à présent et du displacement mapping. Le bump mapping associe à chaque élément de la texture une direction (appelée normale) qui représente l’orientation de cet élément de texture par rapport à la surface à laquelle la texture est associée. Grâce à cette normale, il va être possible de calculer l’éclairage de chaque pixel individuellement bien que la surface reste plane.


Le displacement mapping va au contraire déformer la surface. Ainsi non seulement la déformation va permettre un éclairage adapté mais lorsqu’on s’approche de la surface celle-ci apparaitra réellement en relief.


Si vous souhaitez en savoir plus sur le bump et le displacement, n’hésitez pas à consulter l’article


Le principale problème du displacement est qu’il consomme beaucoup de ressources GPU et donc qu’il ne peut pas être déployé à grande échelle dans dans jeu vidéo par exemple. L’idéal serait de trouver une technique qui donne les même effets visuels que le displacement mais avec un coût GPU proche du bump. Car comme nous pouvons le constater aujourd’hui, le bump fait parti des techniques parfaitement intégrées dans les nouveaux moteurs 3D.C’est cet exploit que réalise le prallax Bump Mapping.





Qu’est-ce que le parallax Bump Mapping ?
   

L’idée fondamentale est de calculer la projection du rendu du displacement sur une surface plane. Voici comment ça marche :


Lorsque le displacement est appliqué, chaque point de la surface (en bleu) est déplacé selon une hauteur qui lui est propre. Ces hauteurs sont mémorisées dans ce qu’on appelle une HeightMap, c’est-à-dire un champ de hauteur. La surface devient dont la surface rouge après déformation et la caméra voit non pas le point bleu mais le rouge.Si on voulait obtenir le même résultat sans déformer la surface, il faudrait dessiner le point dont est issu le point rouge à la place du point bleu.


C’est ce qui se passe dans le parallax bump mapping : pour chaque point bleu à dessiner, on calcule l'offset à appliquer à ce point pour trouver le point rouge à dessiner à sa place. Si on ne faisait ce calcul que pour la couleur du point, nous aurions une surface qui semblerait avoir du relief mais qui ne serait pas éclairée. Pour avoir un éclairage cohérent, on utilise la technique de bump classique en déplaçant la normale d’un point rouge avec celui-ci.


On obtient donc l’illusion du displacement pour l’équivalent du coût en calcul du bump. Il reste quand même un point à éclaircir : comment calculer l’offset. Un calcul exact serait trop long, mais un calcul approximatif est tout à fait possible à faire rapidement. Ce calcul doit dépendre de la hauteur de déformation qu’il aurait fallu appliquer et de l’angle de vue de la caméra. La solution retenue dans le est une projection en supposant une hauteur de déformation à peu près constante autour du point.


Bien sûr, comme nous le verrons plus loin, cette approximation induit quelques effets de bord (notamment si la variation de la hauteur de déformation est très forte, l’hypothèse de constance autour du point est malmenée et des incohérences peuvent apparaître localement dans le rendu).Ce calcul de l’offset est rendu possible grâce au pixel shader.





Calcul de l’offset par le pixel shader
   

Sans rentrer dans les détails de programmation, le principe est le suivant : le pipeline de rendu reçoit les coordonnées du point de la texture à rendre par défaut (cad celle du point bleu précédent.) Si le pixel shader n’a pas de programme, ces coordonnées seront utilisées ainsi dans la suite du pipeline pour le rendu. En introduisant un programme dans le pixel shader, il est possible de modifier ces coordonnées en leur ajoutant, par exemple, un offset que nous aurons calculé au passage.

Exemple pour le parallax bump mapping dans un pseudo-langage

Entrée : coordonnée texture par défaut (Coord), vecteur de vue de la caméra (V), heightmap (HM)
  • Début du programme du pixel shader
  • Hauteur reçoit la hauteur lue dans la HM aux coordonnées Coord
  • Offset est calculé en fonction de V et de Height (plusieurs formules sont possibles)
  • Coord = Coord + Offset
  • Fin du programme
Sortie : Coord modifié.

Ainsi grâce au pixel shader, l'OBM est presque aussi rapide que le bump classique. Vous pouvez trouver ci-dessous un exemple de shader permettant de réaliser de l'OBM :

Voici à quoi ressemble le shader principale de la démonstration du parallax bump mapping faite par Terry Welsh lui-même :

TEX height, fragment.texcoord[0], texture[2], 2D;
MAD height, height, 0.04, -0.02; # scale and bias
MAD newtexcoord, height, eyevects, fragment.texcoord[0];

TEX et MAD sont des instructions de shader. TEX permet d'accéder à un élément d'une texture et MAD permet d'effetuer une multiplication et une addtion en une seule instruction (MAD = Multiplier + ADditionner).





Avantages du parallax Bump Mapping
   

La première chose qui marque lorsqu'on regarde un screenshot ou une démo utilisant le parallax bump mapping c'est l'augmentation de réalisme. Dans la démo d'Humus (voir plus bas : liens utiles), vous avez l'impression que les murs bougent avec la lumière ce qui correspond effectivement à un effet subjectif de notre cerveau, les volumes varient lorsque l'intensité de la lumière varie. En fait ce surplus de réalisme que permet le parallax bump mapping est du essentiellement à un effet d'accentuation du relief. C'est assez amusant car cet effet n'est pas à l'origine un effet voulu, mais une conséquence de la méthode de calcul de le parallax bump mapping. Le parallax bump mapping marque plus les variations de relief car le décalage (l'offset) servant à imiter le displacement mapping est proportionnel aux variations du relief de la texture. Plus le relief est accentué plus l'offset variera et amplifiera cette accentuation. Nous verrons que cet effet peut devenir indésirable parfois.

Le second avantage c'est qu'enfin lorsqu'on s'approche d'un mur on ne voit plus les détails des reliefs s'estomper, voire disparaître. Ce problème m'a d'ailleurs souvent ennuyé dans un jeu comme Serious Sam où de loin vous avez l'impression d'un super bump mapping avec des textures très définies et de près c'est plat comme une crêpe. Vous pouvez d'ailleurs le constater sur les deux screenshots comparant un zoom avec un bump mapping classique et un avec le parallax bum mapping.





Inconvénients du parallax bump mapping
   

Nous avons vu qu'un des avantages était d'accentuer le relief original donnant ainsi plus de réalisme. Toutefois s'il y a des variations de reliefs trop importantes dans la texture originale, l'offset risque de prendre des valeurs trop grandes et des parties de la texture vont se chevaucher. Ceci génèrera des incohérences graphiques. Pour pallier à ce problème il faut faire en sorte que la height map n'ait que des variations 'raisonnables'. Je dis raisonnable et pas faible car au regard des démos que l'on peut voir, une bonne partie des types de reliefs utilisés dans les jeux actuels sont compatibles avec cette technique. Toutefois cela nous indique quand même que l'utilisation de la seule technique du parallax bump mapping dans un jeu n'est pas concevable, il faudra dans certaines situations en rester au bump mapping traditionnel.





Résumé du parallax Bump Mapping
   

L'offset bump mapping est difficile à comprendre car elle associe les techniques de deux méthodes pas faciles à comprendre en soit du premier coup, à savoir le bump mapping et le displacement mapping. Toutefois l'idée de base semble assez simple et part du constat suivant :

Si on suppose que la caméra ne peut voir qu'un seul point de la texture à la fois, alors le point de la texture vu par la caméra, si on fait du bump mapping, n'est pas le même que si on fait du displacement. Il suffit donc de déterminer ce qui génére cette différence de position (l'offset). d'inventer un algorithme qui permette de la générer, c'est l'offset bump mapping, puis d'utiliser les capacités de calcul des pixels shaders pour effectuer les calculs sur chaque point de la texture vu par la caméra. Dans un jeu la caméra étant l'oeil (le point de vue) du joueur.


Le parallax bump mapping consiste donc dans la formule :

Coordonnées des texels du bump mapping + offset = nouvelles coordonnées

L'offset (le déplacement) est calculé par les unités de calcul internes au proceseur graphique nommées pixels shaders. L'offset varie pour chaque point de la texture, et pour toutes les textures car il n'y a pas qu'une seule texture dans un jeu.





Quelques liens utiles
   





Conclusion
   

Le parallax bump mapping va-t-il s'imposer ? Bien qu'il soit encore trop tôt pour le dire cette technique a d'indéniables qualités dont la moindre n'est pas la qualité de ses effets visuels mais sa facilité de mise en oeuvre. Or ce genre d'arguments a souvent décidé la communauté des développeurs 3D à adopter ou non certaines techniques de rendus 3D.

On ne peut souhaiter qu'une chose au regard des démos qui commencent déjà à apparaître sur le net, c'est que des éditeurs l'adoptent rapidement. D'ailleurs certains rêvent déjà d'un DOOM3 exploitant cette technique.

Il est à noter d'une part que la méthode de Terry Welsh est applicable autant en openGL qu'en Direct-X, d'autre part le parallax bump mapping est révélateur des possibilités que peuvent offrir les shaders et en particulier les pixels shaders. L'auteur nous a informé qu'il est en train d'écrire un white paper (document descriptif) sur sa méthode. Dès qu'il sera disponible nous vous le ferons savoir.

J'espère que cet article vous a plu. On a essayé, Patrice et moi, de faire en sorte que vous soyez informés le plus tôt possible de ce qui nous semble être une technique d'avenir. N'hésitez pas à intervenir dans le forum pour poser vos questions :).


Cet article a été conjointement écrit par Patrice Arrighi et Jean-François Maquiné




YOUM
(analyseur syntaxique temps réel)
Nombre de définitions trouvées
42
Multi-dico par texte : actif   -   Multi-mots par définition : 4






fonction
menu de droite
fin de menu

qcm du mois
Télescope spatial Hubble
fin qcm


Page générée en : 0.008 secondes
ligne
Technologies Onversity : Hydrogen 1.0 (moteur de base de données) - SE.EN 1.0 (moteur de recherche) - YOUM 2.0 (analyseur syntaxique temps réel)
Tous droits réservés à Jean-François MAQUINÉ
ligne