Projet PBRadium

Page du Chef-d'Œuvre de M2 IGAI 2017/2018

Jehan-Antoine Vayssade, Matthias Roves et Hugo Rens

Présentation

Bienvenue sur la page de présentation de notre chef-d'œuvre, réalisation finale du M2 Informatique Graphique et Analyse d'Image (IGAI) de l'Université Paul Sabatier (Toulouse III), qui consiste à réaliser un projet impliquant l'implémentation de techniques présentées dans des publications scientifiques.

Le projet PBRRadium visait à implémenter au sein d'un moteur de rendu temps-réel existant, et en tant que plugin, de plusieurs fonctionnalités de rendu réaliste. Le moteur concerné est le Radium engine. Ce projet nous a été proposé par le Pr. Mathias Paulin, de l'IRIT. Il fait partie d'un projet plus grand visant à pouvoir charger et rendre des scènes de type PBRT v3 dans le Radium, et une autre équipe au moins est impliquée.

Dans le cadre de ce projet nous avons réalisé plusieurs rapports et diaporamas qui sont disponibles en bas de page. Le Radium est disponible ici, mais le dépôt du plugin sur lequel nous avons travaillé est privé.

Matériaux

Les modèles de matériaux réalistes les plus courants de nos jours sont les modèles basés sur la théorie des micro-facettes. Les matériaux de type Disney font partie de cette catégorie. L'idée est de penser une surface comme un ensemble de particules plus ou moins petites, ayant chacun une normale différente (celles d'un miroir seront homogènes tandis que celles du carton ou du béton ne le sont pas) donnant un aspect plus ou moins rugueux. On peut définir cette répartition des normales par une loi de distribution, et calculer les phénomènes qui interviennent, notamment le masquage et l'ombrage. L'angle de vue du matériau joue aussi un rôle crucial et est pris en compte par le modèle Disney.
Substrate material
Fig. 1 - Sphères avec un matériau de type Substrate (du plus rugueux au plus lisse).
Plastic material
Fig. 2 - Sphères avec un matériau de type Plastic (du plus rugueux au plus lisse).

Éclairage many-lights

Ici, nous avons fait en sorte de réduire au maximum le nombre de lumières affectant chaque point dont l'éclairage doit être calculé. Pour cela nous filtrons les lumières et n'utilisons, pour un point donné, que les lumières qui l'affectent. On divise pour cela la scène visible (le frustum) spatialement (en grille). Nous utilisons pour cela les compute shaders de la spécification OpenGL (le projet étant déjà en OpenGL). Une fois cette division faite, l'algorithme consiste en 3 étapes à:

  1. Effectuer un premier test de frustum culling hautement parallèle pour exclure l’ensemble des lumières non-visibles. Ainsi les indices des lumières visibles et leurs transformations NDC sont sauvegardées dans une liste pleine. Cette étape permet de les exclure pour le reste de la méthode dans une optique de performance.
  2. Effectuer un second test de collision avec le sous-frustum (le volume occupé par un cluster) défini à l'initialisation et les lumières visibles et transformées à l'étape précédente, également de manière parallèle. Cette étape permet de répartir les lumières visible dans leurs clusters respectifs pour diminuer le nombre de lumières à accumuler pendant l'étape de shading.
  3. Effectuer l'étape de shading. Les coordonnées 3D dans le cluster sont retrouvées à partir de la position du point calculé. Sommer l'énergie des lumières correspondant aux indices des lumières enregistrées à l'étape précédente.

Cluster indices
Fig. 3 - Indices des clusters (d'une couche de clusters, précisemment).
Heatmap
Fig. 4 - Nombre de lumières à calculer pour chaque pixel (chaque point de la scène vu par le pixel).
Many lights
Fig. 5 - Éclairage fourni par 100 sources de lumières ponctuelles.

Éclairage par sources polygonales

L'éclairage par des sources polygonales ne possède pas de solution analytique permettant de calculer celui-ci en temps-réel. Dans le cas général il faut intégrer sur toute la surface visible du polygone, comme le font les intégrateurs hors-ligne. La publication [1] propose une approximation de la solution calculable en temps-réel grâce à un précalcul et une distribution aux propriétés spécifiques.

Brièvement, la technique repose sur le fait que l'on peut approximer la distribution GGX décrivant un matériau (qui forme partiellement un modèle basé sur les micro-facettes) avec une transformation linéaire d'une distribution spécifique appelée LTC (Linearly Transformed Cosine). On peut, par différentes techniques, trouver les paramètres de cette transformation (5 au total) pour un angle d'incidence et une rugosité donnée, et par extension, échantillonner ces paramètres pour des variations de ces angle et rugosité. C'est ce qu'on appelle le fitting. Une fois ceci précalculé, on peut en faire des textures (en l'occurence 64x64) et évaluer une estimation de la distribution facilement depuis un shader OpenGL, en temps réel. Reste à intégrer l'énergie du polygone, ce qui est fait à l'aide du théorème de Stokes.

Polygone
Fig. 6 - Une étoile verte et un carré rouge éclairent une scène (vue du dessous) dont les objects sont représentés avec le matériau Substrate présenté plus haut.
Polygone
Fig. 7 - Une étoile rouge éclaire un cube bleu dont la rugosité varie, ce qui a pour effet de refléter la forme de manière plus ou moins diffuse sur la surface.