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 ?
que faut-il modifier dans l'application (et / ou dans les
shaders) pour transmettre une couleur constante pour tout l'objet ?
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 ?
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.
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 ?
dans quel repère travailler ? pour évaluer dot(N,
L), les 2 vecteurs doivent se "trouver" dans le même
repère, lequel ?
quelles sont les coordonnées du point P ? dans quel repère ?
quelles sont les coordonnées de la source de lumière ? dans quel repère ? comment calculer le vecteur L ?
quelles sont les coordonnées de l'oeil / comment calculer V ? dans quel repère ?
il faut connaitre la normale de la surface au point P, un point quelconque des triangles dessinés, comment l'obtenir ?
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 :
la matrice MODELVIEW permet de transformer les points du
repère local vers le repère camera,
quelle transformation utiliser pour les normales ?
la solution et les démonstrations sont la : "Normal Transformations"
exemples :
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 :
pour les objets diffus : la lumière incidente est réfléchie dans toutes les directions autour de l'objet,
pour les objets réfléchissants : la
lumière incidente est entièrement réfléchie
autour d'une
direction particulière,
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.