Sujet

Transcription

Sujet
Université de Strasbourg
Logiciels et Matériels Graphiques
Master 1 ISI
Feuille de TP
TP 2 : découverte des shaders programs
1
Introduction
L’objectif de ce TP est de vous faire manipuler un shader program (vertex + fragment) pour calculer un éclairage
simpliste de type toon (cell) shading.
Exercice :
Terminer le TP précédent et en particulier le chargement et l’affichage en 3D d’un vertex buffer object.
2
Shaders : premiers pas
Dans le squelette d’application fourni pour le TP précédent, ouvrir et regarder les vertex (fichier .vert) et fragment (fichier .frag) shaders fournis.
Exercice :
1. Lire le code source et essayer de comprendre leur fonctionnement
2. Modifier le vertex shader (et le reste de l’application) pour prendre en compte une matrice de
modélisation qui déplacera l’objet. Associer les touches de direction du clavier pour translater
l’objet suivant l’axe des x et l’axe des y.
3
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.
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.
Exercice :
1
F IG . 1 – Exemple de rendu toon shader
1. Ajouter une variable normal_in dans le vertex shader
2. Ajouter un champs normalAttribLocationInShader dans la classe VBOObject
3. Utiliser la fonction glGetAttribLocation afin de récupérer l’id de l’attribut normal_in du shader
4. Dans
la
fonction
initializeObjects,
faites
en
sorte
de
normalAttribLocationInShader comme étant l’id que vous venez de récupérer
définir
5. Ajouter dans VBOObject un VBO pour le stockage des normales
6. Modifier la fonction draw afin d’utiliser ce nouveau VBO. Vous devrez notamment spécifier le fait
que ce nouveau VBO va définir l’attribut normal_in du 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).
Exercice :
1. Définir une variable uniforme dans le vertex shader permettant de gérer l’attribut de couleur de
l’objet. Attention, dans ce cas il n’est plus nécessaire de définir une couleur par sommet
2. Utiliser les fonctions glGetUniformLocation et glUniform afin de définir la couleur de l’objet
Le vertex shader doit fournir au fragment shader différentes informations :
• la position du point (implicitement donnée via gl_Position)
• la normale obtenue à partir de l’attribut du sommet courant
2
Ces informations sont envoyées au fragment shader via des variables varying définit dans le vertex shader avec le
mot clé out et in dans le fragment shader.
Exercice :
Ajouter dans le vertex et le fragment shader une variable varying permettant de faire passer l’information
de normale du vertex au fragment shader
À 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 1.
→
Variable varying : −
n ← vecteur normal de la surface pour le fragment courant
Variable uniform : color_in ← couleur de l’objet courant
−−−−−−→
Variable uniform : 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_in
// Calcul de la couleur
if intensite > 0.95 then
color_out ← 0.9 × color_in
else if intensite > 0.65 then
color_out ← 0.6 × color_in
else if intensite > 0.35 then
color_out ← 0.3 × color_in
else
color_out ← 0.2 × color_in
Algorithme 1 : Toon shading simple
Exercice :
Modifier votre vertex et fragment shader afin de rendre un objet avec un toon shading.
Tester votre programme en utilisant le vbo fourni dans le fichier bunny.h. Ce fichier contient des tableaux de données définissant les sommets d’un objets ainsi que les normales de la surface aux sommets de cet objet. Le troisième tableau contient les indices à utiliser pour rendre l’objet.
3

Documents pareils

TP01 : Premiers pas (matrices et shading)

TP01 : Premiers pas (matrices et shading) 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, l...

Plus en détail

Synthèse d`images 3/3

Synthèse d`images 3/3 • Post-processing: profondeur de champ

Plus en détail

OpenGL et GLSL - Serveur pédagogique UFR Sciences et

OpenGL et GLSL - Serveur pédagogique UFR Sciences et uniform : la variable est une donnée venant du programme OpenGL pour le vertex shader et/ou le fragment shader. (LECTURE UNIQUEMENT). attribute : indique une variable par vertex, venant du programm...

Plus en détail