DivideConcept.net

le blog de divide.

De l’apport du displacement mapping (1/3)

Il se trouve que je développe un moteur 3d depuis un peu plus d’an maintenant dont la particularité est de mettre en oeuvre une technique jusque là non exploitée (ou sous exploitée) dans le temps reel, le displacement mapping.

Tout d’abord, le concept. Pour l’exemple, j’utiliserai un Imp de Doom 3

dont voici la texture diffuse (couleur brute) :

Vous êtes tous habitués maintenant à voir du bump mapping, voire du normal mapping dans les jeux video.
Vous savez aussi sans doute comment ces techniques fonctionnent :
Dans le cas du bump-mapping, il s’agit d’une texture supplémentaire en niveau de gris qui vient perturber le calcul de la lumière sur la surface, pour donner l’illusion d’un relief plus complexe.

Le normal mapping (utilisé notamment dans Doom 3 et Far Cry) est une version ameliorée du bump mapping, qui repose non plus sur une seule composante (niveau de gris) mais sur 3 (niveaux de rouge, vert, bleu). Ces 3 informations ne doivent bien sur pas être interpretés comme des informations de couleurs dans ce cas particulier, mais comme les composantes d’un vecteur à 3 dimensions. Ainsi, le rouge codera la composante X du vecteur, le bleu codera pour le Y, et le rouge pour le Z. Pour chaque pixel de cette texture normale, on a donc un vecteur 3D associé.
Mais a quoi correspond ce vecteur 3D ?
Et bien il est orienté selon la normale de la surface à cet endroit la. En gros, il indique dans quelle direction était orienté la surface du modèle high poly (tres détaillé) à cet endroit la par rapport à la version low poly (peu détaillée, utilisé dans le jeu video).
Ca permet d’effectuer un calcul de lumière beaucoup plus juste sur la surface (le calcul de la lumière en lui même est très simple, il s’agit d’un simple produit scalaire du vecteur indiquant la direction de la lumière et du vecteur indiquant l’orientation de la surface).

Le displacement mapping repose sur un principe similaire aux 2 techniques précédentes, sauf qu’il effectue plus qu’une altération de la lumière : il fait également subir une altération à la géometrie.
Techniquement, son codage repose sur un niveau de gris (les points clairs représentant les niveaux les plus élevés).
Mathématiquement, on peut dire que le displacement mapping est l’intégrale du normal mapping (le normal mapping code des pentes, le displacement mapping code des surfaces) - et vice-versa, le normal mapping est la dérivée du displacement mapping.

Il est donc théoriquement possible de calculer une displacement map à partir d’une normal map.


(displacement map reconstituée à l’aide du logiciel Displacement Creator (www.ryanclark.net) )

Cette technique, qui permet d’aboutir à un niveau de détail optimum n’est actuellement utilisée dans aucun jeu vidéo, devant le temps de calcul effroyablement long qu’elle engendre.
Cependant il est possible de mettre en oeuvre des techniques le simulant de manière approximative (parallax mapping, aka virtual displacement mapping, utilisé dans l’Unreal Engine 3 et le futur Elder Scroll IV) voire de le reproduire fidèlement !

Ces techniques, leurs avantages et leurs inconvénients seront abordés en détail dans le prochain article.

4 commentaires pour “De l’apport du displacement mapping (1/3)”

  1. Blade_Runner dit :

    Hello,
    J’ai une question pour ton prochain article.

    Sur ton site, la vidéo de la tête de femme réalisée à partir d’un simple cube en displacement mapping montre un aliasing prononcé sur les bords du visage.

    Cela vient il de la vidéo (basse qualitée) ou de la technique ?

  2. divide dit :

    L’aliasing vient de la technique, mais elle a été améliorée entre temps (la vidéo dont tu parles remonte à septembre 2004).

  3. chaugnar-faugn dit :

    Tu as l’art d’expliquer simplement des choses apparemment complexes.

    Merci :)

  4. Napalm dit :

    Très interessant, je n’avais pas tout saisi, maintenant faut que je lise le nouvel article !

Laisser un commentaire

Si vous avez un compte sur WeFrag, connectez-vous pour publier un commentaire.

Vous pouvez, entre autres, utiliser les tags XHTML suivant :
<a href="" title="">...</a>,<b>...</b>,<blockquote cite="">...</blockquote>,<code>...</code>,<i>...</i>