Technique de la radiosité

Un article de tsotd.


Attention


Cet article est en attente du choix d'une licence par son auteur. Elle n'est pas soumise à la licence par défaut du GCN.

Cela signifie entre autre chose que si vous n'êtes pas l'auteur de cet article, vous n'avez probablement pas le droit de le modifier.


Sommaire

[modifier] Principe

La méthode dite de radiosité, empruntée au génie thermique, calcule la contribution globale diffuse, c'est à dire la contribution diffuse des objets de la scène. Elle calcule les contributions directes et indirectes.

Principe de la méthode de Radiosité
Principe de la méthode de Radiosité

Cette méthode se limite au traitement des surfaces idéalement diffuses. On peut reconnaître une surface diffuse au fait que l'impression lumineuse correspondante ne dépend pas de la direction du regard, mais uniquement des conditions d'éclairage (on ne remarque pas de reflets). La méthode de radiosité réalise une séparation entre le calcul de l'éclairage des surfaces de la scène et la partie calcul de l'image finale. Le calcul de l'éclairage est indépendant du point de vue, et réalisé une seule fois (contrairement au lancer de rayon pour lequel on re-calcule l'éclairage direct à chaque nouvelle image). Cette séparation permet à l'utilisateur de se déplacer en temps réel dans des scènes virtuelles pour lesquelles l'éclairage a déjà été calculé.

