Normal Mapping

Motylek
Normal Mapping
1 - Introduction
Le Normal Mapping (appelé aussi Bump Mapping) est une technique
d’éclairage par pixel. Elle repose sur le Modèle d’éclairage de Blinn-Phong
dans lequel on va déformer « la normal » à la surface N pour donner l’effet
d’un relief.
Le vecteur Normal est obtenu via la « Normal-Map », une
texture blueté dans laquelle la couleur RVB représente la
Normal à la surface.
surface
2 - Eclairage de Blinn-Phong
Blinn
L = Direction de la lumière
N = Normale a la surface
Eye = Direction de l’observateur
R = reflet de la lumière par rapport à
la Normale.
Li = - L (vecteur)
b = Coefficient de brillance (shininess)
M = Material
Motylek
•
Composante diffuse :
o La lumière est réfléchie uniformément dans toutes les directions
o Dépend de l’incidence
o Intensité : modulée par « N.Li » (cos de l’angle N et Li)
Id = Ld * Md * Cos (θ)
•
Composante Ambiante :
o La lumière des parties cachées
o Ambiant Global + Ambiant
o Intensité ambiante :
Ia = Ga * Ma + La * Ma
•
Composante Spéculaire (Blinn) :
o Ici le calcul du reflet est important on va donc utiliser la formule
suivante au lieu de celle de Blinn-Phong
Blinn Phong qui utilise le vecteur H
(Half Vector).
Is = (R.Eye
(R.Eye)s * Ls * Ms
•
Coefficient d’atténuation :
o Ce coefficient est constant pour tous les vertex si on souhaite
avoir une lumière directionnelle att = constante.
constante
o Si on souhaite avoir une lumière « ponctuelle » on calcul ce
coefficient de la manière suivante :
att = 1 / (k0 +k1*d + k2*d2)
avec
K0 : atténuation constante
K1 : atténuation linéaire
K2 : atténuation quadratique
d : Distance [Vertex – Source Lumineuse
•
Couleur du Pixel :
Color = Ambiant Global + att (Ambiant + diffuse + spéculaire)
Motylek
3 - L’espace Tangent
Une fois que le modèle d’éclairage est mis en place il suffit de remplacer
la normale à la surface par le vecteur Normal de la « Normal-Map
Normal
» qui
n’est rien d’autre que la couleur de la texture.
Le seul bémol c’est que les vecteurs Normaux stockés dans la « NormalMap » sont exprimé dans le repère Tangent, alors
lors que tous les autres
vecteurs (Lumière, position …) sont exprimés dans le repère Camera.
Camera
•
•
Le repère Tangent est constitué par :
o Origine = position du Vertex
{0.0 , 0.0 , 0.0} RTangent
o Vecteur Tangent
Ta
{1.0 , 0.0 , 0.0} RTangent
o Vecteur Binormal
Bi
{0.0 , 1.0 , 0.0} RTangent
o Vecteur Normal
No
{0.0 , 0.0 , 1.0} RTangent
Dans le repère Camera on a:
a
o Position du Vertex
{v.x , v.y , v.z}R
RCamera
o Vecteur Normal
{n.x , n.y , v.z}R
v.z} Camera
o Vecteur Direction Lumière L
{l.x , l.y , l.z}RCamera
Il nous faut maintenant calculer le Vecteur Tangent ainsi que le Vecteur
Binormal dans le repère Camera afin de constituer le repère Tangent.
Tangent
(Calculs
Calculs de ces vecteurs voir Bibliographie Calcul de l’espace tangent)
tangent
Le but est donc d’exprimer
d’exprimer tous les autres vecteurs (comme le vecteur
direction de la lumière, le vecteur direction de l’observateur …) dans le
repère Tangent afin que les calculs (Produit
uit scalaire principalement)
aient un sens.
Le calcul Matriciel suivant nous montre comment passer le vecteur
U(X_(Rc), X_(Rc), X_(Rc)
(Rc)) exprimé dans le repère Camera (Rc) au repère
Tangent (Rt) :
|X_(Rt)|
| Ta_X(Rc)
Ta_Y(Rc) Ta_Z(Rc) |
|X
X_(Rc)|
|Y_(Rt)| =
| Bi_X(Rc)
Bi_Y(Rc)
|Y
Y_(Rc)|
|Z_(Rt)|
| No_X(Rc)
No_Y(Rc) No_Z(Rc) |
Bi_Z(Rc) | x
|Z
Z_(Rc)|
Motylek
Ce calcul Matriciel peut être remplacé par 3 produits scalaires :
X_(Rt)
Y_(Rt)
Z_(Rt)
=
=
=
U(Rc) DOT Ta(Rc)
U(Rc) DOT Bi(Rc)
U(Rc) DOT No(Rc)
4 - Résultats
• TeaPot :
+
Motylek
• Mur :
+
• Planete Mars :
+
Motylek
5 - Bibliographie
•
Cours Master2 IAMI
http://www.irit.fr/~Mathias.Paulin/IUP
http://www.irit.fr/~Mathias.Paulin/IUP-SI/M2/4-glsl.pdf
•
GLSL Tutorial
http://www.lighthouse3d.com/opengl/glsl/index.php?intro
•
Bump Mapping avec le GLSL
http://www.ozone3d.net/tutorials/bump_mapping.php
•
Calcul de l’espace Tangent
http://www.ozone3d.net/tutorials/mesh_deformer_p2.php#tangent_space