Normal maps Tangent space
Obtenir des Normal maps Tangent space dans Blender
Niveau :
Introduction
Blender ne disposant pas encore, à sa version 2.45, d'une fonction permettant de "baker" directement des normal maps tangent space, nous allons donc voir dans ce tutoriel comment obtenir ces maps, à partir d'un mesh en multires, sans passer par un logiciel externe.
(NOTE : A ce jour Blender dispose d'une telle fonction de bake en tangent space dans sa version 2.48, rendant ce tutoriel obsolète pour les versions récentes de Blender).
Nous utiliserons un fichier .blend que j'ai nommé "Normal map Tangent space Factory", que vous pouvez télécharger ici :
Faisons d'abord le point sur les normal maps. Nous verrons ensuite brièvement la théorie nécessaire pour calculer des normal maps tangent space puis l'utilisation de la solution proposée. Ceux qui sont pressés peuvent passer directement à l'étape "Utilisation".
Le point sur les normal maps
Le normal mapping, ou dot3 bump mapping, est une technique qui permet d'ajouter du détail à l'ombrage sans ajouter plus de polygones, en modifiant les normales de la surface.
Alors que le bump mapping se contente de perturber les normales à l'aide d'une texture en niveau de gris, le normal mapping définit complètement les normales à l'aide d'une texture en RVB.
Ainsi, les valeurs de chaque canal (rouge, vert et bleu) représentent les coordonnées X, Y et Z du vecteur normal au point correspondant à ce pixel (plus justement un texel : texture element).
Cependant, le codage de ces coordonnées diffère selon l'espace de référence choisi.
En effet, on trouve trois espaces de référence :
- Le camera space :
C'est l'orientation de la caméra qui sert de référence.
Il n'est valable que pour un objet qui ne bougera pas par rapport à la caméra.
Utile seulement sur une scène fixe.
C'est dans cet espace que Blender peut "baker" les normales d'un objet.
- L'object space :
L'orientation de l'objet sert ici de référence.
Il est valable tant que l'objet ne subit pas de déformation.
Utile dans une scène animée.
La map n'est guère différente de la première. Seule la manière de la gérer est différente (le logiciel doit recalculer les normales par rapport à l'inclinaison de l'objet).
Blender ne gère pas ce type de map. - Le tangent space :
Enfin, dans le tangent space, c'est l'orientation de chaque faces qui sert de référence.
Cet espace est défini pour chaque face, par la normale de celle-ci, ainsi que l'axe U et V de sa map UV.
La map a la particularité d'être de couleur bleutée.
Toujours valable même lors de déformation du mesh.
Blender permet d'utiliser ce type de map dans un rendu, mais pas encore de les "baker".
Théorie
Nous utiliserons un modèle multi-résolution (mutlires) afin de plaquer les détails du modèle haute résolution sur le modèle basse résolution.
Nous allons "baker" en premier lieu la normal map du modèle haute résolution (nmap_pix), qui correspondra aux normales de chaque pixel, dans l'espace de référence caméra space.
Nous déterminerons pour chaque face son espace de référence (composé de trois vecteur que je nommerais U,V et Z), en "bakant" deux normal maps :
- La map des Z (nmap_vert), en "bakant" les normales du modèle basse résolution, qui représente le vecteur normal de chaque vertex dans l'espace de référence caméra space.
- La map des V (nmap_V) qui représente le vecteur V de l'UV, pour chaque face, dans notre caméra space.
La map des U, elle, sera calculée automatiquement (produit vectoriel) par les nodes à partir des deux précédentes.
Nous avons donc maintenant les normales de nos pixels, ainsi que l'espace U,V,Z de référence pour chaque face.
Il ne nous reste plus qu'à multiplier le vecteur du pixel (nmap_pix) à cette matrice U,V,Z (produit scalaire) pour obtenir notre normal map tangent space.
Utilisation de la "Normal map Tangent space Factory"
Requis :
Vous devez disposer d'un modèle en multires.
Celui ci doit déja être "unwrappé" à son premier niveau de résolution.
À partir de maintenant, toutes les maps que vous allez devoir créer devront avoir strictement la même taille.
1. Importation de votre mesh dans la "Normal map Tangent space Factory"
File / Append or Link
Choisir le mesh, et non l'objet. Sélectionner l'objet "Cube".
Dans le panel Editing / Link and Materials, choisir votre mesh à la place du "ME:Cube".

Passer en mode UV Face Select.
Garder le multires level à 1 jusqu'à la fin.
2. Baking de la "nmap_pix" (haute résolution)
Placer le Multires render au maximum.

Dans la fenêtre UV, créer une nouvelle image nmap_pix.
"Baker" les normales (Ctrl + Alt + B).
3. Baking de la "nmap_vert" (basse résolution)
Placer le Multires render à 1.

Dans la fenêtre UV, créer une nouvelle image nmap_vert.
"Baker" les normales.
4. Si le mesh est en "Set Solid" (aller à l'étape 5 dans le cas contraire) :
Dans l'onglet Editing / Modifiers, activer le modifier Edge Split durant le rendu (première icône Enable modifier during rendering)

5. Baking de la "nmap_V"
Dans l'onglet Material / Texture, activer la texture "V".

Dans la fenêtre UV, créer une nouvelle image nmap_V.
"Baker" les normales.
6. Utilisation des nodes pour générer votre normal map Tangent space
Dans la fenêtre Node Editor, charger les maps dans cet ordre, de haut en bas :
- nmap_pix
- nmap_v
- nmap_vert
Paramétrer le chemin d'enregistrement de votre map Tangent Space dans le node File Output.
7. Récupérer votre image dans le dossier choisi =)
Pour compléter ce tutoriel, voyons comment appliquer sur votre objet la normal map tangent space fraîchement calculée.
8. Application de la texture
Créer une nouvelle texture image sur votre material (panel Shading (F5) / Texture buttons).
Charger votre texture
Dans le panel Map image, activer le bouton Normal map.

Dans le panel Shaders, activer le bouton NMap TS

Dans le panel Map To, activer le Nor en négatif, et régler le slider sur 1,00.

Conclusion
Vous savez maintenant utiliser la solution proposée pour obtenir vos normal maps tangent space tout en ayant assimilé les notions principales de ce type de map.
tutoriel rédigé pour le Blender Clan par Zelouille, relecture par Traven et Meltingman, le 28 octobre 2007
Les commentaires appartiennent à leurs auteurs. Nous ne sommes pas responsables de leur contenu.