La méthode de radiosité découpe la scène en carreaux élémentaires pour lesquels on considère l'éclairage constant (pendant la phase de calcul). La résolution du système d'équation linéaire (correspondant à l'expression de l'interdépendance de l'éclairage des objets) conduit à l'obtention des luminances des carreaux élémentaires. Une interpolation est réalisée entre les centres des carreaux lors de l'affichage final. Dans la suite, nous détaillerons et justifions les différentes étapes de la méthode de radiosité.

[modifier] Découpage de la scène en facettes : le maillage

Nous disposons de la scène sous la forme d'une liste de faces à visualiser qu'il nous faut maintenant « mailler ». Pour ce faire, nous optons pour une méthode simple qui consiste à découper récursivement les faces en 4. Un découpage de profondeur n divisera une face en 2n par 2n facettes. Chaque face est découpée en facettes qui à leur tour seront découpées. Pour déterminer les nouvelles coordonnées d'une facette, on utilise pour cela le repère interne à la facette : les coordonnées du point au centre est alors Origine + (U+V) / 2.

Découpage de profondeur 2 d'une face
Découpage de profondeur 2 d'une face

L'algorithme de subdivision est le suivant :

Subdivision( profondeur )
  Si (profondeur > = 1) Alors
    (f1,f2,f3,f4) = séparation géométrique de le face en 4 facettes
    Subdivision de f1 ( profondeur ? 1 )
    Subdivision de f2 ( profondeur ? 1 )
    Subdivision de f3 ( profondeur ? 1 )
    Subdivision de f4 ( profondeur ? 1 )
  FinSi
Fin

L'ensemble de la subdivision est mémorisé sous la forme d'un arbre dont la relation de filiation correspond à une profondeur de découpage. Chaque face ou facette connaît alors ses propres facettes filles, celles-ci étant enregistrées dans un tableau. Ces facettes d'indices 0,1,2 et 3 représentent alors la disposition suivante.

Répartition des facettes filles
Répartition des facettes filles
Arbre de découpage d'une face
Arbre de découpage d'une face

[modifier] Affichage de la scène

Pour la réalisation de l'affichage final, seule les facettes « feuilles » dans l'arbre de découpage sont affichées. De plus pour améliorer de façon notable le réalisme du rendu, nous procéderons à une interpolation des valeurs de luminosités entre les facettes après le calcul effectué. Pour cette étape, nous devons donc utiliser la relation de voisinage entre les facettes feuilles.

[modifier] Sauvegarde du « voisinage »

Nous introduisons la méthode qui consiste à mémoriser pour chaque face l'ensemble des facettes qui la composent après découpage. Cette mémorisation doit être ordonnée de façon à pouvoir récupérer le voisin d'une facette facilement. Nous utilisons pour ce faire une matrice contenant un numéro identifiant la facette dans l'arbre de découpage. Ce numéro correspond en fait à l'indice de la facette dans la liste complète des facettes de la face.

Lorsque le maillage est terminé, nous connaissons la profondeur de l'arbre de découpage donc le nombre de facettes de la face : 2n par 2n, n profondeur de découpage. Nous pouvons donc créer une matrice de dimension 2n par 2n. Il ne reste plus qu'à remplir la matrice avec les bonnes valeurs : l'indice de la facette dans la liste des facettes de la face. Pour ce faire, on utilise des indices de parcours pour déterminer la position de chaque facette lors du parcours de l'arbre de découpage.

L'algorithme est le suivant :

Remplissage ( profondeur, x_position , y_position)
  Si profondeur ? 0 Alors
    delta = 2^( profondeur - 1)
    Fils[0]->Remplissage(profondeur-1,x_position      , y_position)
    Fils[1]->Remplissage(profondeur-1,x_position+delta, y_position)
    Fils[2]->Remplissage(profondeur-1,x_position+delta, y_position+delta)
    Fils[3]->Remplissage(profondeur-1,x_position      , y_position+delta)
  Sinon
    Matrice voisin ( x_position,y_position) = indice facette courante
  Finsi
Fin


Le premier appel se fait avec les paramètres (profondeur,0,0). A la fin, toutes les faces ont été parcourues et ont reçu leurs coordonnées.

Pour créer la liste des facettes de la face, on peut profiter du parcours de l'arbre de découpage fait par la fonction remplissage pour ajouter toutes les facettes feuilles. On peut alors aisément récupérer l'indice de la face.

L'algorithme est alors le suivant :

Remplissage ( profondeur, x_position , y_position)
  Si profondeur ? 0 Alors
    delta = 2^( profondeur - 1)
    Fils[0]->Remplissage(profondeur-1,x_position      ,y_position)
    Fils[1]->Remplissage(profondeur-1,x_position+delta,y_position)
    Fils[2]->Remplissage(profondeur-1,x_position+delta, y_position+delta)
    Fils[3]->Remplissage(profondeur-1,x_position      , y_position+delta)
  Sinon
    Matrice voisin ( x_position,y_position) = taille de la liste
    Ajoute la face courante à la liste
    PositionFace = (x_position,y_position)
  Finsi
Fin

[modifier] Interpolation

L'étape de l'interpolation consiste à réaliser une transition douce entre les carreaux du maillage. Pour cela, on interpole la couleur de chaque point du carreau suivant la méthode de Gouraud. Cette technique effectue une interpolation de la couleur d'un point à partir de la couleur des sommets de la facette. Il faut donc affecter à chaque sommet une couleur pour que la transition entre carreaux soit régulière. Nous définissons donc la couleur de chaque sommet comme étant la moyenne des couleurs des facettes contenant ce sommet.

Voisinage d'une facette
Voisinage d'une facette
Interpolation de valeur
Interpolation de valeur

La couleur à calculer pour le point donné est alors la moyenne des valeurs v0,v1,v2,v3.

Ceci est possible quand les voisins existent ce qui n'est pas le cas pour les facettes du bord où il manque un voisin, et pour les facettes en coin où il manque deux voisins.

Lorsqu'il manque un ou plusieurs voisins, la première approche consiste à considérer que le voisin manquant a pour couleur la même que celle de la face en cours. Cette technique génère des effets indésirables lorsqu'une face est dans le prolongement d'une autre. Si un dégradé apparaît sur la longueur des deux faces, alors l'interpolation n'est pas optimale.

Problème d'interpolation au bord
Problème d'interpolation au bord

En effet, les sommets à gauche de F2 seront interpolés en utilisant la couleur de F1 et de F2 : aucun problème. Par contre, les sommets à droite de F2 seront interpolés avec la couleur de F2 et de F2 : ce qui donne F2, alors que l'idéal serait la moyenne entre F2 et F3. Or s'il y a un dégradé et que F1>F2>F3>F4, alors, il apparaît une discontinuité entre F2 et F3.

Une autre méthode consiste alors à « prédire » la couleur du voisin droit de F2 en estimant que F2 est la moyenne entre F1 et ce voisin imaginaire. De ce fait, la couleur de celui-ci est alors de Fdroit = 2*F2 – F1. Cette solution apporte un meilleur résultat à l'interpolation. Cependant, des défauts peuvent encore apparaître en particulier quand le passage d'une face à une autre n'est pas régulier (ce qui est souvent le cas quand le maillage n'est pas assez fin). On voit alors apparaître une frontière de discontinuité entre les deux faces.

Quand la facette est en coin, on utilise le voisin opposé à celui qui manque.

[modifier] Calcul de la radiosité

[modifier] Bilan énergétique

