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 ...)
:
matières nécessaires
pour charger les scènes de test.
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
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
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.
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.
une version plus rapide du même algorithme est décrit dans
:
"On fast Construction of SAH
based Bounding Volume Hierarchies"
Ingo Wald
Eurographics/IEEE Symposium on Interactive Ray Tracing, 2007
pdf
une variante génère des arbres de meilleures
qualité :
"Spatial Splits in Bounding
Volume Hierarchies"
Martin Stich, Heiko Friedrich, Andreas Dietrich
High-Performance Graphics 2009, August 2009
pdf
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 ?