Rendu temps réel en présence de milieux participants

Chef d'oeuvre M2IM

Nous sommes trois étudiants en deuxième année de master Informatique à l'université Paul Sabatier. Pour conclure cette derniè, nous avons du ré un projet de fin d'études, appelé Chef d'oeuvre. Le but était de réaliser un démonstrateur technologique et ainsi mettre en application tout ce que nous avons pu apprendre. Nous devions implémenter le papier suivant :

Real-Time Volumetric Shadows using 1D Min-Max Mipmaps

Ce papier décrit une méthode d'évaluation de la diffusion de la lumière dans un milieu participant (par exemple, du brouillard). Ce phenomène est fréquemment présent (à certains niveaux) dans la nature mais est le plus souvent visible lorsque les rayons du soleil traverse les nuages. C'est ce qu'on appelle les "rayons de dieux" ("ray of god").

demo
Fonctionnement
L'algorithme comporte 6 grandes étapes

La première étape consiste à rendre la scène dans deux cartes de profondeurs : une du point de vue de la caméra ("depth map") et une autre du point de vue de la lumière ("shadow map").

La seconde étape transforme la shadow map afin de permettre un accès efficace aux informations de visibilités. Pour cela on effectue une rectification épipolaire. On assigne, à chaque point de l'espace, des coordonnées (α,β,γ) de telle sorte que les rayons de la caméra puissent être indexés par (α,β) et les rayons de la lumière puissent être indexés par (α,γ).

Ensuite, on voudrait effectuer un maximum de terme dans l'équation de diffusion du milieu ("scattering"). On s'aperçoit qu'un certain nombre de termes de l'intégrale ne dépendent pas de la visibilité (β) mais seulement de la direction de la vue et de la lumière (α et γ). On échantillone les termes qui ne dépendent que de α et γ dans un matrice (de taille 64x64). On utilise la SVD pour décomposer cette matrice en valeurs et vecteurs propres, ce qui nous permettra d'économiser certains calculs lors de la détermination des segments de rayons visibles par la lumière.

Il est intéressant de remarquer que chaque ligne de la shadow map rectifiée correspond à un rayon de vue, c'est-à-dire ce dont on veut déterminer la visibilité en chaque point. Il est donc possible d'utiliser une structure accéleratrice pour accelérer la détermination des segments visibles par la lumière. On construit donc un arbre min-max pour chaque ligne.

Finalement, pour chaque point dont on veut calculer la luminance, il ne nous reste plus qu'à calculer la diffusion entre ce point et la caméra. Connaissant la direction du rayon de vue (α) et la position du point, on peut simplement parcourir l'arbre min-max correspondant. Les vecteurs propres correspondant à la matrice échantillonée plus tôt permettent de remplacer des calcul lourd (exponentiel) par un simple produit vectoriel.

La dernière étape est un cas particulier : si le rayon est proche (ou sur) l'écran, on utilise du "ray marching" classique (brute-force).

Rapports
Correspondant aux différentes phases du projet