Les Normal Maps avec Blender

Écrit le 28/12/2004 par Fallen Angel
Dernière mise à jour : 31/01/2006

La théorie

Le normal mapping est une nouvelle technique qui a surtout été introduite principalement dans Doom³ (et dans HL² également). Ce procédé encode dans une même image, à la manière du bump mapping, les valeurs des normals en valeur RGB (alors que le bump ne fonctionne qu'en échelle de gris). Cela permet d'obtenir un relief très réaliste, car il réagit à l'éclairage d'une manière plus naturelle que le bump mapping.
Cette technique a été introduite rapidement dans Blender 2.36, et sera améliorée dans les versions suivantes (à l'heure de l'écriture de ce tutorial, cette technique connait des limites, mais elles seront dépassées).

Créer un Normal Map

Commençons par créer un normal map.
Comme la théorie l'indique, il faut d'abord avoir un model high poly bien détaillé, pour pouvoir ensuite le transformer en une texture.

Pour éviter de trop compliquer, nous allons utiliser un prefab de Blender (version 2.30 et suivantes), j'ai nommé, le Monkey.
Bref, démarrez Blender, et ajoutez ce mesh.

http://www.game-lab.com/images/tuts/blander_normalmaps/tut2_1.jpg

Voilà, vous avez votre monkey. Il est assez polygonal, donc on va l'affiner, en utilisant la subdivision. Dans le menu Editing (F9), cochez la case Subsurf, et définissez le nombre d'itérations pour la subdivision. Plus ce nombre sera elevé, plus le niveau de subdivision sera élevé (ouais, logique...). Affinez votre model en cliquant sur Smooth dans le menu Editing également.

http://www.game-lab.com/images/tuts/blander_normalmaps/tut2_2.jpg

J'ai enjolivé le pourtour de notre monkey, en ajoutant un cadre, vous pouvez faire de même. Ajoutez une caméra (ou utilisez celle déjà présente s'il y en a déjà une) et placez-la devant votre mesh, de manière à ce qu'elle soit bien en face. Configurez votre caméra en Ortho (F9 > Ortho) afin que votre caméra ne fonctionne pas en perspective, mais qu'elle applatisse le rendu (c'est recommandé pour faire une texrure).

http://www.game-lab.com/images/tuts/blander_normalmaps/tut2_3.jpg

Voilà maintenant la partie la plus importante : la définition du material et de la texture. Il va falloir créer un material, et ajouter 3 channels pour les textures. Chaque texture est un procedural Blend de base, c'est à dire Lin.

http://www.game-lab.com/images/tuts/blander_normalmaps/tut2_4.jpg

En gros, les 3 channels correspondent aux 3 couleurs mappées sur les 3 axes, c'est à dire Rouge sur X, Vert sur Y, Bleu sur Z.
Déjà, commencez par définir la couleur du material en noir (le champ Col dans Material), et cochez Shadeless, pour éviter que la texture ne soit affectée par l'éclairage.

http://www.game-lab.com/images/tuts/blander_normalmaps/tut2_5.jpg

Il va maintenant falloir définir nos 3 textures comme il faut. Les 3 doivent être appliquée à la normale du mesh (Nor), et définies sur l'axe concerné, comme décrit précédemment (Rouge pour X, vert pour Y, etc). Voilà ci-dessous comment bien définir vos textures :

http://www.game-lab.com/images/tuts/blander_normalmaps/tut2_6.jpg
http://www.game-lab.com/images/tuts/blander_normalmaps/tut2_7.jpg
http://www.game-lab.com/images/tuts/blander_normalmaps/tut2_8.jpg

Pour résumer, la première texture doit être assignée en Mix pour avoir un meilleur résultat, les 2 autres doivent s'ajouter aux précedentes (Add). Pour la dernière texture sur Z, étant donné que l'axe Z pointe vers l'observateur, les valeurs Z négatives ne sont pas prises en compte, on va décaler la texture de -0.5 sur X, et élargir 2 fois la texture sur X, comme montré sur l'exemple ci-dessus (dans Map Input).

Voilà, votre material est maintenant bien configuré (et il est universel, vous pouvez l'importer avec Maj + F1 sur tout vos models pour faire un normal map). Prévisualisez en sphère dans Preview, vous devez obtenir ceci :

http://www.game-lab.com/images/tuts/blander_normalmaps/tut2_9.jpg

La dernière ligne droite consiste à régler votre rendu comme vous le souhaitez. Déjà, si vous voulez l'utiliser dans un jeu, la taille du rendu doit être une puissance de 2 (donc 128, 256, 512, 1024 etc). Pour cet exemple, j'ai fais une image de 1024x1024, avec un filtre antialiasing 8x comme montré ci-dessous.

http://www.game-lab.com/images/tuts/blander_normalmaps/tut2_10.jpg

Voilà, il vous reste à faire votre rendu, et à le sauvegarder. Vous avez votre normal map, félicitations ! :)
Passons à la partie suivante pour utiliser votre normal map.

Utiliser un Normal Map

Voici la partie la plus simple. Pour l'exemple, créez un Plane (Add > Mesh > Plane), ajoutez un material, et ajoutez une texture > image. Chargez le normal map que vous avez rendu précédemment. Veillez à bien cocher la case Normal Map, indiquant à Blender que la texture est un normal map, et pas un simple bump.

http://www.game-lab.com/images/tuts/blander_normalmaps/tut2_11.jpg

Maintenant, cette texture doit être assignée comme un bump, donc en Nor dans Map To. Décochez la case Col, puisque cette texture n'est pas assignée en diffuse, c'est simplement un bump, elle va définir le relief. Pour l'exemple, je n'ai pas eu le courage de faire un color map, j'ai juste défini une couleur au pif. J'ai également répété la texture sur X et Y dans Map Input. Et voilà, normalement, votre Normal Map fait bien son travail.

http://www.game-lab.com/images/tuts/blander_normalmaps/tut2_12.jpg

Faites votre rendu, et voilà, le normal map fonctionne à merveille, l'illusion est donnée, et la victoire est entre vos mains. À vous maintenant la joie du normal mapping !

http://www.game-lab.com/images/tuts/blander_normalmaps/tut2_13.jpg

Une petite précision, ce tutorial a été rédigé avec la version 2.36 de Blender. Dans cette version, les normal maps ne fonctionnent que sur des planes (pas d'UV mapping en gros), et pas de parallax mapping non plus, mais celà sera bien entendu corrigé dans les versions à venir !