M2PRO - Images
Année 2008-2009


TP2 - encore des shaders,

ou,

tout ce que vous ne vouliez pas savoir sur le pipeline fixe ...


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 - de la 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



Partie 4 - plus de matières

    On décrit généralement la matière d'un objet comme une somme pondérée de comportements simples : diffus et réfléchissant (ou glossy) ou réfléchissant et miroir. Les schémas suivant illustrent l'effet des matières sur la réflexion de la lumière :
  1. pour les objets diffus : la lumière incidente est réfléchie dans toutes les directions autour de l'objet,

    reflexion diffuse



  2. pour les objets réfléchissants : la lumière incidente est entièrement réfléchie autour d'une direction particulière,

    matière réfléchissante



  3. pour les miroirs : la lumière n'est réfléchie que dans une seule direction, la direction "miroir",  calculée par la fonction miror()

    Vous avez déjà écrit le comportement diffus dans la partie 3, il ne reste plus qu'à réaliser les comportements réfléchissant et miroir.

comportement réfléchissant :

    La manière la plus simple de calculer le comportement réfléchissant est de calculer le vecteur H et de renvoyer : dot(N, H)c. L'exposant c permet de régler "la taille" du faisceau de lumière réfléchie. Plus l'exposant est grand plus le reflet sera petit à la surface de l'objet. En général, c est compris entre 1 et 100.

comportement miroir :

    Le plus simple est d'utiliser la même formulation que pour le comportement réfléchissant, mais avec un exposant plus important : de l'ordre de 128 ou 256. par contre, un phénomène important n'est pas simulé, plus la lumière est rasante plus le miroir réfléchit.
On peut introduire ce phénomène simplement : constante + (1 - constante) * (1 - dot(N, H)5).
Les explications détaillées sur la construction de cette approximation : "An inexpensive BRDF model for physically-based rendering"



remarque : une source n'éclaire pas une surface non orientée vers elle, comment détecter simplement ce cas ?



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