Ecrit par Olivier Saraja (olivier_at_linuxgraphic.org)
Dans l'article intitulé "Une courte étude de la lumière", nous vous proposions une présentation des différents objets permettant d'éclairer une scène. On y apprenait comment paramétrer les lumières pour régler l'intensité de l'éclairage, définir leur zone d'effet ou encore jouer avec les ombres produites. Il manquait toutefois à apprendre comment mettre en place des lumières d'ambiance, ou avoir des objets capables de luire d'une lumière propre dans le noir. C'est en effet le principal avantage du rendu en radiosité: vous pouvez spécifier des objets qui brillent et émettent, par conséquent, de la lumière, sans avoir à recourir à des subterfuges mal commodes pour en simuler un effet approximatif.
Par défaut, les ombres conventionnelles se présentent du noir le plus profond et avec des frontières très nettes, très tranchées. Or, l'observation de notre environnement révèle qu'à l'exception de certaines sources d'éclairage artificielles et plus ou moins ponctuelles (comme une ampoule), la plupart des ombres issues d'un environnement naturel sont plus diffuses, moins profondes et considérablement moins marquées, car pour être visibles, les surfaces reflètent une grande partie de la lumière qu'elles reçoivent et en absorbent une fraction. Cette énergie lumineuse, même si elle est très faible, rebondit à l'infini, jusqu'à être entièrement absorbée par l'environnement, mais contribue à éclairer des zones autrement situées dans la zone d'ombre d'un gros objet. En conséquence, les ombres ont l'air moins profondes (moins noires) et les contours plus diffus (car les ombres sont alors issues de plusieurs pseudo-sources lumineuses) que dans un calcul de rendu classique.
C'est pourquoi le même article "Une courte étude de la lumière" nous montrait le bon usage des zones de lumière qui permettent de reproduire de façon très primitive les ombres douces obtenues dans la réalité. Mais ce modèle d'éclairage, quoique très amusant et rapide à mettre en oeuvre (et à calculer!) n'en est pas moins très imprécis dans la mesure où il ne tient pas réellement compte des contributions de lumière émises ou renvoyées par les objets de votre scène. C'est là que le calcul de radiosité entre en jeu.
Cela consiste à donner à chaque objet de votre scène deux propriétés distinctes: la première (nommée couleur ambiante) correspond à la quantité d'énergie lumineuse émise, la seconde (nommée diffusion) représente la capacité de l'objet à refléter la lumière. Dans le premier cas, plus l'objet émet de l'énergie lumineuse, plus il sera naturellement visible dans le noir et plus il aura le potentiel d'illuminer la scène; dans le second cas, plus il reflète la lumière, plus il sera visible grâce aux contributions des autres sources lumineuses, et plus il éclairera lui-même les objets voisins par « rebond » des rayons lumineux sur sa surface. Bien sûr, les contributions lumineuses s'accompagnent, outre leur intensité respectives, d'une information de couleur propre à l'objet. Ainsi, il est facile d'imaginer une pièce blanche, avec un néon au plafond, et une boule rouge au milieu de la pièce. En considérant que tant les murs et la boule reflètent la lumière, la boule rouge sera légèrement teintée de blanc et le sol blanc légèrement teinté de rouge.
Par ailleurs, même si la source de lumière est unique (un seul objet avec la propriété couleur ambiante), tous les objets de la scène renvoient une part d'énergie et de par leur contribution respective peuvent être littéralement considérées comme des sources de lumière d'intensité (généralement très faible) proportionnelle à leur capacité à refléter la lumière. C'est pour cela qu'une ombre, normalement noire et tranchée, va être adoucie et éclaircie en fonction du nombre de contributions lumineuses de la scène et de leur intensité.
Mais avant de tenter de mettre en oeuvre une solution de radiosité, essayons de comprendre un peu mieux les deux propriétés principales qui nous intéressent. Les exemples suivants montrent trois primitives (une sphère rouge, une boîte verte et un cone jaune) posées sur un plan blanc. A chaque fois, dans l'image repérée « A », elles sont éclairées par une lumière ponctuelle tout ce qu'il y a de plus classique; si on retirait celle-ci, la scène entière serait placée dans l'obscurité et rien ne serait visible.
Bien sûr, il est possible de mêler solution de radiosité et éclairage conventionnel. Toutes les contributions lumineuses sont alors prises en compte: les objets fluorescents émettent de la lumière, de même, bien sûr, que les sources de lumière conventionnelles; les autres objets se contentent de refléter la lumière mais contribuent malgré tout à la richesse et la profondeur de l'éclairage, ainsi qu'en témoignent les tons subtils obtenus. A noter que dans l'image résultante, l'intensité de la lumière ponctuelle a été baissée à un niveau très bas (composantes rouge, vert et bleu de la lumière fixées à 0.15) pour éviter la saturation lumineuse de la scène, le cumul d'une solution conventionnelle et d'une solution de radiosité pouvant rapidement aboutir à la surexposition de l'image. Il en résulte une image un peu plus claire que celle obtenue par la solution de radiosité, ainsi que des ombres plus tranchées, provenant ici d'une direction différente du cube fluorescent.
La mise en place d'une solution de radiosité est aisée et rapide à la fois. C'est le paramétrage de celle-ci afin d'obtenir les effets exactement désirés qui demande de la rigueur et du temps. Pour commencer, jetez un bref coup d'oeil dans l'arbre des objets et repérez l'entrée configurations globales.
Cliquer dessus vous permettra d'afficher les variables globales relatives à la scène et surtout de cocher l'option activant la radiosité. Pour l'instant, nous allons accepter tous les paramètres par défaut mais nous en étudirons quelques uns un peu plus tard.
Voilà pour la première étape, mais il y en a une autre que nous ne devons absolument pas négliger. En effet, rien ne sert de spécifier des paramètres de radiosité si nous n'informons pas le moteur de rendu qu'il doit les prendre en compte. En effet, POV-Ray a ceci de particulier que vous pouvez, en tant qu'options de rendu, spécifier des résolutions plus ou moins élevées, activer ou non l'anti-crênelage (plus connu sous son terme anglais d'anti-aliasing), tenir compte ou non des médias, et de même, calculer ou non une solution de radiosité. Les intérêts sont multiples, mais disons que pour simplifier, il vous est possible de spécifier différents profils de rendu, selon le temps que vous souhaitez y consacrer ou la précision que vous recherchez. Ainsi, par exemple, dans toutes les phases intermédiaires de modélisation et d'éclairage, une image de sortie de faible résolution, sans anti-crênelage et sans calcul ni de médias ni de radiosité vous sera bien utile. A mesure que vous travaillerez sur l'atmosphère ou l'éclairage de votre scène, vous ressentirez le besoin d'activer de façon sélective certaines options du moteur de rendu, jusqu'à aboutir à votre image finale, dont le calcul sera d'autant plus long que vous aurez activé toutes les options coûteuses en temps afin d'obtenir le meilleur résultat possible.
Editer les préférences de rendu est très simple et, comme d'habitude avec KPovModeler, peut se faire de deux manières très rapides:
En utilisant le menu: Affichage > Modes de rendu
En utilisant la barre d'outils: cliquez sur l'icône
Une fenêtre apparaît avec tous les profils de rendu disponibles. Par défaut, une seule entrée apparaît, que vous pouvez sélectionner et configurer en appuyant sur le bouton Edition. La fenêtre change alors pour faire apparaître un champ de description et trois onglets. Dans le champ de description, saisissez un nom représentatif des options de rendu que vous choisissez. Par exemple, nommez le mode de rendu en fonction de sa résolution, de la présence ou non d'anti-crênelage et de radiosité. Plus vous serez précis, plus il vous sera facile, à chaque fois que vous reviendrez dans la fenêtre d'édition des modes de rendu, de choisir le profil souhaité sans être obligé de scruter leurs paramètres.
Les onglets Taille et Qualité contiennent chacun les options qui vous seront le plus souvent utiles. Ainsi, dans l'onglet Taille, vous pourrez spécifier les dimensions de l'image de rendu (ici: 320x256 pixels, soit une image de petite dimension). Dans l'onglet Qualité, ensuite, nous vous invitons à choisir, dans le bouton déroulant, l'option 11 (calcul de la radiosité et du média), et à cocher l'option de Radiosité. Bien sûr, pour améliorer le rendu de l'image, vous pouvez également cocher l'Anti-crênelage, bien que cela n'aie rien à voir avec la solution de radiosité que nous recherchons. Enfin, pour valider les modifications apportées à vos onglets, cliquez sur OK pour revenir à la liste, mise à jour, des profils de rendu. Pour en appliquer une, il suffit de sélectionner un profil et de cliquer sur le bouton OK.
Vous noterez que le mode de rendu en cours d'utilisation apparaît dans la barre des outils, et qu'il vous est possible de sélectionner directement grâce à la liste déroulante le profil prédéfini souhaité.
Et voilà! Votre scène est prête: au moment du rendu, c'est une solution de radiosité qui sera fournie par POV-Ray, tenant compte de toutes les contributions lumineuses propres à la scène que vous aurez décrite! Bien sûr, le temps de rendu est considérablement allongé par la solution de radiosité, car le moteur calcule toutes les contributions lumineuses en préalable au rendu de l'image par lancer de rayon classique. Parfois, un long moment peut s'écouler avant de voir les premières lignes de pixels s'afficher. C'est pourquoi il est souvent utile de mettre sa scène au point avec des profils de rendu rapides: la patience est la clé du calcul de radiosité!
Jusqu'à présent, nous avons accepté tous les paramètres par défaut proposés par KPovModeler. Ce sera bien souvent suffisant, mais vous éprouverez parfois le besoin d'affiner la solution de radiosité soit pour garantir un meilleur réalisme, soit pour obtenir les effets les plus proches de vos espérances. Voici quelques uns des principaux paramètres expliqués ci-dessous.
Le moteur de radiosité calcule une solution tenant compte des échanges d'énergie lumineuse entre les différents objet émetteurs de la scène. Les proportions d'énergie reçues par chaque volume élémentaire de l'image résultante peuvent être considérées comme étant constantes entre elles. Augmenter, ou diminuer, la luminosité de la scène revient à modifier le gain de l'image, c'est à dire à augmenter ou diminuer proportionnellement l'intensité lumineuse de chaque volume élémentaire. En modifiant la luminosité, c'est celle de la scène entière que vous modifiez. Pour augmenter la luminosité d'un objet en particulier, augmentez sa couleur ambiante si c'est un émetteur de lumière, ou bien corrigez sa diffusion dans le cas contraire.
Le moteur de rendu arrive à une solution de radiosité lorsque l'énergie lumineuse rebondit d'un objet à l'autre jusqu'à être totalement absorbée, ce qui correspond à une énergie lumineuse réfléchie convergeant vers zéro. Il est impossible de prédire à l'avance au bout de combien de calculs itératifs la convergence va être atteinte, mais le paramètre décompte permet de forcer l'arrêt du calcul avant que celle-ci se produise. En d'autres termes, plus la valeur de décompte est élevée, et plus vous avez de chance que le moteur de rendu ait atteint la valeur de convergence. Réciproquement, plus la valeur est faible, moins les échanges lumineux sont rendus avec fiabilité et le résultat paraît moins lisse et moins réaliste. Bien sûr, augmenter la valeur de décompte augmente d'autant le temps de rendu. Pour les prévisualisations de vos scènes, il vaut mieux maintenir décompte à une valeur faible. Sur les images d'exemple qui suivent, on se rend compte que s'il y a une différence importante entre une valeur de 1 et de 10 (observez les « tâches » sur le pilier de droite, en arrière-plan), cette différence s'atténue déjà beaucoup entre 10 et 100, jusqu'à être indiscernable au-delà.
A noter que, de même que vous pouvez souhaiter interrompre le calcul de la solution de radiosité avant d'arriver à la convergence souhaitée, celle-ci peut, pour une raison ou une autre, intervenir trop tôt et aboutir à une énergie lumineuse mal répartie, les parties sombres et éclairées se fondant de façon brusque. C'est pour cela qu'il peut être intéressant de réhausser le paramètre décompte le plus court si l'augmentation du paramètre décompte n'affine pas la solution.
Ce paramètre permet de régler la finesse des dégradés de lumière obtenus sur la surface des objets entrant en jeu dans le calcul de radiosité. Une valeur élevée donne lieu à de grands aplats de lumière ou d'ombre, parfaits pour le rendu d'images de type « dessin animé ». Une valeur moyenne (comme celle proposée par défaut à 1,8 par KPovModeler) donne des résultats plus fins, mais il faut descendre jusqu'à des valeurs décimales pour obtenir les meilleurs résultats. Sans être spécialiste, et si mon interprétation est correcte, la limite d'erreur spécifiée ici est plus ou moins la limite de convergence dont nous avons déjà discuté plus haut. Plus la valeur est faible, et plus on s'assure qu'après la nième itération, l'énergie lumineuse réfléchie tend vers zéro. Bien sûr, en conséquence logique, le temps de rendu de l'image va être considérablement augmenté.
Cette variable n'accepte que deux valeurs: 1 ou 2. L'observation des images tests révèle qu'en forçant la limite de récursion à 2, même avec des valeurs peu optimisées (valeurs par défaut) pour décompte et limite d'erreur, les dégradés des reflets lumineux sur les objets sont plus fins. La luminosité globale semble également augmenter légèrement. Le temps de rendu n'étant pas beaucoup grevé par ce changement de valeur, vous aurez souvent tout intérêt à mettre systématiquement la limite de récursion à 2 sauf si vous expérimentez des résultats étranges.
La première limitation, et non la moindre, d'un rendu en radiosité, est que cela prend du temps, et qu'il faut souvent expérimenter longtemps pour obtenir les résultats attendus. D'un autre côté, vos efforts seront toujours payés en retour.
Une seconde limitation est que de par son mode de fonctionnement (calcul de la lumière diffuse des objets), une image rendue en radiosité est totalement mate, sans tâche de spéculaire ni de Phong. Une façon de contourner cette limitation consiste à mettre au point la scène pour un rendu en radiosité, puis d'ajouter des sources lumineuses conventionnelles et les paramètres de Finition idoines pour obtenir spéculaires et réflections, entre autres, mais aussi indices de réfraction et caustiques. Bien sûr, au moment de choisir votre type de lumière conventionnelle, il faut s'assurer que son modèle soit le plus proche possible de la forme de l'émetteur principal de votre scène en radiosité.
Par exemple, dans la plupart des images tests, la lumière émane d'un plafond entièrement lumineux. Pour obtenir la scène finale ci-dessous, nous avons défini une zone de lumière ayant à peu près les mêmes dimensions que le plafond; en revanche, il nous a fallu diminuer l'intensité de la lumière conventionnelle, car nous risquions la saturation lumineuse de l'image finale, ce qui n'était pas un effet recherché. Toutefois, nous avons activé effet de transparence, indice de réfraction et réflexion pour la pierre cristalline centrale.
Cet article nous a permis de découvrir comment mettre en place une solution de radiosité, ainsi que de comprendre l'influence des principaux paramètres présents dans les configurations globales. Ce qu'il faut également comprendre, c'est que chaque scène est différente et nécessite que l'on recherche les paramètres qui lui conviennent le mieux. Ainsi, il n'est pas forcément utile de gonfler tous les paramètres vers leurs valeurs optimales, car comme nous l'avons vu, abaisser la limite d'erreur ou augmenter le décompte aboutissent tous deux, bien que par des moyens différents, à un lissage des intensités lumineuses à la surface des objets.
Il ne nous reste plus qu'à vous souhaiter de bonnes (mais longues!) heures d'expérimentation, pour saisir toute la richesse des tons qu'il vous est possible d'obtenir par un éclairage subtil en radiosité d'une sène autrement quelconque.