# Radiance cache optimization for global illumination

M Omidvar, S Carré, M. Ribardière, Daniel Meneveaux, K Bouatouch

► To cite this version:

M Omidvar, S Carré, M. Ribardière, Daniel Meneveaux, K Bouatouch. Radiance cache optimization for global illumination. [Research Report] IRISA Rennes Bretagne Atlantique, équipe FRVSense. 2014. hal-01089581

HAL Id: hal-01089581

https://inria.hal.science/hal-01089581

Submitted on 2 Dec 2014

HAL is a multi-disciplinary open access
archive for the deposit and dissemination of sci-
entific research documents, whether they are pub-
lished or not. The documents may come from
teaching and research institutions in France or
abroad, or from public or private research centers.

L'archive ouverte pluridisciplinaire HAL, est
destinée au dépôt et à la diffusion de documents
scientifiques de niveau recherche, publiés ou non,
émanant des établissements d'enseignement et de
recherche français ou étrangers, des laboratoires
publics ou privés.

<figure><img src="image_1.png" /></figure>

Distributed under a Creative Commons Attribution 4.0 International License
# Radiance cache optimization for global illumination

M. Omidvar* S. Carré** M. Ribardière*** D. Meneveaux**** K. Bouatouch*****
mahmoud.omidvar@gmail.com, carre@cstb.fr, mickael.ribardiere@univ-poitiers.fr,
daniel.meneveaux@univ-poitiers.fr, kadi.bouatouch@irisa.fr

**Abstract:** Radiance caching methods have proven efficient for global illumination. Their goal is to compute precisely illumination values (incident radiance or irradiance) at a reasonable number of points lying on the scene surfaces. These points, called records, are stored in a cache used for estimating illumination of other points in the scene. Unfortunately, with records lying on glossy surfaces, the irradiance value alone is not sufficient to evaluate the reflected radiance; each record should also store the incident radiance for all incident directions. Memory storage can be reduced with projection techniques using spherical harmonics or other basis functions. These techniques provide good results with low shininess BRDFs. However, they get impractical for shininess of even moderate value since the number of projection coefficients increase drastically. In this paper, we propose a new radiance caching method, that handles highly glossy surfaces, while requiring a low memory storage. Each cache record stores a coarse representation of the incident illumination thanks to a new data structure called Equivalent Area light Sources (EAS), capable of handling fuzzy mirror surfaces. In addition, our method proposes a new simplification of the interpolation process since it avoids the need for expressing and evaluating complex gradients.

**Key-words:** Global illumination, radiance caching, BRDF

## Optimisation de cache de luminance en éclairage global

**Résumé :** La simulation d'éclairage est un processus qui s'avère plus complexe (temps de calcul, coût mémoire, mise en oeuvre complexe) pour les matériaux brillants que pour les matériaux lambertiens ou spéculaires. Afin d'éviter le calcul coûteux de certains termes de l'équation de luminance (convolution entre la fonction de réflexion des matériaux et la distribution de luminance de l'environnement), nous proposons une nouvelle structure de données appelée Source Surfacique Équivalente (SSE). L'utilisation de cette structure de données nécessite le pré-calcul puis la modélisation du comportement des matériaux soumis à divers types de sources lumineuses (positions, étendues). L'exploitation d'algorithmes génétiques nous permet de déterminer les paramètres des modèles de BRDF, en introduisant une première source d'approximation. L'approche de simulation d'éclairage utilisée est basée sur un cache de luminance. Ce dernier consiste à stocker l'éclairement incident sous forme de SSE en des points appelés enregistrements. Durant la simulation d'éclairage, l'environnement lumineux doit également être assimilé à un ensemble de sources surfaciques équivalentes (en chaque enregistrement) qu'il convient de définir de manière dynamique. L'approche des Sources Surfaciques Équivalentes est particulièrement intéressante pour des matériaux rugueux ou pour les matériaux très brillants placés dans des environnements relativement uniformes. L'utilisation de SSE a permis de réduire considérablement à la fois le coût mémoire et le temps de calcul.

**Mots clés :** Éclairage global, cache de luminance, BRDF

<footnote>* FRVSense : IRISA,</footnote>

<footnote>** CSTB, Nantes,</footnote>

<footnote>*** SIC-XLIM,</footnote>

<footnote>**** SIC-XLIM,</footnote>

<footnote>***** FRVSense : IRISA</footnote>
# 1 Objectif

Dans le but de créer des images photo-réalistes, pour des scènes contenant des objets spéculaires et diffus, on utilise des algorithmes d'illumination globale tels que : suivi de chemin, lancer de photon, Monte-Carlo, Metropolis etc. Ces méthodes peuvent générer des images entachées de bruit, nécessitant un temps de calcul très important et certaines sont dépendantes de la position du point de vue. Afin de générer des images de synthèse dépourvues de bruit et nécessitant un temps de calcul raisonnable, des méthodes utilisant un cache ont été proposées, elles s'exécutent en deux phases : pré-calcul d'un cache suivi d'une phase de rendu. Le cache consiste en un ensemble de points de la scène (visibles par la caméra, et appelés dorénavant *enregistrements*) pour lesquels un calcul de l'éclairage incident est stocké. Dans le cas où le cache enregistre l'éclairement incident [?], il permet de ne calculer que la composante diffuse indirecte, il s'agit donc d'un cache d'éclairement (*irradiance cache*). Si on veut calculer la composante directionnelle (spéculaire rugueuse ou glossy) indirecte, alors un enregistrement appartenant à une surface brillante (*glossy*) doit stocker la luminance incidente provenant de plusieurs directions. C'est l'objectif de la méthode de cache de luminance (*radiance cache*) proposée par Krivanek et al. [?]. Cette méthode projette les luminances incidentes dans une base de fonctions harmoniques sphériques afin de réduire le coût de stockage. Quant il s'agit de prendre en compte des lobes spéculaires (de Phong ou Lafortune), même moyennement fins (exposant de Phong allant jusqu'à 40 ou 50), le nombre de coefficients de projection devient très important, ce qui nécessite une capacité mémoire considérable pour stocker ces coefficients. Pour un exposant de Phong supérieur à 100, le nombre de coefficients devient prohibitif ainsi que les calculs associés lors des calculs de gradients de ces paramètres.

Notre objectif est de proposer une méthode d'illumination globale utilisant un cache mais capable de prendre en compte des objets très brillants (avec un exposant de Phong valant jusqu'à 200) et ne nécessitant pas une capacité de stockage importante tout en proposant un temps de caclul raisonnable. Notre approche se base sur ce que nous appelons les sources surfaciques équivalentes (SSE) et que nous décrivons plus dans ce document.

# 2 État de l'art

L'entrée d'un système de génération d'images réalistes est une description complète d'un monde virtuel. Celui-ci se compose de la géométrie des objets, des propriétés des matériaux de ces objets, de leurs positions dans la scène ainsi que des caractéristiques des sources lumineuses. Afin de créer une image du monde virtuel nous avons besoin de calculer la quantité de lumière entrant dans une caméra virtuelle positionnée dans la scène. La lumière pénètre dans l'appareil directement à partir des sources de lumière, mais aussi indirectement comme elle est réfléchie ou réfractée par les objets de la scène. La prise en compte de l'interaction entre la lumière et les objets dont les matériaux sont complexes (tels que les surfaces brillantes) est appelée illumination globale (IG), et constitue l'objectif principal de la synthèse d'image réaliste. La base mathématique fondamentale pour la synthèse d'images réalistes est l'équation de rendu [?]. L'équation de rendu décrit le bilan énergétique dans la scène. Pour résoudre l'équation de rendu, une approche basée sur la méthode des éléments finis peut être utilisée, il s'agit de la méthode de radiosité [?, ?]. Les algorithmes de radiosité se sont révélés très efficaces, en particulier pour des scènes relativement simples avec des surfaces parfaitement diffuses. Cependant, pour des environnements complexes avec une grande quantité de matériaux brillants, les algorithmes de radiosité ne sont pas pratiques en termes d'espace mémoire et de temps de calcul et ne considèrent que des matériaux parfaitement diffus. D'autres approches permettant de résoudre l'équation de rendu sont basées sur les méthodes de Monte Carlo. Au lieu de résoudre l'équation de rendu directement, elles expriment sous une forme simple, la solution de l'équation de rendu même dans le cas de plusieurs dimensions. Parmi ces méthodes de Monte Carlo on peut citer: le lancer de rayon distribué (*distribued ray tracing*) [?], le suivi de chemin (*path tracing*) [?], ainsi que le suivi de chemin bidirectionnel (*bidirectional path tracing*) [?, ?], etc. Ces méthodes se sont révélées robustes et peuvent être appliquées à tout type de matériau. Cependant ces algorithmes produisent des images avec un bruit perceptible qui pourrait être supprimé en augmentant le nombre d'échantillons (rayons, trajets des rayons, les photons, etc), ce qui est malheureusement très coûteux en temps de calcul. En outre, ces méthodes n'exploitent pas la cohérence entre différents chemins de lumière générés à partir des sources de lumière.

Afin d'exploiter cette cohérence d'autres algorithmes ont été proposés [?, ?, ?]. Il s'agit des méthodes de cache d'éclairement ou de luminance. Elle permettent d'éliminer tout bruit tout en diminuant le temps de calcul.

Elles consistent à calculer l'éclairement ou la luminance incidente ainsi que le gradient (d'éclairement ou de luminance) en un faible nombre de points sur les surfaces de la scène, de stocker ces valeurs dans un cache (ensemble des enregistrements), puis d'utiliser le cache pour calculer la luminance en tout autre point de la scène. Cette idée a été proposée par Ward *et al.* [?, ?] afin de calculer la composante diffuse globale tandis que les composantes brillante (glossy) et spéculaire indirectes sont calculées dans une seconde étape par lancer de rayon. Un autre avantage de ces méthodes
basées cache est que les enregistrements calculés pour une position de la caméra peuvent être utilisés pour une autre position de la caméra, ce qui permet une balade interactive dans une scène [?].

