Médias Participatifs en Ray Tracing
Auteur : Samuel Fournier
Numéro d'étudiant : 20218212
Cours : IFT 3150 - Cours Projet
Professeur : Dr. Pierre Poulin
Date : 22 décembre 2024
Pour la version anglaise de ce document, veuillez visiter le lien suivant : Summary of Final Project
Pour le site web du projet, veuillez visiter le lien suivant : Site Web du Projet
Pour accéder au code source complet, veuillez visiter le lien suivant : Dépôt GitHub
Pour le rapport complet, veuillez visiter le lien suivant : Rapport Complet
Ce projet s’inscrit dans le cadre du cours IFT 3150 et vise à étendre les capacités d’un ray tracer rudimentaire en lui ajoutant la possibilité de rendre des médias participatifs. En d’autres termes, il permet la représentation réaliste de la fumée (ou de tout autre médium volumétrique). Le travail s’appuie sur les concepts abordés durant la session d’hiver 2024, tels que l’implémentation de primitives de base (sphères, plans, triangles, etc.) et de modèles d’éclairage (par ex. Blinn-Phong).
Le principal défi consiste à gérer l’interaction de la lumière avec un médium qui n’est pas un objet rigide, mais plutôt un ensemble de voxels — chaque voxel représentant un échantillon de la densité volumétrique (ex. fumée). La difficulté réside dans la modélisation de l’absorption, de la diffusion et, potentiellement, de l’émission de la lumière au sein de ce volume.
Il existe une grande variété de méthodes pour le rendu de scènes 3D, comme celles que j’ai utilisées. Parmi elles, l’algorithme de ray tracing est un choix populaire en raison de sa capacité à produire des images réalistes.
Le ray tracing simule la propagation des rayons lumineux dans une scène 3D. Au lieu de lancer les rayons depuis la source de lumière, on les fait partir de la caméra (principe de Helmholtz). Pour chaque pixel de l’image finale, on calcule l’intersection entre le rayon et les objets dans la scène, puis on applique un modèle d’éclairage pour déterminer la couleur visible. Dans ce projet, le modèle d’éclairage utilisé est principalement Blinn-Phong.
L’algorithme de base se déroule comme suit :
ray_depth
).
Dans ce projet, l’extension principale consiste à gérer un média participatif le long du chemin du rayon, afin d’évaluer l’absorption et la diffusion dans ce volume.
Le média participatif implémenté ici peut être considéré comme de la fumée, représentée dans un cube subdivisé en une grille de voxels. Chaque voxel possède une densité pouvant être générée de différentes manières : densité constante, gradient linéaire ou exponentiel, bruit de Perlin, etc. Selon la valeur de la densité, la quantité de lumière qui le traverse est plus ou moins atténuée.
Pour déterminer si un rayon pénètre (et où) dans le volume, on calcule
son intersection avec les faces du cube
(x=0
, x=1
, y=0
, y=1
,
z=0
, z=1
). Les valeurs du paramètre t
correspondant à ces faces nous permettent d’identifier le
point d’entrée (tMin
) et le
point de sortie (tMax
) du rayon dans le cube.
Dans certains cas, nous pouvons rencontrer des situations particulières :
tMin
est négatif). Nous commençons donc
directement dans le volume.
-0.0
. Bien que traitée comme 0,
la division par -0.0
ne donne pas le même
résultat qu’une division par 0.0
en raison
du signe négatif.
Une fois le volume intercepté, nous devons l’échantillonner pour calculer l’absorption et la diffusion. Pour ce faire, nous devons traverser la grille. Deux approches ont été implémentées :
Dans les deux cas, à chaque échantillon (ou pas), on détermine la densité et on modélise l’interaction avec la lumière.
L’atténuation de la lumière dans un médium se base principalement sur la loi de Beer-Lambert :
T = exp(-d · σ · density)
Pour rendre les résultats plus réalistes, nous devons prendre en compte:
σa
) :
une partie de la lumière est absorbée et transformée
(par ex. en chaleur).
σs
) :
la lumière est déviée hors de la direction originale.
σs
) :
la lumière en provenance d’autres directions est déviée
vers la caméra.
La formule d’atténuation devient donc
T = exp(-d · (σa + σs) · density)
,
où density
est la densité volumétrique au point échantillonné.
Une fonction de phase est utilisée pour modéliser
la direction de la diffusion. Le type le plus simple est
la fonction de phase isotrope, qui répartit la lumière
uniformément dans toutes les directions. Sa formule est :
piso = 1 / (4π)
où piso
représente la probabilité
de diffusion dans une direction donnée.
L’autre catégorie de fonctions de phase est constituée des fonctions anisotropes, qui favorisent une direction particulière. La fonction utilisée dans ce projet est la fonction de phase de Henyey-Greenstein, définie par :
phg = (1 - g2) / (4π(1 + g2 - 2gcosθ)3/2)
où phg
est la probabilité de diffusion
dans une direction donnée, g
est le facteur
d’asymétrie (compris entre -1
et 1
),
et θ
est l’angle entre le rayon caméra et le rayon lumineux.
À chaque étape le long du rayon, nous devons évaluer la quantité
de lumière en provenance des différentes sources. Pour cela,
nous lançons un rayon en direction de chaque lumière et calculons
la transmittance (lightTransmittance
) au point considéré.
Nous appliquons ensuite la fonction de phase pour déterminer
la fraction de cette lumière redirigée vers la caméra.
La Russian Roulette peut être employée afin d’interrompre le calcul lorsque la transmittance devient très faible, évitant ainsi de gaspiller du temps de calcul dans des zones presque opaques. Si le test aléatoire échoue, on multiplie la transmittance résiduelle pour compenser et on poursuit le calcul.
shade()
Auparavant, la fonction shade()
gérait l’éclairage
de façon binaire (un objet bloquait la lumière ou non). Avec
le média participatif, nous pondérons désormais
la contribution lumineuse en fonction de la transmittance
mesurée le long du rayon d’ombre dans le volume. Ainsi,
la contribution de la source lumineuse peut aller de 0 à 1,
traduisant une absorption partielle dans le médium.
Une fois que nous avons calculé l'ombrage au point d'intersection, la couleur finale du pixel est:
color = shade() * transmittance + scatteringColor
Ce projet offre une compréhension plus approfondie des concepts de volume rendering appliqués au ray tracing. L’implémentation traite de l’absorption, de la diffusion sortante, de la diffusion entrante et des fonctions de phase (dont Henyey-Greenstein). Elle repose sur l’approche DDA ou Ray Marching pour parcourir le volume.
Parmi les améliorations possibles, on peut envisager l’ajout de l’émission (ex. feu) et le portage du code vers un shader language pour un rendu en temps réel sur le GPU (via OpenGL, Vulkan ou compute shaders dans Unity). On pourrait également implémenter d’autres types de fluides (eau, brouillard, etc.) en utilisant la même logique d’échantillonnage de volume.
Les résultats (images statiques) montrent que la simulation de la fumée, de la brume ou des nuages est convaincante, démontrant l’efficacité des méthodes mises en place pour rendre la diffusion de la lumière au sein d’un médium.
Voici quelques exemples d’images générées par le programme :
Voici quelques exemples d’images générées par le programme :
Grille de voxels avec densité uniforme de 1.
Sphère avec densité uniforme de 0.5.
Grille avec densités de Perlin.
Sphère avec densités de Perlin.
Grille avec g = -0.65.
Cube miroir dans le volume.
Sphère miroir dans le volume.
Cube miroir dans le volume (vue 3).
Reference: SIGGRAPH Comput. Graph., vol. 11, no. 2, pp. 192–198, July 1977.
Abstract: In the production of computer generated pictures of three dimensional objects, one stage ... [omitted for brevity].
Reference: Proceedings of the 4th Annual Conference on Computer Graphics and Interactive Techniques (SIGGRAPH '77), ACM, New York, NY, USA, pp. 192–198.
Abstract: In the production of computer generated pictures of three dimensional objects, one stage ... [omitted for brevity].
URL: https://raytracing.github.io/books/RayTracingInOneWeekend.html
Note: [Accessed August 2024]
URL: https://en.wikipedia.org/w/index.php?title=Ray_tracing_(graphics)&oldid=1253778958
Note: [Online; accessed 3-December-2024]
URL: https://en.wikipedia.org/w/index.php?title=Perlin_noise&oldid=1258165795
Note: [Online; accessed 3-December-2024]
URL: https://en.wikipedia.org/w/index.php?title=Voxel&oldid=1260713506
Note: [Online; accessed 3-December-2024]
Note: [Online; accessed 3-December-2024]
Reference: Proceedings of EuroGraphics, vol. 87, August 1987.
URL: https://en.wikipedia.org/w/index.php?title=Beer%E2%80%93Lambert_law&oldid=1262471473
Note: [Online; accessed 12-December-2024]