Création de Normal Maps

 
 
 
Les normal maps sont un effet graphique extrèmement utile pour permettre d'avoir des décors très détaillés sans utiliser de nombreux polygones.
 
Le principe est simple, on va crééer un modèle ou un décor constitué d'un nombre faible de polygone et on va y appliquer une texture de normal map qui va simuler un beaucoup plus grand nombre de polygones.
 
Bien sûr une texture standard grâce a certains artifices de dessin peut simuler des bosses des creux. On va simplement dessiner des zone d'ombre et des reflets artificiellement. Mais bien sûr ces dessins ne réagiront pas aux éclairages dynamiques ni au déplacement du modèle face aux lumières.
 
Les normal maps ne sont pas des textures au sens propre, on ne les voit pas sur le modèle. En fait elles contiennent des informations sur le relief à appliquer sur une surface plane.
Pour comprendre comment ça marche il faut savoir ce qu'est une normale.
 
Une normale est un vecteur qui définit l'orientation d'une surface. Si on prend une demi sphère composée de facettes, les normales seront commes des épingles plantées dans une pelotte. Elles sont dirigées vers l'extérieur et sont perpandiculaires à leur surface.
 
Ce que les normal maps vont faire c'est enregistrer les coordonnées XYZ des normales dans une image en utilisant les couleurs RVB pour représenter ces coordonnées.
 
Comment va-t on créer une normal map:
 
Encore une fois c'est très simple, on va créer un objet très détaillé composé de milliers de polygones, puis on va prendre une "photo" des normales des ces polygones. Concrètement on va projeter l'image des normales sur une surface plane ou courbe composée d'un seul polygone ou de plusieurs.
 
Sur cette surface on va avoir une image qu'on pourra exporter dans un fichier image par exemple un TGA si on veut l'utiliser dans HL2.
 
Comment l'effet est il appliqué :
 
En fait cette normal map ne va pas affecter la géométrie du modèle, il gardera son nombre de polygones, mais ce qui va se passer ce sera que le moteur graphique du jeu va utiliser cette normal map pour le calcul des éclairages. Il ne va pas simplement prendre en compte l'orientation des facettes du modèle et opérer un lissage, mais en plus il va y ajouter les détails de relief contenu dans la normal map.
Ceci va avoir pour conséquence que lorsque l'éclairage est appliqué, on va avoir l'impression que le modèle est extrèmement détaillé alors qu'en fait il n'est composé que de peu de polygones.
 
Certains jeux récents comme Doom3 utilisent systématiquement cet effet pour les modèles et le décor. Ca permet d'avoir peu de polygones à calculer, mais la contre partie, c'est qu'il faut une carte graphique du dernier cri pour pouvoir bénéficier des normal maps sans que ça soit injouable!
Half-Life 2 utilise aussi ces normal maps, mais d'une façon plus limitée. On les utilise surtout pour les visages, ou pour représenter des décors naturels comme des rochers par exemple.
 
Le défaut de ces normal maps, c'est que selon l'angle de vue on va se rendre compte de la supercherie, si on a une paroi rocheuse composé d'un seul polygone avec une application d'une normal maps, de loin ça sera très bon, mais si on se colle contre la paroi on verra qu'elle n'a pas de relief réel.
 
 
Création de normal maps avec Softimage XSI :
 
 
XSi a une fonction qui permet de créer facilement ces normal maps. On va tout d'abord créer un décor ou un modèle composé de très nombreux polygones. Lorsque ce sera fait, on va lui appliquer une texture et une projection comme d'habitude.
 
La deuxième étape sera de créer une maille composée d'un seul polygone. On va placer ce polygone en face du décors ou du modèle comme s'il s'agissait d'un écran sur lequel on va projeter l'image du décor.
 