Ces méthodes basées cache présentent des limites lorsqu'il s'agit de prendre en compte des objets brillants. Pour résoudre ce problème, on pourrait recourir à des méthodes utilisant un échantillonnage par importance Monte Carlo [?, ?, ?], la méthode de Metropolis [?] ou la carte de photons (*photon mapping*) [?]. Malheureusement, ces méthodes sont très gourmandes en temps de calcul.

Pour réduire la quantité de calcul, d'autres méthodes basées cache de luminance et prenant en compte les surfaces brillantes on été proposées.

Rappelons que le principe de cache d'éclairement se décompose en deux étapes. La première consiste à remplir la cache en sélectionnant des points, appelés enregistrements, pour lesquels l'éclairement est calculé en fonction de la position de la caméra. La seconde étape, qui correspond au rendu, interpole les valeurs d'éclairement mises en cache pour calculer l'éclairement en d'autres points vus à partir de la caméra. Pour les enregistrements se trouvant sur les surfaces brillantes, la valeur de l'éclairement n'est pas suffisante pour reconstruire la luminance réfléchie en ces points. Étant donné le caractère brillant des surfaces, chaque enregistrement doit stocker la luminance incidente pour toute direction d'incidence. Křivánek et al. [?] stockent cette information directionnelle de luminance en la projetant dans un espace de fonctions de base hémisphériques (harmoniques hémisphériques) [?]. Cet algorithme est appelé cache de luminance. La méthode cache de luminance a été améliorée de différentes manières au cours de la dernière décennie [?, ?, ?]. Gassenbauer et al. [?] propose une méthode fondée sur le cache de luminance et n'utilisant pas de fonctions de base. Dans cette méthode, les informations directionnelles de luminance incidente sont calculées par échantillonnage par importance sur la base de la BRDF en fonction des angles d'observation, puis stockées dans chaque enregistrement, ce qui permet de calculer plus efficacement la luminance pour les surfaces brillantes. Mais cette méthode a plusieurs limites : premièrement la taille important de mémoire utilisée pour la mise en cache des enregistrements, deuxièmement la marge d'erreur importante de cette méthode lors que les matériaux sont très brillants, et troisièmement, comme les enregistrements calculés dépendent de la position de la caméra, on peut avoir besoin d'effectuer des calculs supplémentaires pour augmenter l'information stockée dans les enregistrements ce qui s'avère très coûteux en temps de calcul et en mémoire.

Notons que les méthodes de cache de luminance [?, ?] sont limitées à des matériaux de faible brillance, c'est à dire pour des exposants de Phong ne dépassant pas 50. En outre, dans le cas de la méthode de Křivánek et al. un grand nombre de coefficients d'harmoniques sphériques est nécessaire, ce qui augmente à la fois le temps de calcul, et la taille mémoire.

Notre but est de proposer une méthode de cache de luminance capable de considérer des objets très brillants, c'est à dire avec des lobes de réflexion très fins, tout en ne nécessitant qu'une mémoire de stockage raisonnable. Chaque enregistrement contient une représentation grossière de la luminance incidente grâce à une nouvelle structure de données appelée *Sources Surfaciques équivalentes* (SSE). Notre méthode exploite au maximum la cohérence de transfert de lumière dans la scène afin de réduire considérablement les temps de calcul. Rappelons que la base mathématique sur la cohérence du transfert lumineux a été présentée dans [?, ?, ?].

## 3 Aperçu de la méthode

Afin de calculer une image, pour une position et une orientation de la caméra, on lance des rayons (rayons primaires) depuis la position de l'observateur à travers chaque pixel du plan image et en direction de la scène. Pour chaque intersection avec un objet dans la scène on cherche si le point d'intersection $P$ se trouve ou non dans la zone d'influence d'un ou de plusieurs enregistrements. Si tel est le cas, on utilise les données stockées dans ces enregistrements pour calculer la luminance réfléchie dans la direction de l'observateur, sinon on crée un nouvel enregistrement au point d'intersection $P$.

Un nouvel enregistrement, en un point $P$, est calculé de la manière suivante. On lance des rayons depuis $P$ dans plusieurs directions incidentes associées à l'hémisphère (Fig.1) placé au dessus de $P$. Pour évaluer la luminance incidente associée à chaque rayon échantillon on peut utiliser plusieurs approches : tracé de photons, tracé de chemins bidirectionnel, etc.

Pour calculer la luminance réfléchie dans une direction donnée, en un point enregistrement $P$ et en tout point se trouvant dans son voisinage, on utilise les luminances incidentes calculées, celles-ci étant stockées dans la structure enregistrement. Ces données nécessitent une grande capacité mémoire, d'où l'utilisation de techniques de projection dans une base de fonctions harmoniques sphériques [?]. Mais pour des lobes de Phong ayant un exposant supérieur à 100 le
nombre de coefficients de projection devient prohibitif. C'est pourquoi nous proposons une méthode basée sur les SSE (Source Surfacique Équivalente).

Chacune des directions incidentes en un enregistrement *P* intersecte la scène en un point $x_i$. Ces points sont regroupés (Clustering) en fonction de certains critères décrits ci-après. Le résultat est ensemble de groupes (Clusters) de points $x_i$. Chaque groupe comprend des points $x_i$ voisins et est représenté par une surface qui éclaire *P*. Cette surface est appelée Source Surfacique Équivalente ou SSE dorénavant.

<figure><img src="image_2.png" /><figcaption>Figure 1: Exemple d'une scène et distribution des rayons dans l'hémisphère (tirages)</figcaption></figure>

Pour calculer de la luminance réfléchie $L_r$ en un point $x$ dans la direction $\omega_r$ on doit évaluer l'intégrale suivante :

$$L_r(x, \vec{\omega}_r, \lambda) = \int_{\Omega} L(x, \vec{\omega}_i, \lambda) f_r(x, \vec{\omega}_i, \vec{\omega}_r, \lambda) \cos(\theta_i) d(\omega_i), \quad (1)$$

où $\Omega$ est l'hémisphère centré autour de la position $x, \vec{\omega}_i$ la direction incidente, $\theta_i$ l'angle entre $\vec{\omega}_i$ et la normale à la surface en $x, f_r$ la BRDF (Bidirectional Reflectance Distribution Function) qui nous permet d'établir le lien entre la lumière incidente et la lumière réfléchie(Fig.1).

Cette intégrale est particulièrement longue à évaluer car elle doit prendre en compte la luminance provenant de toutes les directions d'incidence. En effet, la seule valeur d'éclairement n'est pas suffisante, car il faut disposer de la distribution angulaire de luminance incidente provenant de l'environnement. Dans l'idéal il faudrait garder en mémoire les luminances incidentes provenant d'un nombre élevé de directions incidentes (associées aux rayons incidents de l'hémisphère), mais en pratique cela est impossible à cause du coût mémoire et du coût de calcul. C'est pourquoi nous proposons de regrouper les directions incidentes (aussi appelées tirages puisque nous tirons des échantillons de direction qui sont des rayons).

Notre méthode est décrite par l'algorithme 1. La création d'un enregistrement peut être réalisée de deux façons. La première consiste à échantillonner en point toutes les surface de la scène, ces points seront les enregistrements. Cette approche est indépendante du point de vue est permet un déplacement interactif dans la scène. La seconde approche est dépendante du point de vue. On ne calcule que des enregistrements visibles à partir de la caméra. Ces enregistrements correspondent à des pixels échantillonnées sur le plan d'image. La première solution sera utilisée pour la visualisation interactive, par contre dans cette partie nous utilisons la deuxième approche pour décrire notre méthode (comme indiqué dans l'algorithme 1 lignes 2 .. 19). Notons que notre méthode de cache de luminance pourrait être utilisée dans la première approche.

