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 sampler2D 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.