Durant la seconde année à l'ESIR, j'ai développé avec un binôme, un moteur de lancer de rayon. Il fut amélioré de façon incrémentale, commençant comme un simple moteur de lancer de rayon avec couleur diffuse et spéculaire selon le modèle de Phong pour finalement devenir un moteur de Path Tracing utilisant des BRDF et une interface temps réel. Nous l'avons développé en C++.
Pendant la troisième et dernière année à l'ESIR, j'ai participé à un projet industriel sur de la synthèse d'image lui aussi.
Ci-dessous, trois images d'une même scène 3D. La première uniquement composée des couleurs, la seconde utilisant le shader de Phong et la dernière simulant des ombres douces à l'aide d'une lumière ambiante.
Les images qui suivent sont maintenant composées de lumières émissives, de surface spéculaire ainsi que de textures. Naturellement, nous avons ajouté des structures accélératrices pour accélérer le rendu, un
BVH
Bounding Volume Hierarchy couplé d'un
SAH
Surface-Area Heuristic comme nous pouvons le voir ci-dessous, la première sans SAH, la dernière avec. Notez comme les boîtes de collision collent mieux à la géométrie de la scène.
Nous avons ensuite ajouté la lumière indirecte, les lumières surfaciques, la stratification des pixels (pour réduire la variance) ainsi que la réfraction. Nous avons ensuite ajouté quelques nouvelles primitives telles que les sphères, anneaux ou cylindres permet de baisser le nombres de primitives et d'améliorer la précision des scènes. Ce moteur est doté d'un rendu temps réel grâce à de l'upscaling, permettant une gestion plus fluide de la caméra. La plupart des fonctions sont donc ainsi gérées depuis le clavier.
Le temps réel fut une grande aide pour le débuggage de l'application. Cela a notamment permis de choisir précisément les options de rendus pour nos scènes. Cette option maintiens tout de même de bonnes performances (10-100FPS en fonctions des options sélectionnées) grâce à un upscale et downscale automatique. A l'arrêt, l'image devient de plus en plus nette, permettant de l'antialiasing et du débruitage sur un nombre de passes infini.
Pour une scène en lancer de rayon (donc sans rayons indirects) le taux de rafraîchissement reste à 60FPS sans problème (sur CPU).
La dernière année à l'ESIR comprend la réalisation d'un projet industriel proposé par une entreprise. Le projet industriel auquel j'ai participé a été proposé par Chaos Czech l'entreprise développant le Corona Renderer. Ce projet regroupe quatre personnes et consiste en l'implémentation d'un Échantillonnage à Multiple Importances Optimal dans un path tracer bidirectionnel. Il est notamment essentiel que ce dernier soit non biaisé. Nous allons voir ici étapes de ce projet, à commencer par la mise à niveau comprenant du Multiple Importance Sampling, du Light Tracing et du Bidirectional Path Tracing.
Le MIS implémenté comporte deux méthodes d'échantillonnage, celle des BSDFs et celle des lumières que nous pouvons voir avec 64 passes ci dessous, respectivement. La scène utilisée reprend celle proposée par Veach et Guibas, quatre sphères de couleurs, quatre surfaces aux BSDFs de plus en plus diffuses. La dernière des images correspond aux poids de chaque échantillonnages sélectionnés par la balance heuristic.
Ci dessous se trouve les rendus de la même scène avec un path tracer classique et le MIS. La troisième image est la soustraction des deux précédentes afin de vérifier qu'il n'y ai pas de biais.
Nous pouvons maintenant voir l'effet des poids sur chaque méthode d'échantillonnage ainsi que le résultat final en 2048 passes (500s).
Le BDPT est implémenté avec la balance heuristic. Cela permet de tracer certains chemins complexes tels que les caustiques ce qui est nécessaire dans certaines scènes. Ci-dessous successivement un Path tracing Naïf, un Light Tracing puis un Bidirectional Path Tracing rendu avec un nombre élevé de passes : 1024. Le BDPT est en un sens la fusion du PT et du LT car il calcule toutes les possibilité d'échantillonnage d'un même chemin via ces deux techniques.
Un chemin de 7 vertex peu être échantillonné selon 7 combinaisons, commençant à [s=0;t=7] jusque [s=6;t=1] où s est le nombre de vertex partant de la lumière et t est le nombre de vertex partant de la caméra (radiance and importance). La pdf du chemin courant avec l'échantillonnage courant se calcule en utilisant les pdf forward et reverse.
La minimisation complète de la variance de l'estimateur de Monte Carlo ainsi que la libération de la contrainte sur les poids proposées par Kondapaneni et. al. a permis une fois de plus de minimiser grandement la variance des images rendues. Cette méthode se base sur l'estimation d'un système linéaire au fur et à mesure des passes permettant de calculer les poids optimaux à appliquer.
Deux méthodes d'échantillonnage différentes
Balance heuristic
Poids optimaux
Notre tâche fut d'implémenter cette méthode dans un BDPT.
Pour ce faire, les principales contributions furent :
La correction de certain matériaux ne calculant pas les pdf lors de l'absence de contribution
La correction du modèle de microfacettes pouvant générer des pdf négatives lors du nouveau calcul de normale
La prise en compte des chemins de Light Tracing
La prise en compte des chemins sans contribution
Cette totale intégration a donné des résultats très satisfaisants pour les chemins simples (éclairage direct i.e. avec une technique d'échantillonnage optimale) mais pas pour les chemins plus complexes tels que les caustiques.