TP2 - M2 images

Shaders


Partie 1 : prise en main

installez gKit2 et compilez shader_kit.
par exemple pour linux :
hg clone https://bitbucket.org/jciehl/gkit2

chargez et dezippez l'archive contenant les librairies dans le répertoire courant :
https://bitbucket.org/jciehl/gkit2/downloads

vous devez obtenir la configuration suivante :
repertoire/
    bin/
    local/
        linux/
            bin/
                premake4
            include/
                GL/
                    glew.h
            lib/
                libGLEW
    gKit/
   
./local/linux/bin/premake4 gmake
make shader_kit -j4


exercice 1: transformations et dessiner un quad "plein écran"

Pour exécuter un fragment shader sur tous les pixels de l'image, il est nécessaire de dessiner un rectangle, ou un triangle, qui couvre la totalite des pixels de l'image.

Dans quel espace est-il le plus simple de déterminer les coordonnées des sommets du triangle / rectangle ?
Quelle transformation utiliser ?

Ecrivez le fichier .obj représentant le rectangle / triangle "plein écran" et un shader program permettant de le dessiner avec une couleur constante.

Testez l'ensemble en utilisant : ./shader_kit shader.glsl -m fsquad.obj


Remarque :
syntaxe fichier .obj
un fichier .obj est un fichier texte avec une structure tres simple : il est compose d'une ligne par sommet et d'une ligne par face.

décrire la position d'un sommet :
v x y z
décrire la normale d'un sommet :
vn x y z
décrire les coordonnées de texture d'un sommet :
vt u v

pour décrire un rectangle, il suffit d'indiquer les indices des positions de ses sommets abcd :
f a b c d

de meme pour un triangle abc :
f a b c

ce qui donne, pour un triangle complet :
v Ax Ay Az
v Bx By Bz
v Cx Cy Cz
f 1 2 3

Remarque : syntaxe des fichiers .glsl de gKit
tous les shaders du program sont écrits dans le même fichier, le bon shader est compilé en utilisant le pre-processeur :

#version 330

#ifdef VERTEX_SHADER

void main( void )
{
    gl_Position= { .... };
}
#endif

#ifdef FRAGMENT_SHADER
out vec4 fragment_color;

void main( void )
{
    fragment_color= { ... };
}
#endif

// GEOMETRY_SHADER, CONTROL_SHADER, EVALUATION_SHADER, COMPUTE_SHADER

les matrices de transformations usuelles sont également définies et accessibles :
// transformations classiques :
uniform mat4 mvpMatrix;                     // uniform matrice transformation complete : model, view et projection

uniform mat4 mvMatrix;                      // uniform matrice transformation model * view
uniform mat4 normalMatrix;                  // uniform matrice transformation model * view pour les  normales

// et les autres transformations standards ainsi que leurs inverses :
uniform mat4 modelMatrix;
uniform mat4 modelMatrixInv;
uniform mat4 viewMatrix;
uniform mat4 viewMatrixInv;
uniform mat4 projectionMatrix;
uniform mat4 projectionMatrixInv;
uniform mat4 viewportMatrix;
uniform mat4 viewportMatrixInv;

in vec3 position;       // attribut pre declares
in vec3 texcoord;      
in vec3 normal;        

exercice 2 : damier

Modifiez le fragment shader précédent pour dessiner une grille / damier.
Comment choisir la taille des cellules ?

remarque: utilisez gl_FragCoord.xyz pour connaitre la position du fragment dans le repère image.



exercice 3 : texture procédurale

Utilisez shader_kit pour charger un objet .obj quelconque et plaquez le damier dessus.
par exemple ./shader_kit damier.glsl -m bigguy.obj

Il faudra également penser à modifier le vertex shader afin de calculer la projection des sommets de l'objet.

Vous pouvez utiliser les positions des sommets dans le repere local de l'objet, ou dans le repere du monde, ou dans le repere de la camera, ou dans le repere image pour construire le damier (qui deviendra du coup plutot une texture "solide").

quelles sont les différences avec la solution précédente ? comment le fragment shader peut-il accéder aux positions des sommets / des fragments ?

exercice 4 : texture

Chargez également une (ou plusieurs) texture dans shader_kit et modifiez l'apparence de l'objet.
./shader_kit shader.glsl -m model.obj -t texture0.png -t texture1.png ...

il est également possible de charger les textures a posteriori avec un drag&drop dans le champ textureXXX correspondant, accessible dans l'interface graphique, panneau 'assets'.


exercice 5 : texture environnement / toon shader

Utilisez une texture avec une paramétrisation polaire (type latitude-longitude) pour modifier la couleur de l'objet en fonction de son orientation.
le plus simple est de convertir une direction en angles theta/phi et d'utiliser directement ces valeurs pour accéder à la texture.