La méthode de radiosité est basée sur une équation du bilan énergétique exprimé pour une surface. Les surfaces de la scène sont supposées diffuses ce qui signifie que la luminance (c'est à dire le flux par unité de surface et unité de d'angle solide projeté, notons que l'œil est sensible à la luminance) issue de chaque surface est constante dans toutes les directions. On peut donc utiliser la grandeur physique émittance (également appelée radiosité) caractérisant le flux total quittant une surface sans dépendance de direction, c'est le flux émis par unité de surface.

En réalisant le bilan énergétique pour une surface, on obtient que le flux quittant une surface est égal au flux auto-émis par cette surface (flux non nul si la surface est une source de lumière) additionné aux flux reçus des autres surfaces multiplié par ri la réflectivité (comprise entre 0 et 1) qui représente la couleur de l'objet (une valeur de r par composante de couleur utilisée).

Bilan énergétique pour une surface
Bilan énergétique pour une surface

[modifier] Équation de la radiosité

Le flux BiAi émis par la surface i d'aire Ai est donc égal au flux EiAi auto-émis additionné à la somme des flux reçus des autres surfaces j soit BjAj multiplié par un coefficient Fji compris entre 0 et 1, caractérisant la proportion de flux reçu par la surface i depuis la surface j. Le coefficient Fji est appelé facteur de forme et est expliqué dans la suite. On obtient l'équation ci-dessous appelée équation de radiosité :

Equation radiosité 1

Cette équation est valide pour chaque surface de la scène à traiter, ce qui fait apparaître un système d'équation dont les inconnues sont les émittances Bi des surfaces. S'il y a N carreaux dans la scène, il y a alors N équations et N inconnues.

Equation radiosité 2

[modifier] Résolution du système

Le système obtenu est résolu par des techniques classiques de résolution de systèmes linéaires (Gauss-Siedel, Jacobi). Un problème se pose pourtant, celui du stockage des coefficients de la matrice. En effet, après subdivision de la scène en carreaux (pour lesquels on calculera l'émittance), le nombre de carreaux peut s'élever, pour une scène complexe, à plusieurs millions. Pour cette raison, on utilise une résolution itérative appelée « radiosité progressive » qui fait émettre les carreaux les uns après les autres en commençant par les sources de lumière et les carreaux les plus émetteurs (ayant alors la plus grande participation dans le résultat final). A chaque itération, l'algorithme délivre une solution approchée. Il peut être interrompu en cours de résolution si la solution est satisfaisante ou bien effectué durant la visualisation de la scène.

La méthode consiste à calculer la participation BiAi de la surface i sur les surfaces j. Pour chaque surface, on mémorise la quantité d'énergie reçue qu'elle n'a pas encore émise dans la scène donc pas encore propagée.

Calcul de la radiosité
// initialisation
  Pour i de 1 à N
    Si estEmetteur(i)
    Alors
      Rad[i] <- Rad(i)
      Drad[i] <- Rad(i)
    Sinon
      Rad[i] <- 0
      Drad[i] <- 0
    FinSi
  FinPour
  // resolution
  Tant que Solution non satisfaisante faire
    P <- carreau Flux Max
    Pour i de 1 à N
      RadRecu <- Ap/Ai * FFpi * Drad[p]
      Rad[i] <- Rad[i] + rho(i) * RadRecu
      Drad[i] <- Rad[i] + rho(i) * RadRecu
    FinPour
    Drad[p] <- 0
  FinTantQue
Fin

Rad est la radiance d'une surface et Drad est la radiosité latente : la partie de l'énergie reçue et non encore émise

[modifier] Le facteur de forme

Le calcul des facteurs de forme est peut-être la partie la plus complexe de la méthode de radiosité. Rappelons qu'il représente la proportion de lumière reçue par une surface quand une autre surface émet de la lumière. Le facteur de forme est un terme purement géométrique. Il ne dépend que de la forme et de la situation spatiale des deux objets. La somme, pour une surface donnée, des facteurs de formes avec les autres surfaces est égale à 1, ce qui garantit la conservation de l'énergie (à condition que la scène soit un espace clos). Analytiquement, le facteur de forme FFij s'écrit :

Radiosité: facteur de forme

dAi et dAj sont des surfaces élémentaires des surfaces i et j, fi et fj sont les angles d'incidences, r la distance entre les surface élémentaires et hji le coefficient de visibilité (=1 si les surfaces élémentaires se voient et =0 sinon).

Géométrie du facteur de forme
Géométrie du facteur de forme

En pratique, on simplifie la double intégrale. Remarquons que si n est le nombre de carreaux dans la scène, ce calcul peut être effectué fois ce qui rend intéressant toute simplification raisonnable.

Une première simplification consiste à considérer les surfaces comme extrêmement petites. Cette hypothèse entraîne bien des remarques. En effet, les surfaces peuvent alors être considérées comme des surfaces élémentaires dAi et dAj, ce qui a pour but de supprimer les 2 intégrales du calcul de facteur de forme. On peut aussi supposer alors que r est constant ainsi que les fi et fj. Ainsi, le calcul du facteur de forme se réduit à :

Radiosité: facteur de forme 2

Soit:

Radiosité: facteur de forme 3

[modifier] Conclusion

La technique de calcul de l'illumination globale permet de calculer au mieux la composante de lumière ambiante due aux réflexions diffuses multiples générées sur chaque surface à l'intérieur d'une scène. Elle permet l'obtention d'images aux lumières douces telles qu'elles apparaissent très souvent dans la réalité.

La technique de calcul de radiosité faisant intervenir des facteurs purement géométriques, toute modification de la scène nécessite de recalculer le bilan énergétique. Il est donc impossible à l'heure actuelle de faire du temps réel tel que le calcul de sources de lumières en déplacement.

Démo en OpenGL disponible ici.

Ce document a été publié sur la version 3 du G.C.N. par tsotd.

  • Auteur Original : tsotd
  • Date de publication : 29 février 2004

(aucun commentaire actuellement)