La troisième étape est d'appliquer l'effet GPUSurfaceFX2 à ce polygone. On le trouve dans Render/Get/Property/GPUSurfaceFX2
 
 
Dans cette fenêtre de propriété, on va commencer par définir quel(s) objet(s) seront utilisés comme source de haute définition. On va donc cliquer sur Pick object ou Pick group et ensuite on va cliquer sur l'objet désiré dans la vue.
On va encore définir l'adresse pour l'image de sortie, il y en a deux, une pour la normal map et une autre pour la projection de la texture de l'objet de haute définition sur le polygone seul.
 
 
Une fois que c'est fait, on va cliquer sur Regenerate pour lancer le calcul et créer la nomal map.
Selon les versions de XSI, il faut définir le Setup, sinon la normal map risque de ne pas être correcte, la projection ne sera pas dans la bonne direction.
 
 
C'est aussi simple que ça, créer une normal map est donc un processus facile à faire, vous pourrez de cette façon créer des textures ayant un relief détaillé sans peine. Il faut toutefois respecter une règle importante, les normal maps doivent être carrées par exemple 512x512, mais pas de rectangle.
 
 
Pour obtenir un modèle de personnage utilisant des normal maps, on va commencer par créer un modèle sans compter le nombre de polygones, on peut très bien modéliser de petits détails comme des cheveux, donner un grain à la peau, ajouter des écailles, des pièces d'équipement etc...
 
Mais si on veut faire ça sur un modèle comme un personnage, on va avoir un problème. Généralement on ne va pas utiliser une simple projection plane pour les textures, mais on va utiliser des développement UW afin que les texture ne soient pas distordues.
On ne peut pas directement générer des normal maps pour ces textures car dans ce cas les normales ne correspondraient plus avec la texture et lors de l'application dans le jeu les normales ne seraient pas à leur place.
Dans ce genre de cas, il faudra appliquer la texture développée sur une surface plane comme un grille très fine puis déformer cette grille pour générer les petits reliefs de détails. Ensuite on pourra exporter la normal map correspondant.
On peut aussi faire ce travail dans un éditeur de texture, il y a un plugin pour Photoshop qui permet de générer des normal maps à partir d'images.
 
Vous trouverez ce plugin chez Nvidia dans la partie développeurs : http://developer.nvidia.com/object/nv_texture_tools.html
 
Ce plugin est très utile pour donner du relief à vos textures, on peut utiliser une couleur pour dessiner des reliefs, ou simplement créer un relief se basant sur les couleurs de la texture. Vous comprendrez très facilement comment l'utiliser, c'est très bien fait et on peut avoir une visualisation 3D en temps réel avec la texture appliquée.
 
On trouve ce plugin dans le menu Filtre :
 
 
Voilà le résultat après avoir gribouillé la texture avec un spray rouge, on a choisi le canal rouge ensuite dans le filtre bien sûr.
 
 
La même chose avec la texture d'origine appliquée comme décal dans la prévisualisation 3D:
 
 
Et le résultat final, la normal map associée à la texture, elle n'est pas carrée mais rectangulaire, il faudra par la suite la rétrécir pour qu'elle le soit.
 
 
Ce plugin bien que très utile reste très imparfait, si on a une texture avec des ombrages et des zones claires la normal map ne sera certainement pas exacte, ce qui devrait être bombé sera creux par exemple. C'est pourquoi il faut le plus souvent modifier la texture avant de créer la normal map, par exemple diminuer le contraste pour avoir moins de "parasites" éclaircir et assombrir certaines zones pour définir les différences de niveau.
 
Mais très souvent ce genre de correction ne suffit pas, on va alors carrément dessiner une texture en nuances de gris pour en extraire la normal map.
 
On utilise Photoshop, on met la texture comme couche de fond et on travaille avec les calques pour dessiner une texture simplifiée représentant les creux et les bosses.
Par défaut, ce qui sera blanc sera les bosses et le noir représente les creux. On va travailler avec le pinceau et le remplissage avec le dégradé pour simuler les pentes.
On va parfois travailler en plusieures étapes et tirer plusieurs normal maps qu'on va mélanger en transparence pour obtenir rapidement un résultat très satisfaisant.
 
Voir le tutoriel pécifique sur les normal maps de la section textures.