M2 - Images

TP 2 - Shaders


Partie 1 : prise en main

Q1. écrivez un vertex shader qui donne une couleur constante à tous les sommets qu'il traite. L'application doit pouvoir modifier la couleur.

Q2. fixez les valeurs des parametres :
    quels sont les paramètres transmis par l'application ?
    comment fixer la valeur d'un paramètre float ? mat4 ?
    comment transmettre les positions des sommets ?

Q3. faut-il écrire un fragment shader ?

Partie 2 : plus de paramètres

Q1. écrivez un fragment shader qui multiplie la couleur du fragment par une autre fournie par l'application.

remarque : la couleur est utilisée par le pixel shader, comment transmettre un paramètre a ce type de shader ?
  1. que faut-il modifier dans l'application (et / ou dans les shaders) pour transmettre une couleur constante pour tout l'objet ?
  2. que faut-il modifier dans l'application (et / ou dans les shaders) pour transmettre une couleur pour chaque sommet ?

Partie 3 : lumière !

Q1. modifiez votre/vos shader/s pour représenter la position d'une source de lumière ponctuelle ainsi que sa couleur. Faut-il utiliser un paramètre uniform ? ou un attribut de sommet ?


notations calculs eclairage

Q2. calculez la lumière réfléchie par l'objet (cf. TP lancer de rayons) :

    La physique fournit une solution simple : selon l'orientation de la surface sur laquelle le point P se trouve, le point P ne reçoit pas la même quantité d'énergie : elle est maximale lorsque la normale au point P est orientée vers la source de lumière et décroit proportionnellement au cosinus de l'angle (entre la normale et la direction de la source) dans les autres cas. Ce qui se résume à calculer dot(N, L) pour N et L unitaires, cf. le schema pour l'orientation et la signification des vecteurs N et L.
  1. dans quel shader faire le calcul ? y aurait-il des différences entre le résultat calculé par le vertex shader et celui obtenu avec un fragment shader ?

  2. dans quel repère travailler ? pour évaluer dot(N, L), les 2 vecteurs doivent se "trouver" dans le même repère, lequel ?
  3. quelles sont les coordonnées du point P ? dans quel repère ?
  4. quelles sont les coordonnées de la source de lumière ? dans quel repère ? comment calculer le vecteur L ?
  5. quelles sont les coordonnées de l'oeil / comment calculer V ? dans quel repère ?
  6. il faut connaitre la normale de la surface au point P, un point quelconque des triangles dessinés, comment l'obtenir ?
  7. comment tenir compte de la couleur de la source de lumière ? de la couleur de la matière associée à la surface ? comment transmettre ces propriétés au(x) shader(s) ?
Q3. écrire un shader correspondant à l'autre solution (calculs dans le vertex shader ou calculs dans le pixel shader). Justifiez les différences.

remarques :
exemples :

vertex shader pixel shader
exemple : éclairage calculé dans un vertex shader
exemple : éclairage calculé dans un pixel shader

les figures de ce sujet sont issues de : "the Cg tutorial", nvidia.