TP3 - M2 images
Eclairage direct, matières, shaders et
application.
Partie 1 : shader
Utilisez shader_kit pour tester vos shaders.
exercice 1 : matière diffuse.
Ecrivez un shader program permettant d'afficher un objet avec une
matière (colorée) diffuse.
Vous aurez besoin de connaitre la position et l'émission d'une
source de lumière (ponctuelle, pour commencer).
Le calcul se résume à l'évaluation d'un cosinus. Utilisez la version
vectorielle: cos angle(n, l)= max(0, dot(n, l));
Dans quel repère est-il possible de faire le calcul ?
Dans quel repère connaissez vous les positions des sommets et leurs
normales ? Comment les transformer dans le repère de calcul ?
Dans quel repère connaissez vous la position de la source de lumière
?
Rappel : la formulation du cosinus de l'angle entre 2
vecteurs suppose que les vecteurs sont de longueur 1...
Dans quel shader faire le calcul ? est ce que le résultat est le
même ?
Comment transférer des "informations" entre le vertex shader et le
fragment shader ?
exercice 2 : matière réfléchissante.
Meme exercice avec une matière réfléchissante.
Vous aurez besoin de connaitre la position de la camera. Dans quel
repère cette position est elle directement connue ?
exercice 3 : et avec une texture ?
Ajoutez une texture stockant une couleur diffuse (ou une autre
propriété de la matière).
Rappel : déclaration d'une "texture" dans le shader :
uniform sampler
2D texture0;
utilisation :
vec4 color= texture( texture0,
vec2(coordonnees_textures) );
Comment le fragment shader peut-il connaitre les coordonnees de
texture associées aux sommets du triangle ?
pour les curieux : et avec une envmap ?
on peut également utiliser une texture cube pour décrire la
lumière incidente dans chaque direction autour d'un point de
l'objet.
mais il reste un probleme à régler, comment calculer rapidement
la lumière réfléchie (sans parcourir tous les pixels de la texture
cube) ?
une solution simple est présentée dans l'article :
"Plausible
Blinn-Phong Reflection"
M. McGuire, D. Evangelakos, J. Wilcox, S. Donow, M. Mara, 2013
Partie 2 : application
exercice 1 :
Ecrivez une application permettant d'afficher un objet en utilisant
les shaders de la partie 1.
Vous pouvez ré-utiliser tutorial3.cpp
et tutorial4.cpp
comme code de départ.
exercice 2 : et avec plusieurs sources ?
Modifiez votre programme et le fragment shader pour calculer
l'éclairage du à plusieurs sources de lumière.
Le simple simple consiste à déclarer plusieurs tableaux dans le
fragment shader :
uniform vec3 light_positions[100];
uniform vec3 ligh_emissions[100];
et d'utiliser glUniform3fv( ) pour les initialiser,
ou gk::ProgramUniform( "light_positions", const
std::vector<gk::Vec3>& ) déclaré dans GL/GLUniforms.h
exercice 3 : et avec un uniform buffer ?
Il est également possible de déclarer une structure Light et un
tableau de structures :
struct Light
{
vec3 position;
vec3 emission;
}
uniform Light lights[100];
vous pouvez utiliser les types alignés prédéclarés dans
GL/GLSLUniforms.h pour initialiser les uniforms, par exemple :
gk::glsl::vec3, gk::glsl::vec4, etc.