Résumé du Projet Final

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

1. Introduction

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.

2. Principes de base du Ray Tracing

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 :

  1. Lancer un rayon depuis la caméra pour chaque pixel.
  2. Vérifier les intersections avec les objets (triangles, sphères, etc.).
  3. Calculer la couleur au point d’intersection en utilisant le modèle Blinn-Phong ou une approche équivalente.
  4. Gérer la réflexion et la réfraction en fonction d’une profondeur de rayon maximale (ray_depth).
    1. Pour la réflexion, lancer un nouveau rayon dans la direction réfléchie.
    2. Pour la réfraction, lancer un nouveau rayon dans la direction réfractée (par ex. en utilisant la loi de Snell).

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.

3. Médias Participatifs

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.

3.1 Intersection Cube-Rayon

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 :

  • Origine du rayon à l’intérieur du volume : dans ce scénario, il n’y a pas de point d’entrée (ou tMin est négatif). Nous commençons donc directement dans le volume.
  • Composante de direction nulle : division par zéro. En C++, la division par zéro aboutit à la valeur infinity, ce qui nous permet de gérer ce cas. Néanmoins, à cause de la représentation des nombres à virgule flottante, il est possible d’obtenir la valeur -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.

4. Parcours du Média Participatif

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 :

  • DDA (Digital Differential Analyzer)
    Cette méthode parcourt le volume en se déplaçant d’une intersection de plan de voxel à la suivante. Elle garantit qu’aucun voxel traversé par le rayon n’est ignoré, même si le rayon frôle un coin du voxel. Cependant, cela signifie également que nous n’échantillonnerons chaque voxel qu’une seule fois.
  • Ray Marching
    Ici, on avance à l’aide d’une taille de pas constante. Les échantillons sont ainsi régulièrement espacés le long du rayon, parfois avec un léger jitter pour limiter la répétition d’artefacts. Contrairement à l’approche DDA, avec un pas suffisamment petit, il est possible d’échantillonner plusieurs fois le même voxel. Toutefois, cette méthode peut être plus lente (surtout si le pas est très petit) et ne garantit pas d’échantillonner chacun des voxels traversés par le rayon.

Dans les deux cas, à chaque échantillon (ou pas), on détermine la densité et on modélise l’interaction avec la lumière.

5. Atténuation de 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:

  • Absorption (σa) : une partie de la lumière est absorbée et transformée (par ex. en chaleur).
  • Diffusion sortante (σs) : la lumière est déviée hors de la direction originale.
  • Diffusion entrante (σs) : la lumière en provenance d’autres directions est déviée vers la caméra.
  • Émission : non implémentée ici (par ex. feu, flammes), mais pourrait être ajoutée ultérieurement.

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π)

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)

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.

5.1 Calcul de la Lumière à l’Intérieur du Volume

À 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.

6. Fonction 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

7. Conclusion

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.

8. Images

Voici quelques exemples d’images générées par le programme :

8. Images

Voici quelques exemples d’images générées par le programme :

Grille de voxels avec densité uniforme de 1

Grille de voxels avec densité uniforme de 1.

Scène 2

Sphère avec densité uniforme de 0.5.

Scène 3

Grille avec densités de Perlin.

Scène 4

Sphère avec densités de Perlin.

Scène 5

Grille avec g = -0.65.

Scène 6

Cube miroir dans le volume.

Scène 7

Sphère miroir dans le volume.

Scène 8

Cube miroir dans le volume (vue 3).

Bibliographie

1. Blinn, James F. (1977). Models of light reflection for computer synthesized pictures.
Journal Article

Reference: SIGGRAPH Comput. Graph., vol. 11, no. 2, pp. 192–198, July 1977.

DOI: 10.1145/965141.563893

Abstract: In the production of computer generated pictures of three dimensional objects, one stage ... [omitted for brevity].

2. Blinn, James F. (1977). Models of light reflection for computer synthesized pictures.
Conference Proceeding

Reference: Proceedings of the 4th Annual Conference on Computer Graphics and Interactive Techniques (SIGGRAPH '77), ACM, New York, NY, USA, pp. 192–198.

DOI: 10.1145/563858.563893

Abstract: In the production of computer generated pictures of three dimensional objects, one stage ... [omitted for brevity].

3. Shirley, Peter; Black, Trevor David; Hollasch, Steve (2024). Ray Tracing in One Weekend.
Miscellaneous
4. Wikipedia contributors (2024). Ray tracing (graphics).
Miscellaneous
5. Josh's Channel (2022). How Ray Tracing (Modern CGI) Works And How To Do It 600x Faster.
Miscellaneous
6. Lague, Sebastian (2023). Coding Adventure: Ray Tracing.
Miscellaneous
7. Wikipedia contributors (2024). Perlin noise.
Miscellaneous
8. Wikipedia contributors (2024). Voxel.
Miscellaneous

URL: https://en.wikipedia.org/w/index.php?title=Voxel&oldid=1260713506

Note: [Online; accessed 3-December-2024]

9. Wikipedia contributors (2024). Digital differential analyzer (graphics algorithm).
Miscellaneous
10. Amanatides, John; Woo, Andrew (1987). A Fast Voxel Traversal Algorithm for Ray Tracing.
Article

Reference: Proceedings of EuroGraphics, vol. 87, August 1987.

11. Gyurgyik, C.; Kellison, A. (2022). An Overview of the Fast Voxel Traversal Algorithm.
Miscellaneous
13. Wikipedia contributors (2024). Beer–Lambert law.
Miscellaneous
14. Lague, Sebastian (2024). Coding Adventure: Rendering Fluids.
Miscellaneous