M2 - Images

TP 2 - Lancer de rayons
et éclairage global




documents à remettre le 17/12/2010

Envoyez en utilisant le mail de l'université une archive des sources de votre tp ainsi qu'un rapport de quelques pages justifiant vos methodes de calculs. Vous apporterez un soin particulier à décrire les différentes intégrations, les densités de probabilités utilisées et les méthodes de tirages aléatoires associées.

Vous préciserez vos noms, prénoms et numéros d'étudiants dans le corps du mail.



mise à jour de gKit 30/11/2010 : lecture correcte des matieres tp1_b9.tar.gz
le plus simple est de récuperer dans l'archive le seul fichier modifié : MeshOBJ.cpp et de le copier dans votre répertoire de travail.



L'objectif de ce tp est de mettre en place les éléments nécessaires pour une simulation "correcte" de l'éclairage indirect.

Utilisez les scenes de test suivantes, elles sont composées de très peu de geométrie (triangles), ce qui permet d'éviter de construire un arbre bvh pour accélérer les calculs de visibilité (au moins dans un premier temps ...) :

Partie 1 : mise en jambe

exercice 1 : intégration numérique et Monte Carlo.

Calculez une intégrale simple avec la méthode de Monte Carlo :

Commencez par utiliser des échantillons distribués uniformement, puis utilisez des échantillons distribués selon une densité de probabilité adaptée à la fonction f( ).
Comment générer des directions uniformes sur une (hemi-) sphère ?
Utilisez une fonction simple dont le résultat est connu et vérifiez que le résultat de l'estimation converge vers la solution.

Parcourez "Global Illumination Compendium" pour trouver quelques fonctions à tester ainsi que les densités de probabilités adaptées et la méthode de choix d'échantillons distribués selon la densité de probabilité choisie.

Combien d'échantillons sont nécessaires dans chaque cas ?



Partie 2 : lancer de rayons et visibilité

exercice 1 : visualisation par lancer de rayons

Pour chaque pixel de l'image résultat, déterminez les coordonnées de l'origine du rayon dans le repère de la scène, ainsi que celles de son extrémité.

remarque : gk::Ray permet de représenter et de manipuler facilement un rayon.

Puis calculez l'intersection du rayon avec tous les triangles de la scène (utilisez gk::MeshIO::read( ) pour la charger) et ne conservez que la plus proche de l'origine du rayon.
remarque: gk::Hit permet de représenter simplement une intersection, les fonctions d'intersections rayon / triangle et rayon / bbox sont déjà écrites : gk::Triangle::intersect( ) et gk::BBox::intersect( ).

Dans quel espace est-il le plus simple de calculer l'origine et l'extrémité du rayon ?


Partie 3 : éclairage direct


    éclairage direct, 1 échantillon    éclairage direct, 100 échantillons    éclairage direct, 500 échantillons

Identifez les sources de lumières présentes dans la scène, elles sont associées à une matière nommée "diffuseLuminaire1SG", utilisez m_diffuse de gk::MeshMaterial comme énergie émise par la source. Il suffit de parcourir l'ensemble de triangles et de récupérer leur matière avec gk::Mesh::triangleMaterial( ).


exercice 1 : 1 source

Pour déterminer l'éclairage d'un point du à une source "étendue", il faut générer des points à la surface de la source.
Comment choisir uniformément des points à la surface d'un triangle émettant de la lumière ?


exercice 2 : plusieurs sources

On souhaite maintenant calculer rapidement l'éclairage direct du à un "grand" nombre de sources de lumière.
Au lieu de calculer l'éclairage direct du à chaque source, on considère l'union des sources comme une seule source de lumière. Il ne reste plus qu'à choisir aléatoirement, et uniformément, un point à la surface de cette "source", comment faire ?

Testez et vérifiez votre méthode de sélection avec une scène construite pour tester ce cas précis : emission.obj

éclairage direct avec 202 sources

exercice 3 : améliorations

Proposez une meilleure solution pour choisir la source à échantillonner.

remarque : on peut sélectionner une source proportionnellement à l'énergie quelle peut émettre vers un point connu.


exercice bonus : matières réfléchissantes

Modifiez les matières de certains objets afin d'utiliser une brdf (très) réfléchissante (cf. modèle de Blinn-Phong). Que se passe-t-il ? pourquoi ? proposez une amélioration.

Comment intégrer le modèle de matière réfléchissante "Phong" ou "Blinn-Phong" ? les détails sont dans :
"Using the Modified Phong Reflectance Model for Physically Based Rendering"
Eric P. Lafortune,  Yves D. Willems, 1994


Partie 4 : éclairage indirect


    éclairage direct + indirect, 100 échantillons    éclairage direct + indirect, 500 échantillons


exercice 1 : longueur de chemin fixée à R rebonds

Dans un premier temps, on choisira un seul rayon pour estimer l'éclairage direct et un autre pour estimer l'éclairage indirect.
L'éclairage direct ne sera estimé qu'avec un seul point à la surface de l'ensemble des sources de lumière (cf. partie 3, exercice 3).
L'éclairage indirect ne sera estimé qu'avec une seule direction choisie uniformément et en construisant un chemin comportant R rebonds. R sera fixé à 3, par exemple.

Pour obtenir une image de qualité correcte, il faudra cependant générer plusieurs chemins par pixel. Le plus simple est de modifier la construction du rayon pour pouvoir en générer plusieurs par pixel.

intuition : au lieu de prendre un coin ou le centre du pixel, il suffit de choisir aléatoirement un point à l'interieur du pixel.

exercice 2 : longueur variable, roulette russe

Modifiez la construction du chemin pour terminer le chemin lorsque sa longeur est supérieure à R.
Proposez d'autres stratégies plus adaptées aux matières des différents rebonds du chemin, ou la quantité d'énergie pouvant "circuler" sur le chemin.


Testez vos stratégies sur une scène construite dans cet objectif : secondary.obj


exercice bonus : tirage préférentiel des directions

Pour améliorer la qualité de l'estimation, il est relativement simple de modifier le choix des directions pour la construction du chemin.
Proposez un choix proportionnel à cos \theta, ou à la matière de l'objet.


Partie bonus : accélérations

Construisez un arbre bvh pour limiter le nombre d'intersections calculées.

Les détails sont dans l'article :

une version plus rapide du même algorithme est décrit dans :

une variante génère des arbres de meilleures qualité :

Partie bonus : intersection rayon - PN Triangle

Créez une scène composée de plusieurs objets décrits par des pn triangles (un bigguy posé dans geometry, par exemple).
Comment calculer l'intersection d'un rayon et d'un triangle de bezier ?