# 4 Source Surfacique Équivalente (SSE)

Afin de simplifier l'équation de luminance 1, on peut réécrire la formule sous la forme de la somme de plusieurs intégrales dans laquelle la luminance incidente en un point $x$ ($L(x, \vec{\omega}_i, \lambda)$) est quasi constante (Fig.2). Nous avons donc :

$$L_r(x, \vec{\omega}_r, \lambda) = \sum_{j=1}^{n} \int_{\Omega_j} L(x, \vec{\omega}_i, \lambda) f_r(x, \vec{\omega}_i, \vec{\omega}_r, \lambda) \cos(\theta_i) d(\omega_i) \quad (2)$$
**Algorithm 1** Calcul d'image et mise à jour du cache d'enregistrement

1: // Étape de remplissage du cache

2: **for each** pixel j **do**

3: $x_P \leftarrow \text{Tracer-Rayon-Caméra}(j)$;

4: $C \leftarrow \text{Chercher-Enregistrement-Existant}(x_P)$;

5: **if** $C = \{\}$ **then**

6: // Il n'y a pas de enregistrement autour de $x_P$, on crée un nouveau enregistrement

7: $S \leftarrow \text{Échantillonnage-Stratifié-}\Omega(x_P)$;

8: // Échantillonnage de l'hémisphère

9: $\text{data} = \{\}$;

10: **for each** $\vec{\omega}_i$ in S **do**

11: // $\omega_i$ est la direction d'incidence

12: $L \leftarrow \text{Calcule-Luminance}(\vec{\omega}_i)$;

13: $\text{data} \leftarrow \text{data} + \text{Ajout-Contribution}(\vec{\omega}_i, L)$;

14: **end for**

15: SSE $\leftarrow$ Determiener-SSE(data);

16: $P \leftarrow \text{Créer-Enregistrement}(x_P, SSE)$;

17: Mettre-En-Cache($P$);

18: **end if**

19: **end for**

20: // Étape Rendu

21: **for each** pixel j **do**

22: $x_P \leftarrow \text{Tracer-Rayon-Caméra}(j)$;

23: $C \leftarrow \text{Chercher-Enregistrement-Existant}(x_P)$;

24: // Interpoler les contributions des enregistrements en utilisant des SSE

25: Calcul-Luminance-Pixel($C, j$);

26: **end for**

<figure><img src="image_3.png" /><figcaption>Figure 2: Regroupement de tirages.</figcaption></figure>

Où

$$ \Omega = \sum_{j=1}^{n} \Omega_j $$
Donc chaque angle solide $\Omega_j$ représente un source surfacique équivalente. Nous faisons l'hypothèse que $L(x, \vec{\omega}_i, \lambda)$ est constante sur $\Omega_j$ (on nommera ce terme $\tilde{L}_j(x)$), donc on peut le sortir de l'intégrale, ce qui donne :

$$L_{r_j}(x, \vec{\omega}_r, \lambda) \approx \tilde{L}_j(x) \int_{\Omega_j} f_r(x, \vec{\omega}_i, \vec{\omega}_r, \lambda) \cos(\theta) d(\omega_i) \quad (3)$$

Connaissant l'équation de l'éclairement $E(\lambda)$ définie en fonction de la luminance incidente $L_j(x, \vec{\omega}_i, \lambda)$ nous avons :

$$E_j(\lambda) = \int_{\Omega_j} L_j(x, \vec{\omega}_i, \lambda) \cos(\theta) d(\omega_i) \quad (4)$$

Donc avec l'hypothèse de départ (luminance quasi constante dans un angle solide $\Omega_j$) nous obtenons :

$$E_j(\lambda) \approx \tilde{L}_j(x) \int_{\Omega_j} \cos(\theta) d(\omega_i)$$

On peut donc déduire la valeur de la luminance en fonction de l'éclairement

$$\tilde{L}_j(x) \approx \frac{E_j(\lambda)}{\int_{\Omega_j} \cos(\theta) d(\omega_i)} \quad (5)$$

avec les equations 5 et 3 on obtient :

$$L_{r_j}(x, \vec{\omega}_r, \lambda) \approx \frac{E_j(\lambda)}{\int_{\Omega_j} \cos(\theta) d(\omega_i)} \int_{\Omega_j} f_r(x, \vec{\omega}_i, \vec{\omega}_r, \lambda) \cos(\theta) d(\omega_i) \quad (6)$$

$$L_{r_i}(x, \vec{\omega}_r, \lambda) \approx E_i(\lambda) \left( \frac{\int_{\Omega_j} f_r(x, \vec{\omega}_i, \vec{\omega}_r, \lambda) \cos(\theta_i) d(\omega_i)}{\int_{\Omega_j} \cos(\theta) d(\omega_i)} \right) \quad (7)$$

Deuxième partie de la formule 7, fait intervenir un terme qui correspond à la BRDF moyenne évaluée dans l'angle solide

<figure><img src="image_4.png" /><figcaption>Figure 3: Regroupement des tirages pour la création de SSE.</figcaption></figure>

$\Omega_j$ représentant une SSE(algorithm 1 ligne 15). Rappelons qu'une SSE représente un groupe de points d'intersection entre les rayons incidents et la scène. Chaque point est associé à un angle solide élémentaire. L'angle solide $\Omega_j$ associé à une SSE est égal à la somme des angles solides élémentaires des points d'intersection contenus dans la SSE. La position de la SSE est égale au barycentre de ces points. Une SSE est par conséquent définie par : une position, une valeur d'angle solide et un éclairement. On peut également représenter une SSE par : un angle d'élévation $\theta$, une valeur d'angle solide $\Omega$ et un éclairement(fig 4).
Donc en chaque enregistrement P on stocke les SSE calculées à partir de P (algorithm 1 ligne 16). Ces SSE permettent de calculer la luminance réfléchie en un enregistrement et aux points voisins.

Donc on définit la BRDF moyenne $\tilde{F}_r$, dépendant de l'angle solide $\Omega$ et de la direction de réflexion $\omega_r$ (image 4), par :

$$ \tilde{F}_r(\Omega_j, \vec{\omega}_r) = \frac{\int_{\Omega_j} f_r(\vec{\omega}_i, \vec{\omega}_r, \lambda) \cos(\theta) d(\omega_i)}{\int_{\Omega_j} \cos(\theta) d(\omega_i)} \quad (8) $$

<figure><img src="image_5.png" /><figcaption>Figure 4: Exemple d'une scène avec une seule SSE. Ici pour calculer la luminance réfléchie au point $P_0$ on a besoin de connaître l'angle solide $\Omega$ et l'angle d'incidence $\theta$ associé à la SSE.</figcaption></figure>

Comme on voit dans l'équation 8 le calcul de $\tilde{F}_r$ est indépendant de l'éclairage de la scène, donc on peut la pré-calculer et le tabuler.

# 5 Précalcul de la BRDF moyenne $\tilde{F}_r$

Pour évaluer la BRDF moyenne nous avons besoin de pré-calculer la résultat de l'équation 8 pour toutes les directions de réflexion $\omega_r$, pour chaque angle solid ($\Omega, \omega_i$) défini par sa position et sa valeur.

Afin d'effectuer l'interpolation de la BRDF moyenne pour les valeurs intermédiaires de $\Omega_j$, $\theta_j$ et des positions intermédiaires de $\omega_r$ nous avons choisi de projeter les BRDF moyennes, calculées grâce à l'équation précédente, dans une base de fonction. L'interpolation consiste alors à interpoler les coefficients de projection.

Afin de pouvoir modéliser les différents types de matériaux (isotrope et anisotrope), on a donc choisi le modèle de lobe de Lafortune [?, ?] et d'interpoler les coefficients des différentes lobes ($C_x, C_y, C_z, n$).

## 5.1 Projection

Dans le cas de BRDF isotrope un angle solide $\Omega_j$ est défini par sa valeur en stéradian et par l'angle $\theta_j$ entre l'axe de l'angle solide et la normale en un point d'une surface (Fig. 4,5). La projection, dans une base de fonctions de type lobe de Lafortune, est décrite par l'algorithme 2 et la (Fig 5).

