TP01 : Premiers pas (matrices et shading)

Transcription

TP01 : Premiers pas (matrices et shading)
TP01 : Premiers pas (matrices et shading)
Déplacement de la vue
Afin de pouvoir naviguer dans la scène 3D, il faut implanter les fonctions callback de gestion des évènements
du clavier pour modifier le point de vue.
Exercice :
Implémenter la possibilités de pouvoir tourner l'objet autour de son axe vertical avec un déplacement
latéral de la souris (avec le clic droit). Permettre de se déplacer autour de l'objet avec les touches Q,
S, D, Z et de s'orienter avec la souris (avec le clic gauche).
Eclairage
Shaders : toon shading
Le toon shading (encore appelé cell shading) est un calcul d’éclairage qui permet de simuler un rendu
de type dessins animés. Son principe est assez simple. La couleur d’un pixel appartenant à un objet
est calculée en fonction de l’orientation de la surface de l’objet par rapport à la source lumineuse. Un
exemple d’un tel rendu est visible sur la figure 1.
Figure 1Illustration du Toon Shading
L’orientation de la surface est donnée par le vecteur normal de la surface au pixel donné. L’angle
formé par le vecteur d’éclairage (i.e. le vecteur formé entre la position de la source lumineuse et le
point de la surface correspondant au pixel) et la normale de la surface est découpé en secteurs (3 ou
4). À chaque secteur est associé un coefficient appliqué à la couleur de l’objet.
Par conséquent, chaque sommet envoyé au vertex shader devra comporter comme attribut, en plus
de ses coordonnées, la normale de la surface en ce point. Ces variable sont définies via le mot clé in
dans le vertex shader. Chaque objet doit avoir une couleur. Cette couleur est représentée par une
variable uniforme (mot clé uniform).
Une source lumineuse doit également être définie. Elle peut être simulée par une simple direction
d’éclairage (un vecteur défini dans l’espace du monde). À partir de ces informations, le fragment
shader calcule le produit scalaire entre la normale et la direction d’éclairage.
En fonction du résultat de ce produit, il détermine la couleur du pixel courant. Pour cela, on peut suivre
l’algorithme suivant.
Variable varying:
n = vecteur normal de la surface pour le fragment courant
Variable uniform:
color_uni = couleur de l’objet courant
lightDir = vecteur représentant la direction d’éclairage
Sortie :
color_out
= couleur à écrire dans le framebuffer pour le fragment
courant
// Calcul de l’intensité d’éclairage
intensite = lightDir . n
color_out = color_uni
// Calcul de la couleur
if intensite > 0.95 then
color_out = 0.9 * color_uni
else if intensite > 0.65 then
color_out = 0.6 * color_uni
else if intensite > 0.35 then
color_out = 0.3 * color_uni
else
color_out = 0.2 * color_uni
Exercice :
Ecrire le vertex shader et le fragment shader qui permettent de réaliser le toon shading.
Phong Shading
Jusqu’à présent, nous avons rendu les objets de façon simple sans avoir d’éclairage “réaliste”. Nous
allons voir dans ce TP une façon de simuler un éclairage, un peu plus réaliste : le Phong shading.
Ce modèle d’éclairage, décompose la lumière en 3 composantes disctinctes :



ambiante, correspondant à un éclairage provenant d’une multitude de sources lumineuses et
d’inter-réflexions entre les objets ;
diffuse, correspondant à un éclairage provenant d’une sources de lumière ;
spéculaire, correspondant aux reflets lumineux sur la surface de l’objet.
Ces différentes composantes s’additionnent pour donner la couleur finale à l’objet éclairé :
Bui Tuong Phong a proposé de synthétiser cet éclairage par la formule suivante :
où










If donne l’intensité lumineuse finale (la couleur) du fragment de l’objet ;
ka donne la composante ambiante de la couleur du matériaus composant l’objet ;
kd, ks donnent les couleurs de composantes diffuses et spéculaire du matériau composant
l’objet ;
ia donne l’intensité lumineuse de la scène (la couleur de la lumière ambiante de la scène) ;
idl, isl donnent respectivement les composantes diffuse et spéculaire de la source lumineuse l
;
α donnent le coefficient de brillance (shininess) qui conditionne la reflectivitéde l’objet ;
L donnent la direction d’éclairage de la source l ;
N donnent la normale de la surface au fragment courant ;
R donnent la direction de la réflection de la lumière au fragment courant ;
V donnent la direction de vue.
Les différents vecteurs utilisés sont présentés sur la Figure 2.
Figure 2 Les données utilisées pour l'éclairage de Phong
Pour simplifier l’implantation, on autorise qu’une seule source lumineuse. Par conséquent, il faut
développer un programme de shaders utilisant les données suivantes :



les paramètres d’éclairage, en tant que variables uniformes :
– une couleur représentant l’éclairage ambiant de la scène ;
– deux couleurs représentant respectivement l’éclairage diffus et spéculaire de la
source lumineuse ;
– la position de la source lumineuse exprimée dans l’espace du monde.
les propriétés du matériau de l’objet, en tant que variables uniformes ou attributs de sommet
(au choix) :
– une couleur ambiante ;
– deux couleurs représentant la couleur diffuse et spéculaire de l’objet ;
– un réel représentant la coefficient de brillance du matériaux.
les propriétés géométriques, en tant qu’attributs de sommet :
– la position du sommet ;
– la normale de la surface pour chaque sommet.
Le calcul d’éclairage est effectué dans le fragment shader. Le vertex shader communique seulement
les données au fragment shader. Il doit donc :





transformer les coordonnées des sommets en espace image (classique) ;
calculer le vecteur de vue en transformant les coordonnées des sommets en espace du
monde1 ;
transmettre les normales au fragment shader ;
transmettre les couleurs du matériaux (si ce sont des attributs de sommets) au fragment
shader ;
calculer la direction d’éclairage en espace du monde.
Le calcul de la couleur finale s’effectue dans le fragment shader en calculant la formule de l’éclairage
de Phong décrite par la formule données précédemment.
Exercice :
Ecrire le vertex shader et le fragment shader qui permettent de réaliser le phong shading.