Physically Based Rendering : Comprendre la simulation numérique de la lumière.
Le Raytracing Physiquement Réaliste (PBR) ne cherche pas à "peindre" une image, mais à simuler le comportement réel des photons. Cependant, simuler la réalité brute est impossible : une ampoule émet des milliards de photons, mais seule une infime fraction atteint notre œil.
Pour optimiser le calcul, nous exploitons la réversibilité de la lumière. Nous tracons le chemin à l'envers : nous partons du capteur de la caméra (le Film), nous traversons un pixel précis, et nous lançons un rayon dans la scène pour "sonder" ce qu'il y a voir.
Pour obtenir une image réaliste, nous devons abandonner les couleurs arbitraires (RGB entre 0 et 255) et utiliser des unités radiométriques réelles. Trois concepts clés régissent tout système de rendu :
Unité: Watts ($W$)
C'est la puissance totale brute. L'énergie qui sort de la source dans toutes les directions.
Analogie: Le débit total d'un robinet.
Unité: $W/m^2$
La quantité d'énergie reçue sur une surface donnée. C'est ce qui "éclaire" l'objet.
Analogie: La pluie qui tombe au sol.
Unité: $W/m^2/sr$
L'énergie qui voyage le long d'un rayon fin. C'est la seule grandeur qui reste constante dans le vide.
Analogie: Ce que l'œil perçoit.
C'est la loi fondamentale de l'informatique graphique (Kajiya, 1986). Elle décrit l'équilibre énergétique en tout point de la scène.
Elle se lit comme une phrase :
"La lumière qui part vers l'œil ($L_o$) est la somme de la lumière émise ($L_e$) et de toute la lumière reçue et réfléchie."
L'intégrale $\int_{\Omega}$ signifie qu'on capture la lumière venant de tout l'hémisphère.
Lumière créée par l'objet lui-même (si c'est une ampoule ou une flamme). Pour 99% des objets, ce terme vaut 0.
La "Signature" du matériau. C'est une probabilité : si la lumière arrive d'ici, quelle chance a-t-elle de repartir par là ? (Miroir vs Tissu).
C'est l'inconnue. La lumière qui frappe le point $p$ provient d'ailleurs.
Géométrie pure. La lumière est étalée (donc plus faible) si elle frappe la surface en biais.
Regardez le terme $L_i$ (Lumière Entrante). D'où vient cette lumière ? Elle vient forcément d'un autre objet !
Donc, pour calculer $L_i$ ici, il faut calculer le $L_o$ d'un autre objet là-bas... qui lui-même dépend d'un autre $L_i$.
L'équation est récursive. C'est pour cela que le Raytracing est difficile : tout est connecté.
L'équation précédente contient une intégrale impossible à calculer analytiquement (car la lumière peut venir d'une infinité de directions). La solution est statistique : la méthode Monte Carlo.
"Si vous voulez connaître l'avis moyen d'un pays, vous n'interrogez pas 60 millions de personnes. Vous en interrogez 1000 au hasard, et vous obtenez une estimation très proche de la réalité."
En raytracing, c'est pareil : pour connaître la couleur d'un pixel, on lance $N$ rayons au hasard et on fait la moyenne.
Le problème de l'aléatoire, c'est le bruit (le "grain" sur l'image). C'est l'erreur visuelle de notre estimation. La règle est brutale : l'erreur diminue selon $\frac{1}{\sqrt{N}}$.
Lancer des rayons purement au hasard ("White Noise") est inefficace : le hasard crée naturellement des amas et des trous. Pour optimiser le rendu sans augmenter le nombre de rayons, on utilise l'Échantillonnage Stratifié (Jittered Sampling).
Amas & Zones vides
(Bruit élevé)
1 échantillon par case
(Bruit faible)
Le calcul est brutal : pour une image propre, nous lançons des millions de rayons. Si la scène contient aussi des millions de triangles, l'approche naïve demande de tester chaque rayon contre chaque triangle.
Résultat : Une image prendrait des semaines à calculer.
La solution est algorithmique : la Bounding Volume Hierarchy (BVH). On n'organise plus les objets en vrac, but dans une structure en arbre.
Le moteur teste aveuglément tous les objets un par un.
Analogie : Chercher un mot dans le dictionnaire en lisant chaque page depuis le début.
Le moteur teste des "boîtes". Si le rayon rate la boîte, on ignore les milliers d'objets qu'elle contient.
Analogie : Ouvrir le dictionnaire à la lettre "M", puis "Ma", etc.
En 3D classique, on dit qu'un objet est "rouge" ou "brillant". En PBR, on simule la réalité physique : tout est géométrie.
Si une surface paraît mate (comme de la craie), c'est qu'au niveau microscopique, elle est chaotique. Si elle est brillante (chrome), elle est lisse.
Jouez avec ce curseur pour voir comment la lumière rebondit sur les "micro-montagnes" de la surface :
En programmation classique, on écrit du code pour l'ordinateur et on ajoute des commentaires pour l'humain.
L'approche Literate Programming inverse cette logique : on écrit un livre (des chapitres, des paragraphes, des formules) qui contient des blocs de code.
C'est ce qui rend PBRT unique : le livre que vous lisez est le code source du moteur de rendu. Il n'y a pas de séparation entre la théorie mathématique et son implémentation C++.