La Projection des valeurs de BRDF moyennes ($\tilde{F}_r$) dans des base de fonctions est effectuée par un programme d'algorithme génétique [?]. Chaque élément $Tab[i][j]$ du tableau $Tab$ (algorithm 2 ligne 8) représente les coefficients de projection d'une BRDF moyenne définie pour un angle solide $\Omega_j$ et un angle d'élévation $\theta_i$, tel que :

$$ \theta_i = i * \frac{\pi}{2 * N}, i \in [0...N] \\ \Omega_j = j * \frac{2\pi(1 - \sin(\theta_i))}{M}, j \in [0...M] $$
**Algorithm 2** Projection de la BRDF moyenne

1: **for each** angle d'élévation $\theta_i$ **do**

2: **for each** valeur de l'angle solide $\Omega_j$ **do**

3: **for each** chaque direction de réflexion $\vec{\omega}_r$ **do**

4: $\tilde{F}_r \leftarrow \text{Calculer-BRDF-moyenne}(\Omega_j, \theta_i, \vec{\omega})$; // eq. 8

5: **end for**

6: // Algorithme Génétique

7: $C_x, C_y, C_z, n \leftarrow \text{Projeter}(\text{toutes les valeurs } \tilde{F}_r)$;

8: Stocker $C_x, C_y, C_z, n$ dans un tableau Tab;

9: **end for**

10: **end for**

Dans le cas d'une base de fonctions de type Lafortune les coefficients de projection sont les paramètres des lobes du modèle de Lafortune. Pour les valeurs intermédiaire de $\Omega_j$ et $\theta_j$ on utilise une interpolation linéaire des coefficients.

## 5.2 Utilisation

Comme expliqué précédemment, pour calculer la luminance réfléchie dans chaque direction on a besoin de connaître les luminances incidentes (equation 1) en un point, ce qui est très coûteux en termes de mémoire et de temps de calcul. C'est pourquoi nous utilisons plutôt les SSE (Source Surfacique Équivalent) définies par l'équation 7.

Une fois les BRDF moyennes ($\tilde{F}_r$) tabulées on peut exprimer la luminance en un point $x$ dans une direction $\omega_r$ tel que:

$$L_r(x, \vec{\omega}_r, \lambda) \approx \sum_{i=1}^{n} E_i(\lambda) * \tilde{F}_r^t(\Omega_i, \vec{\omega}_i, \vec{\omega}_r, x) \quad (9)$$

les valeurs de $\tilde{F}_r$ résultent de l'interpolation des valeurs de $\tilde{F}_r^t$ tabulées.
## 5.3 Résultats

Dans les images ci-dessous nous montrons la différence entre une référence qui est le résultat de l'équation 8, et le résultat projeté dans une base de fonctions de type lobe de Lafortune pour différents angles solides Ω et différents angles d'incidence θ. L'image 5 montre le résultat obtenu pour un matériau brillant avec un coefficient (exposant) de brillance de 100, un angle solide Ω = π/15 et un angle d'incidence θ = π/4

<figure><img src="image_6.png" /><figcaption>Figure 5: Exemple de résultat de l'équation 8 pour un angle solide Ω et un angle d'incidence θ</figcaption></figure>

Afin de bien présenter les résultats de projection et les valeurs de référence nous avons choisi de considérer :

* plusieurs matériaux avec différents coefficients de brillance,

* plusieurs angle solides et angles d'incidence,

* deux coupes différentes de lobe (Fig.6) ; on effectue une première coupe sur le plan englobant l'axe d'incidence et Normal (Fig 6a), ensuite on effectue une deuxième coupe orthogonale à la première contenant l'axe Y et la valeur de réflexion maximale (Fig 6b).

<figure><img src="image_7.png" /><figcaption>Figure 6: Deux différentes coupes</figcaption></figure>
### 5.3.1 Coefficient de brillance 40

Pour les exemples présentés ici on compare la résultat de l'équation 8 pour un matériau de type modified Phong avec une coefficient de brillance de 40

Ce qui donne comme résultat :

$$fr = \frac{n+2}{2*\pi}cos(\alpha)^n$$

où α est l'angle entre la réflexion miroir et le vecteur de réflexion R, et n est egal à 40.

Dans la tableau 1, on voit bien la grande précision de la projection dans une base de fonctions de type lobe, et dans la tableau suivant (tableau 2, sur la deuxième coupe du lobe, la projection suit bien les variations des données.
<figure><img src="image_8.png" /><figcaption>Table 1: Exemple d'un matériau pré-calculé avec N=40, chaque ligne correspond à un angle solide, et chaque colonne à son positionnement pour la calcul de $\bar{F}_r$ pour différents $\omega_r$. En abscisse la variation du l'angle $\omega_r$ dans le plan du découpe 6a et en ordonnée le résultat de l'équation 8. En rouge les valeurs exactes et en bleu les valeurs données par le résultat de notre projection</figcaption></figure>
<figure><img src="image_9.png" /><figcaption>Table 2: Exemple d'un matériau pré-calculé avec N=40, chaque ligne correspond à un angle solide, et chaque colonne à son positionnement pour la calcul de $\vec{F}_r$ pour différents $\omega_r$. En abscisse la variation du l'angle $\omega_r$ dans le plan du découpe 6b et en ordonnée le résultat de l'équation 8. En rouge les valeurs exactes et en bleu les valeurs données par le résultat de notre projection</figcaption></figure>
### 5.3.2 Coefficient de brillance 100

Ici nous représentons un matériau de type Phong modifié avec un coefficient de brillance égal à 100 :

$$fr = \frac{102}{2*\pi}cos(\alpha)^{100}$$

<figure><img src="image_10.png" /><figcaption>Table 3: exemple d'un matériau pré-calculé avec N=100</figcaption></figure>

Dans les tableaux (tab.3,tab.4), on voit que avec un angle solide (Ω = π/30) il y a un petit décalage entre les résultats de projection et les résultats de référence.
<figure><img src="image_11.png" /><figcaption>Table 4: Exemple d'un matériau pré-calculé avec N=100, coupe V2</figcaption></figure>
### 5.3.3 Coefficient de brillance 200

Ici nous représentons un matériau de type Phong modifié avec un coefficient de brillance égal à 200

$$fr = \frac{202}{2*\pi}cos(\alpha)^{200}$$

<figure><img src="image_12.png" /><figcaption>Table 5: Exemple d'un matériau pré-calculé avec N=200</figcaption></figure>

Dans les tableaux (tab.5,tab.6), on voit que la projection est assez bonne même pour un matériau à forte brillance (lobe très fin).
<figure><img src="image_13.png" /><figcaption>Table 6: Exemple d'un matériau pré-calculé avec N=200, coupe V2</figcaption></figure>
<figure><img src="image_14.png" /><figcaption>Figure 7: Découpage du disque représentant la la projection orthogonale de l'hémisphère en fonction des tirage projetés sur le disque : Fig. a tirage initial. Fig. b premier niveau de découpage (en calotte centrale et des secteurs (les zone périphérique). Fig. c découpage des secteurs. Fig. d redécoupage de la calotte centrale. En rouge : évolution de la calotte centrale. En gras : celle d'un des secteurs</figcaption></figure>

# 6 Détermination des SSE

Comme expliqué dans la section 5.2, à partir de l'équation 9 pour calculer l'apport d'une SSE dans une direction donnée on a besoin de connaître l'angle solide de la SSE($\Omega_i$), $\vec{\omega}_i$ qui est défini par la position de la SSE et enfin l'éclairement dû à la SSE.

L'objectif de cette section est de montrer comment générer les SSE à partir du tirage des rayons (représentant les directions d'incidence) échantillonnant l'hémisphère

## 6.1 Génération d'arbre

L'objectif est de regrouper les rayons lancé dans différentes directions de l'hémisphère (ces rayons seront dorénavant appelés aussi tirages) en construisant un arbre tel qu'illustré par la figure 7a. Sur cette figure les points sont les projections des directions incidentes (tirages initiaux) de l'hémisphère sur la base de l'hémisphère qui est un disque. L'objectif est de subdiviser ce disque en plusieurs zones de façon récursive dans le but de créer un arbre à partir des tirages initiaux. Nous verrons qu'un parcours de cet arbre permettra de générer les SSE.

Dans le cas d'un tirage uniforme (échantillonnage uniforme de l'hémisphère) on utilise une méthode de parcours de l'arbre récursive et déterministe.

<figure><img src="image_15.png" /><figcaption>Figure 8: Exemple d'un arbre correspondant à Fig. 7</figcaption></figure>

