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.
Documents pareils
Sujet
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 e...