Une normal-map, aussi appelée bump-map, est une texture dans laquelle chaque texel (texel = texture element) contient
un vecteur normal XYZ. Dans une texture classique, encore appelée color-map ou diffuse-map ou base-map, chaque texel contient une couleur RGB.
Fondamentalement, il n'y a aucune différence entre une normal-map et une color-map si ce n'est l'interprétation que l'on donne aux texels.
Le vecteur normal contenu dans un texel d'une normal-map représente le vecteur perpendiculaire à la surface d'un objet au niveau du texel considéré.
Dans ce cas bien particulier, le vecteur normal a pour composante XYZ le triplet {0.0, 0.0, 1.0}. Un vecteur de ce type indique qu'il n'y a aucune déformation
(ou relief) au niveau du pixel. Pour perturber la surface, il suffit d'avoir un vecteur différent, par exemple {0.2, 0.3, 0.93}. Détail important pour ceux qui souhaiteraient
générer leur normal-map: un vecteur normal à toujours une longueur unitaire, c'est à dire que sqrt(X2 + Y2 + Z2) = 1.0 où sqrt() est la fonction racine carrée.
La principale utilisation d'une normal-map est la description (par pixel) de la surface d'un objet. Cette description très précise, puisque
du niveau du pixel, est utilisée dans les algorithmes de bump mapping et d'éclairage par pixel. Les algorithmes cablés de lighting des
cartes graphiques utilisent la normale par vertex ce qui conduit à un éclairage très peu réaliste sauf si le nombre de polygones devient
très grand (mais nous aurons dans ce cas quelques petits problème de vitesse de rendu!). Grâce aux shaders programmables (vertex et pixel shaders),
on peut désormais effectuer les calculs d'éclairage au niveau du pixel en exploitant les normal-maps ce qui conduit à des rendus très réalistes sans pour autant avoir des modèles
denses en polygones.
Généralement, une normal-map est dérivée d'une color-map. Cette dérivation se fait à l'aide d'utilitaires de création de normal-maps.
Voyons tout cela en détail.
Pour commencer, voilà une color-map:
fig.1 - La color-map.Et voilà maintenant la normal-map générée à partir de cette color-map:
fig.2 - La normal-map.L'utilitaire que j'ai employé pour créer la normal-map était disponible à une époque sur le site de nVidia.
Il y est peut être encore mais doit être caché dans je ne sais quel package. Alors pour plus d'efficacité, je vous le fournie dans les downloads en fin de page.
Cet utilitaire, nmapgen.exe est un tout petit utilitaire en ligne de commande (j'adore ce type de tools!). Je vous fournie également le fichier bat qui va avec
afin de double cliquer dessus et de générer directement la normal-map. Le tool XpConfigurator
vous permet d'installer une ouverture de shell Dos dans le clic droit de la souris sous Explorer. Très pratique pour générer n'importe où une normal-map.
La page suivante permet de downloader les plugins Photoshop concoctés par nVidia pour créer les normal-maps: Adobe Photoshop Plug-ins.
Une normal-map est reconnaissable par sa couleur bleuté. Je vous ai dit que chaque texel contient un vecteur XYZ. Si l'on tente de
visualiser directement une normal-map à l'aide d'un simple viewer d'image, chaque texel sera interprété comme une couleur RGB. Cela signifie
que la coordonnée X du vecteur normal sera lue comme la composante R (rouge) de la couleur, Y sera lue comme la composante G (vert) et enfin
la coordonnée Z sera assimilée à la composante B (bleu). La normal-map représentant la surface de l'objet (exprimé dans l'espace tangent, voir les
explications dans ce tutor: Bump Mapping avec GLSL ), la plus grande partie des vecteurs normaux aura
la coordonnée Z très supèrieure aux deux autres X et Y. Z étant interprêté comme la composante bleue de la couleur, la normal-map
sera globalement bleuté.
L'utilisation des normal-maps dans le cadre du bump mapping est expliquée dans ce tutoriel: Bump Mapping avec GLSL.