Brett Ridel

About Me

-
Publications
-
Teaching
-
The Revealing Flashlight

TD4 - Sources étendues et Path Tracing

1. Sources étendues
Téléchargez l'arichive areaLight.zip et intégrez à votre code la classe AreaLight représentant une source lumineuse étendue carrée. Complétez sa méthode calculant l'intensité émise depuis le point \(y\) sur la source vers le point \(x\) de la scène :
Color3f AreaLight::intensity(const Point3f &x, const Point3f &y) const
1.1. Échantillonnage de Monte-Carlo
Modifiez l'intégrateur de Whitted pour tirer un rayon d'ombre dans une direction aléatoire vers la source étendue. Pour déterminer cette position, utilisez les vecteurs unitaires AreaLight::uVec et AreaLight::vVec ainsi que la position et la taille de la source. Notez que l'on peut détecter qu'une Light est une AreaLight avec un dynamic_cast :
1
2
3
4
5
6
7
8
9
 if(dynamic_cast<const AreaLight*>(lights[i]))
 {
     const AreaLight* light =  dynamic_cast<const AreaLight*>(lights[i]);
     // source étendue
 }
 else
 {
     // lampe ponctuelle ou directionnelle
 }
Vous devriez obtenir ce résultat pour la scène "tw_area.scn" :
arealight
Échantillonnage stratifié – 16x16 rayons par pixel
Testez également avec la scène "killeroo_area.scn" :
killeroo
Échantillonnage stratifié – 32x32 rayons par pixel
1.2. Source texturée
La dernière étape consiste à moduler l'intensité de la source étendue par la texture light_source.exr. Pour cela, modifiez AreaLight::intensity pour accéder à l'attribut Bitmap m_texture. Ajoutez également la ligne suivante au fichier de scène :
<light type="areaLight">
  <string name="texture" value="light_source.exr" />
  <!-- le reste est identique -->
</light>
Avant de tester, essayez de prédire quel sera le résultat ...afficher le résultat :
coloredLight   coloredLight2
Échantillonnage stratifié (32x32) – source étendue texturée
1.3. Bonus : échantillonnage stratifié
Les ombres douces générées sont très bruitées car, si l'échantillonnage des pixel est stratifié, celui de la source étendue est purement aléatoire. À titre de comparaison, implémentez l'échantillonnage stratifié de la lampe en tirant nxn rayons d'ombres sur une grille avec du jittering. Pour que la comparaison des ombres soit juste, n'utilisez qu'un rayon par pixel.

Vous devriez obtenir ce résultat pour "tw_area.scn" :

arealight
Échantillonnage stratifié – 16x16 rayons d'ombre

...et pour "killeroo_area.scn" :

killeroo
Échantillonnage stratifié – 32x32 rayons d'ombre

Il est évidemment possible de combiner les deux approches, puis d'ajuster le nombre d'échantillons par pixel et par source étendue pour obtenir la qualité souhaitée.

2. Path Tracing
L'algorithme de path tracing a pour objectif d'intégrer (au sens de Monte-Carlo) les différents termes de l'équation du rendu : pour calculer l'éclairage direct par les sources étendues, pour évaluer l'éclairage indirect pondéré par les BRDF, pour réaliser l'intégration sur un pixel. Sa particularité est de faire débuter l'échantillonnage uniquement depuis les pixels.

Votre code implémente déjà cette intégration sur le pixel (anti-aliasing) et pour l'éclairage direct (source étendue). Pour prendre en compte l'éclairage indirect, il vous suffit d'ajouter l'échantillonnage de la BRDF du TD3. En pratique, créez un nouvel intégrateur PathTracer basé sur celui de Whitted où vous lancerez un rayon secondaire (appel récursif à Integrator::Li) dans la direction indiquée par l'importance sampling de la BRDF.

Testez sur la scène "box.scn", vous devriez obtenir les résultats suivant :

path tracing   path tracing
20 chemins (gauche) et 400 chemins (droite) par pixel

L'utilisation d'un critère d'arrêt arbitraire sur la profondeur de l'arbre des rayons n'est pas satisfaisante (cela introduit un biais dans l'intégration). Mettez en œuvre un mécanisme de roulette Russe pour y remédier. Vous pouvez utiliser la couleur ambiante moyenne du matériau comme coefficient d’absorption.

Remerciements

Ce projet est basé sur celui de Pierre Bénard.