Une Normal Map est une texture spéciale qui simule des détails de surface (bosses, creux, gravures, pores) sans modifier la géométrie réelle du Mesh. Elle encode des directions de normales dans les canaux RGB de l’image, permettant à la lumière de réagir comme si la surface avait du relief.
Le principe
Chaque face d’un mesh possède une normale : un vecteur perpendiculaire qui indique sa direction. C’est cette normale qui détermine comment la lumière se réfléchit.
Une Normal Map « triche » en modifiant ces normales pixel par pixel :
- La géométrie reste plate
- Mais la lumière réagit comme si la surface avait du relief
- L’illusion est convaincante sous la plupart des angles
Comment ça fonctionne
Les trois canaux de couleur encodent les trois axes de la normale :
| Canal | Axe | Direction |
|---|---|---|
| Rouge (R) | X | Gauche ↔ Droite |
| Vert (G) | Y | Haut ↔ Bas (ou Avant ↔ Arrière selon convention) |
| Bleu (B) | Z | Vers l’extérieur (perpendiculaire) |
Une surface plate sans détails apparaît violet/bleu (RGB: 128, 128, 255) car la normale pointe directement vers l’extérieur (Z maximum).
Normal Map vs Bump Map vs Displacement
| Technique | Données | Géométrie modifiée | Silhouette affectée |
|---|---|---|---|
| Normal Map | Directions (RGB) | Non | Non |
| Bump Map | Hauteur (niveaux de gris) | Non | Non |
| Displacement | Hauteur (niveaux de gris) | Oui | Oui |
- Bump Map : plus ancien, moins précis, converti en normal map à la volée
- Normal Map : standard actuel, plus de contrôle directionnel
- Displacement : seul à créer du vrai relief géométrique
Tangent Space vs Object Space vs World Space
Trois types de Normal Maps existent :
Tangent Space (le plus courant)
- Teinte violette/bleue caractéristique
- Relatif à la surface de l’objet
- Fonctionne même si l’objet bouge/se déforme
- Standard pour les personnages et objets animés
Object Space
- Couleurs variées (arc-en-ciel)
- Relatif à l’orientation de l’objet
- Ne fonctionne pas si l’objet se déforme
- Parfois utilisé pour les objets statiques
World Space
- Rarement utilisé
- Relatif à la scène entière
- Utilisé dans certains cas spécifiques (terrain)
Dans 99% des cas, vous travaillerez avec des Tangent Space Normal Maps.
Convention DirectX vs OpenGL
Attention à la convention du canal vert (Y) :
| Convention | Vert = Haut | Utilisé par |
|---|---|---|
| OpenGL | Y+ pointe vers le haut | Blender, Maya, Substance (par défaut) |
| DirectX | Y+ pointe vers le bas | Unreal, Unity, 3ds Max |
Si vos détails semblent inversés (bosses au lieu de creux), il faut inverser le canal vert. Dans Blender, cochez l’option correspondante dans le node Normal Map.
Dans les logiciels 3D
La Normal Map est universelle :
- Blender : Node Normal Map → Normal du Principled BSDF
- Maya/Arnold : aiNormalMap → Normal Camera
- Substance Painter : Canal Normal, bake automatique
- Unreal Engine : Normal input du Material
- Unity : Normal Map slot du shader
- 3ds Max/V-Ray : VRayNormalMap
Focus Blender
Connecter une Normal Map
- Ouvrez le Shader Editor
- Ajoutez un node Image Texture
- Chargez votre normal map
- Color Space : Non-Color (crucial !)
- Ajoutez un node Normal Map (Shift+A → Vector → Normal Map)
- Connectez Image Texture → Color vers Normal Map → Color
- Connectez Normal Map → Normal vers Principled BSDF → Normal
Paramètres du node Normal Map
Strength
- 1.0 = intensité normale
- < 1.0 = effet atténué
- 1.0 = effet exagéré (peut créer des artefacts)
Space
- Tangent (par défaut, le plus courant)
- Object
- World
Inverser le canal vert (DirectX → OpenGL)
Si la normal map vient d’un logiciel DirectX :
- Ajoutez un node Separate RGB après l’Image Texture
- Ajoutez un node Invert sur le canal Vert
- Recombinez avec un node Combine RGB
- Connectez au node Normal Map
Ou plus simple : reconvertissez la texture dans Substance/Photoshop.
Créer une Normal Map
Par baking (High Poly → Low Poly)
La méthode pro pour les assets de jeu :
- Créez un modèle High Poly très détaillé
- Créez un modèle Low Poly simplifié
- Bakez les détails du high sur le low
- Le résultat est une Normal Map
Dans Blender :
- Sélectionnez le Low Poly
- Render Properties → Bake → Bake Type : Normal
- Activez Selected to Active
- Sélectionnez High Poly puis Low Poly (actif)
- Cliquez Bake
Dans Substance Painter
- Importez votre mesh avec une texture de référence
- Le logiciel génère automatiquement la normal map
- Ajoutez des détails via les brushes et smart materials
- Exportez la normal map finale
À partir d’une image (moins précis)
Des outils convertissent une image en normal map :
- Materialize (gratuit)
- CrazyBump
- Photoshop (Filter → 3D → Generate Normal Map)
- GIMP (plugin normalmap)
- Blender (node Bump converti)
Résultat moins précis qu’un vrai bake, mais utile pour du prototypage.
Procédural dans Blender
- Créez une texture procédurale (Noise, Voronoi, Brick…)
- Connectez-la à un node Bump
- Le node Bump convertit la hauteur en perturbation de normale
- Connectez Bump → Normal vers Principled BSDF → Normal
Combiner plusieurs Normal Maps
Pour superposer des détails (macro + micro détails) :
Méthode simple (Blender)
- Utilisez un node Mix en mode Overlay ou Soft Light
- Mixez les deux normal maps
- Passez le résultat dans le node Normal Map
Méthode précise (UDN Blending)
Pour un résultat mathématiquement correct :
- Séparez les canaux RGB des deux normal maps
- Additionnez R1+R2-0.5 et G1+G2-0.5
- Gardez le B de la normale de base
- Recombinez
Des nodes groups tout faits existent pour cette opération.
Erreurs courantes
Color Space en sRGB
- La normal map apparaît trop forte ou incorrecte
- Solution : toujours Non-Color
Seams visibles
- Les coutures UV créent des discontinuités
- Solution : bake avec cage, ajustez les UVs, padding suffisant
Détails inversés
- Bosses au lieu de creux (ou inversement)
- Solution : inversez le canal vert (problème DirectX/OpenGL)
Artefacts aux angles rasants
- Normal maps ne peuvent pas simuler de vraies occlusions
- Solution : combinez avec Ambient Occlusion
Silhouette plate
- La normal map ne modifie pas le contour de l’objet
- Solution : pour les gros détails, utilisez du vrai Displacement ou de la géométrie
Strength trop élevée
- Effet plastique, irréaliste
- Solution : gardez Strength entre 0.5 et 1.5
Normal Map et performances
Les Normal Maps sont très efficaces en termes de performances :
- Un mesh de 500 polygones avec normal map peut ressembler à 500 000
- Quasi gratuit en calcul (simple lookup de texture)
- Standard absolu dans les jeux vidéo
- Permet des détails impossibles à modéliser (pores de peau, gravures fines)
Résolution recommandée
| Usage | Résolution |
|---|---|
| Mobile / VR | 512 × 512 – 1024 × 1024 |
| Jeu PC standard | 1024 × 1024 – 2048 × 2048 |
| AAA / Héros asset | 2048 × 2048 – 4096 × 4096 |
| Cinéma / Close-up | 4096 × 4096 – 8192 × 8192 |
La normal map peut souvent être à plus basse résolution que l’Albedo car l’œil est moins sensible aux détails de relief qu’aux détails de couleur.