Comme on le voit dans les figures 7b et 7d la calotte centrale est à chaque fois subdivisée en six secteurs égaux (les zones périphériques) et un élément central (la calotte centrale). Les secteurs sont subdivisés en quatre à chaque subdivision comme on peut le voir dans la figure 7c. En continuant cette subdivision de façon récursive jusqu'à un certain niveau, on obtient un arbre où chaque nœud a quatre ou six fils et les feuilles qui regroupent un ensemble des tirages représentant l'éclairement et angle solide des tirages, et chaque nœud englobe les tirages de ses fils. Chaque tirage (une direction d'incidence) est représenté par un angle solide élémentaire égal à $\Omega_i = 2\pi/nb_t$ où $nb_t$ est nombre des tirages, sa position et son éclairement égal à :

$$E(\lambda) \approx L(x, \vec{\omega}_i, \lambda) * 2\pi/nb_t * \cos(\theta)$$

Pour chaque nœud de l'arbre (SSE) on calcule les données suivantes : son éclairement (E), son angle solide $\Omega$, sa position Pos et sa normale $\vec{N}$. Ces données sont calculées à l'aide des formules suivantes où : N est utilisé pour Nœud et SN pour les nœuds fils (ou Sous Nœud).
$$
\begin{align*}
E(N) &= \sum_i E(SN_i) \\
\Omega(N) &= \sum_i \Omega(SN_i) \\
\operatorname{Pos}(N) &= \frac{\sum_i \operatorname{Pos}(SN_i) * E(SN_i)}{\sum_i E(SN_i)} \\
\vec{\operatorname{N}}_N &= \frac{\sum_i \vec{N}_{SN_i} * E(SN_i)}{\sum_i E(SN_i)}
\end{align*}
$$

La normale ($\vec{\operatorname{N}}_N$), associée à une SSE, permet de calculer les variations de l'éclairement et de l'angle solide en tout point de la zone d'influence de l'enregistrement associé à la SSE (voir section 6.4). Une fois notre arbre créé on va choisir quel nœud de notre l'arbre on veut garder, on appelle cette étape de travail le regroupement.

## 6.2 Regroupement

L'objectif est de regrouper des nœuds de l'arbre (c'est à dire regrouper des sources surfaciques équivalentes SSE) associés à un enregistrement. Pour cela on effectue un parcours descendant de l'arbre des tirages (Fig 8) déjà créé, et on applique un critère permettant de regrouper de nœuds en SSE.

Pour définir notre sélection de SSE on commence par la racine de notre l'arbre et ensuite on descend jusqu'à arriver à niveau où le critère de précision est respecté. Nous avons défini plusieurs critères d'erreur à minimiser.

<figure><img src="image_16.png" /></figure>

<figure><img src="image_17.png" /><figcaption>Figure 9: Étape de regroupement : les nœuds entourées en vert sont notre sélection SSE (N), les nœuds entourées en rouge sont les sous-nœuds (SN) situées deux niveaux plus bas dans l'arbre.</figcaption></figure>

Par exemple dans les figures 9 nous avons deux nœuds SSEs sélectionnés dans le rectangle vert et nous voulons savoir s'ils représentent bien la luminance incidente en un enregistrement, ou s'il faudrait continuer à descendre dans l'arbre. Pour cela, on compare la luminance réfléchie par l'enregistrement avec ses deux SSEs avec celles situées **K** niveaux plus bas (ici deux niveaux plus bas, contenus dans le rectangle rouge) dans l'arbre et cela pour plusieurs directions de réflexion. Cette comparaison est effectuée en évaluant une erreur relative RMSE (entre la luminance obtenue avec les SSE du rectangle vert et celle obtenue avec les SSE contenues dans le rectangle rouge). Cette erreur est normalisée avec la moyenne des luminances réfléchies avec les SSE représentées par les sous-nœuds. Cette erreur sera appelée $\epsilon_1$. Tant que $\epsilon_1$ est plus grand que le seuil défini, on doit descendre dans l'arbre, mais pour choisir le nœud à subdiviser (du rectangle vert), on calcule l'erreur $\epsilon_2$ qui est la somme des différences aux moindres carrés entre les luminances réfléchies par chaque nœud (du rectangle vert) et celles de ses sous-nœuds (se trouvant dans le rectangle rouge), puis on raffine le nœud avec la plus grande erreur $\epsilon_2$. Ceci est illustré par la figure 10.

On répète de manière itérative ce processus de raffinement tant que l'erreur $\epsilon_1$ est plus grande que le seuil d'erreur défini par l'utilisateur.
<figure><img src="image_18.png" /><figcaption>Figure 10: Étape suivante de regroupement : tant que l'erreur de notre sélection est supérieure du seuil demandé ($\tau$) on descend dans l'arbre du côté la branche contenant la nœuds induisant la plus grande erreur. Les nœuds entourés en vert sont notre sélection SSE et ce entourées en rouge sont les sous-nœuds de deux niveaux plus bas.</figcaption></figure>

<figure><img src="image_19.png" /><figcaption>Figure 11: Exemple de raffinement de l'arbre : on continue notre descend et mis à jour notre sélection de SSE et ses sous-nœuds jusqu'au trouver l'erreur plus petite que le seuil demandé ($\tau$).</figcaption></figure>

Le résultat de ce parcours permet de sélectionner un ensemble de nœuds de l'arbre de tirages qui seront les SSE associées à chaque enregistrement composant le cache.

Pour déterminer des SSEs, pour les enregistrements spéculaires et diffus, on utilise différents critères d'erreur. Pour les matériaux brillants on utilise la luminance réfléchie dans plusieurs directions pour calculer l'erreur de regroupement alors que pour les matériaux diffus, étant donné que la luminance réfléchie ne varie pas avec la direction, on utilise une autre façon de calculer l'erreur qui sera présentée plus tard.

### 6.2.1 Matériaux spéculaires

#### Erreur du regroupement ($\epsilon_1(CV(RMSE))$)

Il s'agit dans cette section de donner l'expression de l'erreur de regroupement $\epsilon_1$ évoquée ci-dessus. L'erreur du regroupement est évaluée en calculant les luminances, due à toutes les SSEs sélectionnées, réfléchies dans plusieurs directions avec celles dites de référence.

Pour une direction de réflexion $\vec{\omega}_r$ et en un enregistrement $P_0$, la luminance $Lr_{SSEs}(P_0, \vec{\omega}_r, \lambda)$ due à des nœuds SSE est donnée par l'équation 9 :

$$Lr_{SSEs}(P_0, \vec{\omega}_r, \lambda) = \sum_{i}^{nbN} Lr_{N_i}(P_0, \vec{\omega}_r, \lambda), \quad (10)$$

où $Lr_{N_i}(P_0, \vec{\omega}_r, \lambda)$ est la luminance due à un noeud SSE.
<figure><img src="image_20.png" /><figcaption>Figure 12: Exemple d'erreur de nœuds(SSE)(ε₂)</figcaption></figure>

La luminance réfléchie de référence $lr_{ref}(P_0, \vec{\omega}_r, \lambda)$ est celle due aux sous-nœuds($SN$) (nœuds fils situés $n$ niveaux plus bas) :

$$lr_{ref}(P_0, \vec{\omega}_r, \lambda) = \sum_{i}^{nbSN} Lr_{SN_i}(P_0, \vec{\omega}_r, \lambda), \quad (11)$$

où $Lr_{SN_i}(P_0, \vec{\omega}_r, \lambda)$ est la luminance apportée par un sous-nœud $SN_i$. L'erreur est $\epsilon_1$ est égale à :

$$erreur_1(\lambda) = \frac{\sqrt{\frac{\sum_{i}^{nb} \omega_r (Lr_{i}^{ref}(P_0, \vec{\omega}_{ri}, \lambda) - Lr_{i}^{regroupement}(P_0, \vec{\omega}_{ri}, \lambda))^2}{nb \omega_r}}}{\langle Lr^{ref} \rangle} \quad (12)$$

Soit $\epsilon_1$ la composante $Y$, dans l'espace de couleur $(X, Y, Z)$, associée à $erreur_1(\lambda)$. Tant que $\epsilon_1$ est supérieure à un seuil donné on parcourt l'arbre en profondeur pour sélectionner les SSE induisant le moins d'erreur, ce qui correspond à raffiner les regroupements des SSE.

## Erreur au niveau d'un nœud (SSE)(ε₂)

Pour calculer l'erreur correspondant à chaque nœud on compare la luminance réfléchie due à ce nœud à la somme des luminances réfléchies dues à ses sous-nœuds de $N$ niveaux plus bas.

On calcule la luminance $Lr^{SSE}(P_0, \vec{\omega}_{ri}, \lambda)$ du noeud que l'on compare avec la luminance $Lr^{SNs}(P_0, \vec{\omega}_{ri}, \lambda)$ due à ses sous-nœuds SNs avec la formule 9, donc :

$$Lr^{SNs}(P_0, \vec{\omega}_r, \lambda) = \sum_{j}^{nb\_SN} Lr_{SN_j}(P_0, \vec{\omega}_r, \lambda) \quad (13)$$

L'erreur au niveau de nœud est par :

$$erreur_2(\lambda) = \sum_{i}^{nb\_\omega_r} (Lr_{i}^{SNs}(P_0, \vec{\omega}_{ri}, \lambda) - Lr_{i}^{SSE}(P_0, \vec{\omega}_{ri}, \lambda))^2 \quad (14)$$

Soit $\epsilon_2$ la composante $Y$, dans l'espace de couleur $(X, Y, Z)$, associée à $erreur_2(\lambda)$.

### 6.2.2 Matériaux diffus

Dans le cas de matériaux diffus le raffinement de SSE procède par évaluer l'erreur $\epsilon_2$ avant de calculer l'erreur $\epsilon_1$.

#### Erreur au niveau d'un nœud (SSE)(ε₂):

Dans le cas de BRDF diffuse, $\epsilon_2$ ne peut être calculé à l'aide de l'équation 14 car la luminance réfléchie a la même valeur quelle que soit la direction de réflexion. C'est pourquoi nous proposons une autre façon de l'évaluer.
Soit $E_N(\lambda)$ le spectre d'un nœud $N$ représentant une SSE et $E_{SN_i}(\lambda)$ ceux de ses fils ($K$ niveaux plus bas dans l'arbre). L'expression de $\epsilon_2$ est définie par :

$$ \text{erreur}_2(\lambda) = \sum_{i}^{nb\_SN} ((E_N'(\lambda) * Y_{SN_i} - E_{SN_i}(\lambda))^2, $$

où $E_N'(\lambda) = E(\lambda)/Y_N$, $Y_N$ et $Y_{SN_i}$ sont respectivement les luminances correspondant aux spectres $E_N(\lambda)$ et $E_{SN_i}(\lambda)$. $\epsilon_2$ est la composante $Y$, dans l'espace de couleur $(X, Y, Z)$, associée à $\text{erreur}_2(\lambda)$.

### Erreur de regroupement ($\epsilon_1(\text{CV}(\text{RMSE}))$):

Donc notre pourcentage d'erreur est :

$$ \epsilon_1 = \frac{\sqrt{\frac{\sum_{i}^{n} \epsilon_{2i}^2}{n}}}{Y}, \qquad (15) $$

Où $Y$ est la luminance associée à l'éclairement de l'enregistrement (éclairement de la racine de l'arbre des tirages) et $\epsilon_{2i}$ est l'erreur $\epsilon_2$ du nœud $i$ (représentant la SSE $i$ sélectionnée au niveau courant lors du parcourt de l'arbre).

### 6.2.3 Algorithme:

Sélection_SSE(Arbre, Prof, n, τ)

{

Pour chaque Nœuds $N_i$, de profondeur Prof faire

$$ \epsilon_2^f = \text{Calcul\_espilon\_2}(N_i, n) $$

$$ \text{Ajout\_SSE}(N_i, T_{SSE}) $$

FinPour

$$ \epsilon_1 = \text{Calcul\_espilon\_1}(T_{SSE}, n) $$

Tant que ($\epsilon_1 > \tau$) faire

$$ N_m = \text{Nœud\_Max\_epsilon\_2}(T_{SSE}) $$

$$ \hat{\text{Oter}}(N_m, T_{SSE}) $$

Pour chaque nœud $N_f$ fils de $N_m$ faire

$$ \epsilon_2^f = \text{Calcul\_espilon\_2}(N_f, n) $$

$$ \text{Ajout\_SSE}(N_f, T_{SSE}) $$

FinPour

$$ \epsilon_1 = \text{Calcul\_espilon\_1}(T_{SSE}, n) $$

FinTant que

}

Une fois l'arbre des tirage déterminé, on fait appel à la fonction **Sélection_SSE**(Arbre, Prof, n, τ) dont le rôle est de calculer les SSE et les stocker dans un tableau $T_{SSE}$. Les paramètres de cette fonction sont :

* Arbre : l'arbre des tirages,

* Prof : profondeur (fixée par l'utilisateur) à partir de laquelle on commence à déterminer les SSE,

* n : utilisé pour le calcul de $\epsilon_2$ entre le nœud courant ($N_i$ ou $N_f$ dans l'algorithme) et ses sous-nœuds situées $n$ niveaux plus bas dans l'arbre, ainsi que pour le calcul de $\epsilon_1$.

* τ : seuil au delà duquel les SSE sont raffinées.

La fonction **Ajout_SSE**(N, $T_{SSE}$) a pour objectif d'insérer un nœud SSE dans le tableau $T_{SSE}$ dans lequel sont stockées les SSE courantes sélectionnées. La fonction $\hat{\text{Oter}}(N, T_{SSE})$ permet de retirer un nœud SSE du tableau $T_{SSE}$.
<figure><img src="image_21.png" /><figcaption>Figure 13: En haut à gauche : configuration de la scène et position de l'enregistrement $x_p$ dans la scène. En haut à droite : image "fisheye" depuis la position d'enregistrement. En bas à gauche : courbes des RMSE pour différents exposants de Phong en fonction du nombre de SSE. En bas à droite projection d'une direction de reflexion sur la base de l'hémisphère.</figcaption></figure>

## 6.3 Résultat

Nous montrons dans cette section la luminance réfléchie par un enregistrement dans un ensemble de directions $\omega_r$. Chaque pixel correspond à une direction de réflexion Fig.13

Pour des lobes très fins la luminance n'est significative que dans une petite portion de l'image alors qu'elle est très faible ailleurs. C'est pourquoi nous avons utilisé un facteur multiplicatif.

Pour calculer les images références on utilise un tirage uniforme et la BRDF de Lafortune et on évalue l'intégrale suivante :

$$L_r(x, \vec{\omega}_r, \lambda) = \int_{\Omega} L_i(x, \vec{\omega}_i, \lambda) f_r(x, \vec{\omega}_i, \vec{\omega}_r, \lambda) \cos(\theta_i) d(\omega_i) \quad (16)$$

En utilisant la méthode de Monte-Carlo on obtient :

$$L_r(x, \vec{\omega}_r, \lambda) = 2\pi/nb_T \sum_{i=1}^{nb_T} L_i(x, \vec{\omega}_i, \lambda) f_r(x, \vec{\omega}_i, \vec{\omega}_r, \lambda) \cos(\theta_i), \quad (17)$$

où $nb_T$ est le nombre total de tirages. Pour calculer des images de chaque étape du raffinement de notre arbre, on utilise l'équation 9.

Comme on peut le constater dans le tableau (tab 7), pour des matériaux peu brillants quelques SSE (environ une douzaine) suffisent pour calculer la luminance réfléchie dans toutes les directions avec une bonne précision, et quand les
<table><caption>Table 7: Exemple pour différents matériaux : luminance réfléchie dans des différentes directions. Les images de la première colonne sont des images de référence calculées comme expliqué déjà avec l'équation 17. Ensuite les résultats de notre méthode, avec différents nombres de SSE ($nb_{SSE}$), sur les lignes paires on voit les images de différence en fausse couleur. De haut vers le bas : les matériaux sélectionnés deviennent de plus en plus brillants ($n$ est le coefficient de brillance)</caption><thead><tr><th></th><th>Référence</th><th>nb<sub>SSE</sub> = 9</th><th>nb<sub>SSE</sub> = 50</th><th>nb<sub>SSE</sub> = 116</th></tr></thead><tbody><tr><td>n = 40</td><td></td><td></td><td></td><td></td></tr><tr><td>n = 100</td><td></td><td></td><td></td><td></td></tr><tr><td>n = 200</td><td></td><td></td><td></td><td></td></tr></tbody></table>
<figure><img src="image_22.png" /><figcaption>Figure 14: Comparaisons qualitatives, pour divers exposants *n* de la BRDF de Phong modifié, entre notre approche avec SSE (ligne du bas) et les harmoniques hémisphériques utilisées dans la méthode de radiance caching originale (RC) [?](ligne du haut). Les fausses couleurs illustrent la différence avec une solution de référence (rouge représentant des différences élevées et bleu foncé des différences faibles). Pour chaque résultat, la taille mémoire est indiquée en kilo octet.</figcaption></figure>

matériaux deviennent de plus en plus brillants le nombre des SSEs augmente, mais avec seulement une centaine de SSE on peut facilement prendre en compte des matériaux brillants avec un coefficient de brillance (exposant) de 200.

## Comparaison avec les harmoniques hémisphériques:

Dans la figure 14, nous comparons la luminance réfléchie obtenue par notre méthode et la méthode proposée par Křivánek et al. [?] à l'aide des harmoniques hémisphériques. Pour les deux méthodes, nous utilisons la configuration de scène illustrée dans la figure 13 ainsi que le même nombre de rayons incidents par enregistrement. Pour une qualité d'image fixe (RMSE équivalente), nous comparons également la taille mémoire en fonction de l'exposant *n* du modèle de Phong modifié. À l'exception des BRDFs basses fréquences (*n* = 5), dont la taille mémoire des enregistrements est à peu près équivalente pour chacune des méthodes, notre approche permet d'obtenir des résultats de meilleure qualité pour un coût mémoire beaucoup plus faible. En outre, la distribution des erreurs est plus lisse avec les SSE puisque les harmoniques hémisphériques produisent des effets d'ondulation.
## 6.4 Calcul de la variation de luminance autour d'un enregistrement

Étant donné un ensemble d'enregistrements constituant le cache l'objectif maintenant est d'évaluer la luminance réfléchie en un point situé dans la zone d'influence d'un enregistrement. Pour cela, il faudrait exprimer la variation la luminance d'un enregistrement dans sa zone d'influence. Soit une SSE C et un enregistrement P (Fig.15). On veut exprimer la luminance d'un point P' se trouvant dans la zone d'influence de P. On a besoin de calculer la nouvelle direction incidente ($\vec{\omega}_i$) et aussi la variation de l'éclairage et l'angle solide dans la zone d'influence de l'enregistrement (Fig.15).

<figure><img src="image_23.png" /><figcaption>Figure 15: exemple des variations d'une SSE dans la zone d'influence d'un enregistrement</figcaption></figure>

Soit $E_i$ l'éclairement de la SSE et $d$ la distance de l'enregistrement $P$ à la SSE. Ainsi, pour le point $P'$ l'éclairement $E'$ et le nouvel angle solide $\Omega'$, sous lequel $P'$ voit la SSE, seront approchés par les équations suivantes :

$$ 
\begin{aligned}
\vec{I}' &= C - P' \\
d'^2 &= \langle \vec{I}'.\vec{I}' \rangle = \|I'\|^2 \\
I'' &= \|I'\| \\
cos(\theta') &= \langle \vec{I}'.\vec{N}' \rangle \\
cos(\alpha') &= \langle \vec{I}'.\vec{N}'' \rangle
\end{aligned}
$$

$$ E' = E * \frac{d^2}{d'^2} * \frac{cos(\theta')}{cos(\theta)} * \frac{cos(\alpha')}{cos(\alpha)} \quad (18) $$

$$ \Omega' = \Omega * \frac{d^2}{d'^2} * \frac{cos(\theta')}{cos(\theta)} * \frac{cos(\alpha')}{cos(\alpha)} \quad (19) $$

La luminance réfléchie au point $P'$ est calculée en utilisant l'équation 9 en prenant comme angle solide et éclairement les valeurs de $\Omega'$ et $E'$, ainsi que la nouvelle position de la SSE par rapport à $P'$. Pour accélérer les calculs au moment de création d'enregistrement on peut précalculer :

$$ \text{coef} = \frac{d^2}{cos(\theta) * cos(\alpha)} $$

pour chaque SSE, ce qui permet d'évaluer rapidement dans la zone d'influence de l'enregistrement les valeurs de :

$$ E' = E * \text{coef} * \frac{cos(\theta') * cos(\alpha')}{d'^2} \quad (20) $$

et

$$ \Omega' = \Omega * \text{coef} * \frac{cos(\theta') * cos(\alpha')}{d'^2} \quad (21) $$

Dans les expressions 18 et 19 on suppose que la visibilité des SSE à partir de deux points voisins ne varie pas. Comme perspective de travaille il serait intéressant d'introduire un gradient de visibilité.
<table><caption>Table 8: Description de la scène indiquant les valeurs de l'exposant du modèle de Phong modifié, le type d'éclairage utilisés stocké dans les enregistrements, l'indication si la comparaison avec des harmoniques hémisphériques (RC) est possible, le nombre moyen de SSE par enregistrement, le nombre d'enregistrements brillants, le nombre total d'enregistrements ainsi que la taille totale de la structure de données en mégaoctets.</caption><thead><tr><th>scène</th><th>exposants Phong</th><th>Éclairage</th><th>RC</th><th>SSE moy. /enr.</th><th># enr. brillants</th><th># Total enr.</th><th>Taille (Mo)</th></tr></thead><tbody><tr><td>Matpreview</td><td>40 / 100</td><td>Tous (Direct Haut Freq.)</td><td>Oui</td><td>185 / 392</td><td>2.5 k / 2.3 k</td><td>5.6 k</td><td>19.1 / 36.6</td></tr><tr><td>Dragon</td><td>20 / 80 / 100</td><td>Indirect</td><td>Oui</td><td>188</td><td>16.8 k</td><td>24.3 k</td><td>126</td></tr><tr><td>Cornell</td><td>40 / 100 / 200</td><td>Indirect</td><td>Non</td><td>300</td><td>3.8 k</td><td>10.7 k</td><td>45.6</td></tr><tr><td>Campervan</td><td>100 / 200</td><td>Tous</td><td>Non</td><td>50</td><td>25.8 k</td><td>36.4 k</td><td>51.6</td></tr><tr><td>Kitchen</td><td>200</td><td>Indirect</td><td>Non</td><td>115</td><td>15 k</td><td>31 k</td><td>69</td></tr></tbody></table>

## 6.5 Résultats

Nous comparons les résultats obtenus avec notre méthode à des images de référence générées avec la méthode de suivi de chemin (PT) [?]. Pour PT, 50k rayons sont tracés par pixel. Notre méthode a été mise en œuvre dans la plate-forme de rendu *Mitsuba* [?]. Nous avons utilisé le processus de mise en cache et la création d'enregistrements de *Mitsuba*. Nous avons seulement ajouté des fonctions pour le calcul des SSE et l'interpolation. Aussi, pour les images calculées à l'aide de Radiance caching [?] (RC) nous avons implémenté cette méthode dans *Mitsuba* en utilisant la bibliothèque d'origine [?]. Pour toutes nos scènes de test, le rayon de la zone d'influence d'un enregistrement est calculé comme étant la distance minimale des objets à partir d'une position de l'enregistrement, comme dans [?]. La luminance incidente à un enregistrement est calculée à l'aide d'un suivi de chemin PT. Pour obtenir une estimation précise de l'éclairement associé à chaque SSE, 4k échantillons (directions d'incidence) sont générés sur l'hémisphère stratifié. Nous avons également utilisé la technique de *neighbor clamping* proposé par Krivanek et al. [?] et qui permet de régler la valeur des rayons des zones d'influence des enregistrements en fonction de la visibilité. Notons aussi que ces mêmes paramètres sont utilisés pour la méthode RC.

Pour démontrer la capacité de notre méthode à générer des effets de lumière complexes en raison de surfaces très brillantes, nous avons rendu cinq scènes avec des caractéristiques spécifiques d'éclairage (voir la table 8). Pour chaque scène, la qualité visuelle des résultats obtenus est comparée à une référence calculée avec PT. Les différences sont présentées avec des images en fausses couleur à l'aide d'une distance géométrique définie dans l'espace *RVB*. Nous comparons notre méthode avec RC pour les deux scènes apparaissant dans les figures 16 et 17. Ces scènes contiennent des BRDF de Phong modifié avec un exposant de brillance *n* inférieur à 100, puisque RC ne peut pas être utilisé pour les matériaux avec *n* plus élevé [?]. Les paramètres communs aux deux méthodes (SSE et RC) ont toujours été initialisés avec les mêmes valeurs. Les autres scènes sont composées de matériaux haute fréquence qui ne peuvent pas être traités par RC. Les statistiques de rendu pour toute les scènes sont présentées dans le tableau 10.

### Scène test Matpreview

Le scène Matpreview (figure 9) se compose d'un objet sphérique brillant (modèle de Phong avec différents coefficients de brillance) se trouvant sur un plan diffus texturé. La source de lumière est une carte d'environnement haute fréquence. Toutes les contributions lumineuses (directe et indirecte) sont stockées dans les enregistrements. Environ 3700 enregistrements sont créés sur la sphère brillante tandis que 6700 enregistrements ont été calculés pour l'ensemble de la scène. Malgré la configuration d'éclairage difficile pour une méthode de mise en cache (carte d'environnement de haute fréquence, enregistrements contenant les composantes directes et indirectes), notre technique fournit de bons résultats et les artefacts sont difficilement visibles. Notre méthode réussit à reproduire le reflet de l'échiquier sur l'objet sphérique brillant même avec un coefficient de brillance élevé de 200.
<table><caption>Table 9: Exemple de différents matériaux pour la scène Matpreview. La première colonne présente des images de référence calculées par la méthode de suivi de chemin. Les résultats de notre méthode sont donnés dans la colonne de milieu. Les images de différence en fausse couleur se trouvent sur la colonne de droite.</caption><thead><tr><th></th><th>Référence</th><th>Résultat</th><th>différence</th></tr></thead><tbody><tr><td>N = 40</td><td></td><td></td><td></td></tr><tr><td>N = 100</td><td></td><td></td><td></td></tr><tr><td>N = 200</td><td></td><td></td><td></td></tr></tbody></table>
<figure><img src="image_24.png" /><figcaption>Figure 16: Comparaison entre notre approche et RC avec la scène *Matpreview*, éclairée par une carte d'environnement. Les enregistrements stockent l'éclairement direct et indirect pour les deux méthodes, la taille d'un enregistrement est mentionnée en kilo-octets. Les statistiques complètes sont résumées dans le tableau 10.</figcaption></figure>
<table><caption>Table 10: Comparaison avec l'algorithm de Radiance Caching (RC) : dans chaque cas, notre méthode offre de meilleurs résultats (plus basse RMSE) avec des enregistrements de taille mémoire inférieure et un rendu plus rapide.</caption><thead><tr><th rowspan="3"></th><th colspan="4">Matpreview (Figure 16)</th><th colspan="2">Dragon (Figure 17)</th></tr><tr><th colspan="2">Phong n = 40</th><th colspan="2">Phong n = 100</th><th rowspan="2">RC</th><th rowspan="2">SSE</th></tr><tr><th>RC</th><th>SSE</th><th>RC</th><th>SSE</th></tr></thead><tbody><tr><td># enr. brillant</td><td>2740</td><td><strong>2585</strong></td><td>3103</td><td><strong>2348</strong></td><td>20000</td><td><strong>16800</strong></td></tr><tr><td>taille enr. (Ko)</td><td>14.4</td><td><strong>7.4</strong></td><td>30.3</td><td><strong>15.6</strong></td><td>14.4</td><td><strong>7.5</strong></td></tr><tr><td>Mémoire<br>utilisée (Mo)</td><td>39.4</td><td><strong>19.1</strong></td><td>94</td><td><strong>36.6</strong></td><td>288</td><td><strong>126</strong></td></tr><tr><td>durée du rendu</td><td>20 min.</td><td><strong>12 min.</strong></td><td>30 min.</td><td><strong>16 min.</strong></td><td>2.5 h.</td><td><strong>2 h.</strong></td></tr><tr><td>RMSE</td><td>0.04</td><td><strong>0.03</strong></td><td>0.06</td><td><strong>0.03</strong></td><td>0.06</td><td><strong>0.04</strong></td></tr></tbody></table>

## Scène Dragon

Le scène Dragon (Figure 17) est composée d'une pièce cubique dont le mur du fond a une valeur de brillance *n* égale à 20. À l'intérieur de cette pièce se trouvent un cube (*n* = 100) et un dragon (*n* = 80).

## Discussion avec la comparaison RC

En général, notre méthode surpasse la méthode originale RC. Les enregistrements avec SSE nécessitent deux fois moins de mémoire. Notre représentation de la luminance incidente à l'aide des SSE permet de créer moins d'enregistrements sans compromettre la qualité visuelle tout en réduisant le temps de rendu. Cela est vrai pour les matériaux très brillants (*n* = 100) mais aussi pour les matériaux modérément brillants ( scène Matpreview dans la figure 16). De plus, nos rendu ne sont pas soumis à des artefacts dus à des *effets d'ondulation* souvent visibles avec des harmoniques hémisphériques, comme visible sur le cube de la scène Dragon dans la figure 17.
<figure><img src="image_25.png" /><figcaption>Figure 17: Scène du dragon (indirect seulement) : la taille mémoire des enregistrements est donnée en kilo octets (les statistiques sont données dans le tableau 10). Les images en fausses couleurs représentent la différence avec la solution de référence.</figcaption></figure>
## Scène Cornell Box

Le scène Cornell Box (Figure 18), est composée d'une pièce cubique dont le mur du fond a une valeur de brillance égale à 100. À l'intérieur de cette pièce se trouvent deux cubes, la valeur de brillance du plus grand cube est égale à 200 alors qu'elle est de 40 pour le plus petit. On remarque que notre méthode gère bien les différentes réflexions dans la scène, entre autre celle du petit cube sur le grand cube. Le fait d'augmenter le nombre moyen de SSE, jusqu'à 300 par enregistrement sur une surface brillante, supprime les artefacts visuels dans les coins et sur les réflexions sans toutefois augmenter le nombre global d'enregistrements (3806 enregistrements brillants parmi 10770 pour l'ensemble de la scène 18).
<figure><img src="image_26.png" /><figcaption>Figure 18: Scène Cornell Box (éclairage indirect uniquement) avec des matériaux brillants associé au mur du fond (100), le grand cube (200) et le petit cube (40). Au milieu, des gros plans de la zone encadrée en rouge montrent la qualité des résultats lorsqu'on augmente le nombre de *SSE*. L'erreur globale *RMSE* diminue considérablement lorsque le nombre de *SSE* augmente.</figcaption></figure>

## Scène Camping-car

La scène camping-car (figure 19) est rendu avec 25800 enregistrements brillants parmi un total de 36378. Le grand nombre d'enregistrements est dû aux détails géométriques et à une distance minimale très petite utilisée pour déterminer le rayon de la zone d'influence d'un enregistrement. Les enregistrements stockent les contributions directes et indirectes de la carte
d'environnement (modèle de ciel clair). Malgré le faible nombre de SSE par enregistrement (50 par enregistrement en moyenne) notre méthode réussit à reproduire des effets d'éclairage complexes, tels que la réflexion du soleil sur le chrome du camping-car.

<figure><img src="image_27.png" /><figcaption>Figure 19: Le scène **camping-car** éclairée avec une carte d'environnement. Notre méthode rend les matériaux brillants sans artefact visuel. Chaque enregistrement stocke les éclairages indirectes et directes de la carte d'environnement. La carrosserie et le chrome du camping-car sont constitués d'un matériau défini par un modèle de Phong avec une brillance de 100, tandis que les verres ont une brillance de 200.</figcaption></figure>
## Scène Boule1

La scène comprend une boule diffuse texturée (couleur rouge et vert) sur un sol brillant. Elle est éclairée par une carte d'environnement (Fig. 11). Un enregistrement ne stocke que l'éclairage indirect.

Dans cette scène on voit que notre méthode calcule avec précision les variations de la luminance sur une surface diffuse courbe (sphère) sans avoir à utiliser des gradients de rotation. En outre le reflet de la sphère sur le plan brillant ne présente pas d'artefacts.
<table><caption>Table 11: Exemple de différents matériaux pour la scène Boule1. Les images de la première colonne sont des images de référence calculées par la méthode de suivi de chemin. Les résultats de notre méthode sont présentés dans la deuxième colonne. La colonne de droite présente les images de différence en fausse couleur</caption><thead><tr><th></th><th>Référence</th><th>Résultat A</th><th>Résultat B</th></tr></thead><tbody><tr><td>N = 40</td><td></td><td></td><td></td></tr><tr><td>N = 100</td><td></td><td></td><td></td></tr><tr><td>N = 200</td><td></td><td></td><td></td></tr></tbody></table>
## Scène Boule2

La scène comprend une boule brillante sur un sol diffus texturé (couleur rouge et vert). Elle est éclairée par une carte d'environnement (Fig. 12). Ces deux objets sont entourés par quatre murs. Un enregistrement ne stocke que l'éclairage indirect.

Dans cette scène on voit que notre méthode calcule avec précision les variations de la luminance sur une surface brillante courbe (sphère) sans avoir à utiliser des gradients de rotation. les reflets du plan texturé sur la sphère brillante sont bien rendus.
<table><caption>Table 12: Exemple de différents matériaux pour la scène Boule2. Les images de la première colonne sont des images de référence calculées par la méthode de suivi de chemin. Les résultats de notre méthode sont présentés dans la deuxième colonne. La colonne de droite présente les images de différence en fausse couleur</caption><thead><tr><th></th><th>Référence</th><th>Résultat A</th><th>Résultat B</th></tr></thead><tbody><tr><td>N = 40</td><td></td><td>CV(rmse) = 0.0087209355114</td><td>CV(rmse) = 0.00679753981464</td></tr><tr><td>N = 100</td><td></td><td>CV(rmse) = 0.00755527737131</td><td>CV(rmse) = 0.00607990965891</td></tr><tr><td>N = 200</td><td></td><td>CV(rmse) = 0.00729393729361</td><td>CV(rmse) = 0.00724978340333</td></tr></tbody></table>