Brett Ridel

About Me

-
Publications
-
Teaching
-
The Revealing Flashlight

TD2 - Maillage triangulaire et anti-aliasing

1. Mise en route
L'objectif de ce TD est de rajouter la gestion des maillages triangulaire. Cela va permettre de gérer des scène beaucoup plus complexes. Plus précisément, vous implémenterez le calcul d'intersection avec des maillages triangulaires.

Afin de commencer dans de bonnes conditions, téléchargez l'archive sire_correction_td2.zip qui contient une correction partielle du TD précédent. La méthode RenderingWidget::render a été modifiée pour permettre la génération en parallèle des rayons primaires par blocs de 32x32 pixels. L’intégrateur de Whitted inclut la gestion des rayons d'ombres, des réflexions et réfractions. Une structure accélératrice de type BVH à été ajoutée. Enfin, le fichier "ray.h" contient une fonction de calcul d’intersection entre un rayon et une boîte alignée sur les axes Eigen::AlignedBox3d :

'; highlight_xml($xml_str); ?>

Charger le fichier de scène "tw.scn" et effectuer son rendu. Vous devriez obtenir l'image suivante :

AABB
2. Maillages triangulaires

Commencez par étudier le code d'intersection avec un plan infini (Plane::intersect). Le cas du triangle est un peu plus complexe, utilisez la méthode de Möller-Trumbore pour l'implémenter (référez-vous au cours). Les deux faces d'un triangle jouent-elles le même rôle ? À vous de choisir...

Maillage

Pour raytracer un maillage complet, vous devez décommenter une partie du code de Mesh::intersect puis compléter la méthode Mesh::intersectFace. La palette des scènes affichables s'en trouve alors bien élargie, mais au prix d'un temps de calcul croissant.

3. Anti-aliasing
Le bord des objets et des ombres dures montre clairement des problèmes d'aliasing. Pour y pallier, il vous faut lancer plusieurs rayons par pixel et moyenner leur contribution. Modifiez la méthode RenderingWidget::renderBlock pour qu'elle lance plusieurs rayons par pixel, par exemple à travers une grille régulière nxn placée dans chaque pixel. n correspondra au paramètre samples de la caméra dans le fichier de scène.

Dans un premier temps, Utilisez une méthode d'échantillonnage strifiée pour générer les nxn rayons par pixel. Vous pouvez utiliser la fonction Eigen::internal::random(a,b) pour obtenir un nombre aléatoire entre a et b.

killeroo   killeroo
Échantillonnage stratifié - 1x1 et 32x32 rayons par pixel (petanque.scn)

On peut également améliorer les résultats en pondérant la contribution des rayons correspondant à un pixel par un filtre, par exemple par noyau gaussien (centré sur le centre du pixel). Il est plus souple de coder une classe Filter qui donnera les poids ainsi que les décalages (par rapport au centre du pixel) associés à chaque rayon.

La scène "deuxSpheres.scn" est particulièrement difficile en raison de la texture en damiers du plan infini :

2x2   8x8 32x32   128x128
Échantillonnage stratifié - 2x2, 8x8, 32x32 et 128x128 rayons par pixel (deuxSpheres.scn)

Remerciements

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