Le problème du raytraceur est de comprendre quel est le niveau de lumière en chaque point visible de la scène. Habituellement, c'est découpé en la somme de ces composants :
diffusespecularreflectionambientLe système de radiosité de POV, basé sur une méthode de Greg Ward, fournit un moyen de remplacer le dernier composant avec un niveau de lumière basé sur la présence d'objets proches, et leur clarté.
La première chose que vous devez noter sur cette définition, est que c'est circulaire : la lumière de chaque chose est dépendante de la totalité, et vice versa. Cela est vrai dans la vie réelle, mais dans le monde du raytraceur, nous ne pouvons faire qu'une approximation. Cette approximation est : l'objet que vous regardez a sa valeur ambiante calculée pour vous par le test des objets voisins. Quand ces objets sont testés, leur terme diffuse est utilisé. La luminosité de la radiosité dans POV-Ray est basée sur deux choses :
diffuse de la finition de surfaceUn objet peut avoir à la fois la radiosité et le terme ambient. Toutefois, il est suggéré que si vous utilisez la radiosité dans votre scène, vous placez également ambient_light à 0 dans global_setting ou utilisez ambient 0 dans chaque finition d'objet. Ce modèle de luminosité est beaucoup plus réaliste, et POV-Ray n'essaiera pas d'ajuster la luminosité générale de la radiosité pour correspondre au niveau de l'ambience spécifiée par l'utilisateur.
Comment fait POV-Ray pour calculer le terme ambient pour chaque point ? En envoyant plus de rayons, dans de nombreuses directions, et en faisant la moyenne des résultats. Un point peut utiliser 200 rayons ou plus pour calculer correctement sa lumière ambiante.
Maintenant, cela semble dire que le raytraceur sera 200 fois plus lent. C'est vrai, sauf que le logiciel prend l'avantage du fait que les niveaux de lumière ambiante changent lentement (rappelez vous, les ombres sont calculées à part, aussi les bords contrastés ne sont pas un problème). Donc, ces rayons ne sont lancés que de temps en temps (environ 1 fois sur 50), puis ces valeurs calculées sont sauvées et réutilisées pour les pixels voisins quand c'est possible.
Ce procédé de sauvegarde et de réutilisation des valeurs est ce qui crée le besoin de régler de nombreux paramètres, ainsi vous obtenez la scène voulue.
Comme dit plus haut, la radiosité est activée avec le bloc radiosity{} dans global_setting. La radiosité a de nombreux paramètres qui sont spécifiés comme ceci :
global_settings { radiosity { [RADIOSITY_ITEMS...] } } RADIOSITY_ITEMS: adc_bailout Float | always_sample Bool | brightness Float | count Integer | error_bound Float | gray_threshold Float | load_file Filename | low_error_factor Float | max_sample Float | media Bool | minimum_reuse Float | nearest_count Integer | normal Bool | pretrace_end Float | pretrace_start Float | recursion_limit Integer | save_file Filename
Chaque élément est optionnel, et peut apparaître dans tout ordre. Si l'un d'eux est spécifié plus d'une fois, la dernière valeur écrase les précédentes. Des détails sur chaque élément sont donnés dans les sections suivantes.
Note : de considérables modifications ont été faites sur le fonctionnement de la radiosité dans POV-Ray 3.5 comparé à POV-Ray 3.1. D'anciennes scènes ne se rendront pas pareil, si elles se rendent. Il n'est pas possible d'utiliser la directive #version pour obtenir une compatibilité ascendante avec la radiosité.
Vous pouvez spécifier un adc_bailout pour les rayons de radiosité. Utilisez adc_bailout = 0.01 / brightest_ambient_object pour de bons résultats. Le défaut est 0.01.
Vous pouvez forcer POV-Ray à utiliser seulement les données de la phase de prétraçage et de ne pas rassembler de nouveaux échantillons pendant la phase finale de la radiosité. Pour cela, utilisez always_sample off, par défaut il est activé. Cela peut aussi être utile lors de la réutilisation de données de radiosité précédemment sauvées.
Le mot clé brightness donne une valeur numérique qui est le niveau auquel les objet sont éclaircis avant d'être rendus au système. La valeur par défaut est 1.0. Dans la cas où vous auriez augmenté global_settings {ambient_light value} pour accroître la luminosité globale d'une scène sans radiosité, vous pouvez utiliser brightness dans une scène avec radiosité.
Le nombre de rayons qui sont envoyés chaque fois qu'une nouvelle valeur de radiosité doit être calculée, est donné par le count. Une valeur de 35 est le défaut, le maximum est 1600. Quand cette valeur est trop basse, le niveau de la lumière tendra à marbrer, comme si les surfaces étaient un peu gondolées. Si cela n'est pas important pour votre scène (comme dans le cas d'une projection de bosses ou si vous avez une forte texture) alors, après tout, utilisez un petit nombre.
La valeur numérique error_bound est une des deux principales valeurs de réglage de la vitesse/qualité (l'autre est, bien sûr, le nombre de rayons lancés). Dans un monde idéal, cela serait la seule valeur nécessaire. Elle est censée signifier la fraction d'erreur tolérée. Par exemple, si elle est à un, l'algorithme ne calculera pas de nouvelle valeur jusqu'à ce que l'erreur sur la dernière ait été estimée aussi haute que 100%. En ignorant pour le moment l'erreur introduite par la rotation, sur les surfaces, c'est égal à la fraction de distance réutilisée, qui est la distance à l'objet touché le plus proche . Si vous avez un vieil échantillon sur le sol, à 10 pouces d'un mur, une erreur limite de 0.5 vous donnerait un nouvel échantillon à une distance de 5 pouces du mur.
La valeur pas défaut de 1.8 est bonne pour un doux effet de luminosité général. L'utilisation de valeurs plus basses est plus précise, mais cela augmente fortement le risque d'artefacts, et demande plus de count. Vous pouvez utiliser des valeurs plus basses que 0.1 mais, alors, le temps de rendu et la mémoire utilisée peuvent devenir très grands.
La lumière inter-réfléchie de manière diffuse est une fonction des objets autour du point en question. Puisque c'est récursif sur des millions de niveaux, dans toute scène réelle, chaque point est illuminé en partie par toutes les parties de la scène. Puisque nous ne pouvons pas nous permettre de calculer cela, nous ne faisons qu'un bond et la lumière ambiante calculée est fortement affectée par les objets proches. C'est comme les couleurs qui bavent, et c'est ce qui se passe réellement, mais pas autant que cette méthode de calcul peut le faire croire. La variable numérique gray_threshold la grise un peu, pour rendre votre scène plus crédible. Une valeur de 0.6 signifie le calcul de la valeur ambiante à 60% de la valeur de gris calculée équivalente. A 0%, cette caractéristique ne fait rien. A 100%, vous aurez toujours une lumière ambiante blanche/grise, sans nuance.
Note : cela ne change pas la clarté, mais seulement la force de la nuance (en termes HLS, il ne change que S). La valeur par défaut est 0.0.
Si vous calculez juste assez d'échantillons, mais pas plus, vous aurez une image avec une clarté légèrement marbrée. Ce que vous voulez est juste un petit mixage supplémentaire, pour que le mélange soit beau et doux. La solution est la prévisualisation mosaïque, contrôlée par pretrace : elle passe à l'avance au-dessus de l'image un certain nombre de fois, en calculant les valeurs de radiosité. Pour s'assurer que vous aurez un petit extra, l'algorithme de radiosité baisse la limite d'erreur pendant l'avant-dernier passage, puis le ramène juste avant le dernier passage. Le numérique low_error_factor fixe le facteur de baisse de la limite d'erreur pendant le passage préliminaire. Si votre facteur d'erreur bas est de 0.8, et votre limite d'erreur de 0.4, il utilise réellement une limite d'erreur de 0.32 pendant les premiers passages, et de 0.4 sur le dernier. La valeur par défaut est de 0.5.
Quelque fois il peut y avoir des problèmes avec des marbrures causées par des objets très brillants. Cela peut être quelque fois évité en utilisant le mot clé max_sample. max_sample prend un paramètre numérique qui spécifie la luminosité que tout échantillon ramassé est autorisé à avoir. Tous les échantillons plus brillants que cela seront assombris (sans affecter la couleur). La spécification d'une valeur négative pour max_sample autorisera toute luminosité d'échantillon (qui est le défaut).
L'estimation de la radiosité peut être affectée par le média. Pour activer cette caractéristique, ajoutez media on au bloc radiosity{}. Le défaut est off
Le ratio de rayon minimum est fixé par le numérique minimum_reuse. C'est une fraction de largeur d'écran qui fixe la rayon minimum de réutilisation de chaque point échantillon (actuellement, c'est la fraction de la distance à l'oeil, mais les deux sont relativement identiques). Par exemple, si la valeur est 0.02, le rayon maximum de réutilisation pour chaque échantillon est fixé, quelque soit la distance de base, à 2% de la largeur de l'écran. Imaginez que vous envoyez un rayon à l'horizon, et qu'il touche le sol à une distance de 100 miles de vous. La distance de réutilisation pour cet échantillon sera de 2 miles. A une résolution de 300*400, cela correspondra à 8 pixel. La théorie est que vous ne voulez pas calculer les valeurs pour chaque pixel de chaque crevasse de la scène, ce serait trop long. Cela fixe une borne minimale de réutilisation. Si cette valeur est trop basse, (qui le serait en théorie) le rendu devient lent, et les coins internes peuvent devenir grenus. Si c'est trop élevé, vous n'obtenez pas l'assombrissement naturel près des bords internes, puisqu'il réutilise. Aux valeurs plus grandes que 2%, vous commencez à avoir des erreurs ordinaires, comme la réutilisation de l'illumination de la table sous la pomme. Souvenez vous que c'est un ratio sans unité. La valeur par défaut est 0.015.
La valeur entière nearest_count est le nombre maximum de vieilles valeurs ambiantes mélangées ensembles pour créer une nouvelle valeur. Le nombre mélangé total variera selon error_bound. Toutes les valeurs précédentes qui correspondent au error_bound spécifié seront utilisées dans la moyenne.
Elles seront toujours les n points réutilisables géométriquement proches. Si vous descendez sous 4, cela peut devenir assez inégal. Cela peut être bon pour les corrections, bien sûr. Ne doit pas être supérieur à 20, car c'est la taille du tableau alloué. La valeur par défaut est 5.
L'estimation de la radiosité peut être affectée par les normales. Pour activer cette caractéristique, ajoutez normal on au bloc radiosity{}. Le défaut est off
Pour contrôler la phase de regroupement en prétraçage de la radiosité, utilisez les mots clés pretrace_start et pretrace_end dans le bloc radiosity{}. Chacun d'eux est suivi par une valeur décimale entre 0.0 et 1.0 qui spécifie la taille des blocs de la prévisualisation en mosaïque comme un pourcentage de la taille de l'image. Les défauts sont 0.08 pour pretrace_start et 0.04 pour pretrace_end
L'entier recursion_limit détermine la nombre de niveaux récursifs utilisés pour calculer l'inter-réflexion diffuse. La valeur par défaut est 3, avec une limite à 20.
Vous pouvez sauver les données de radiosité en utilisant save_file "file_name" et charger les mêmes données, plus tard, en utilisant load_file "file_name". En général, ce n'est pas une bonne idée de sauver et recharger les données de radiosité si des objets de la scène bougent. Même si les données sont chargées, des échantillons supplémentaires doivent être pris pendant le rendu (qui donne une meilleur approximation). Vous pouvez désactiver la prise des échantillons pendant la dernière phase de rendu en spécifiant always_sample off.
Jetez un oeil sur le "Cours sur la radiosité" dans la section "Cours avancés", pour avoir une idée sur le résultat visuel de la modification des paramètres de radiosité.
Si vous voulez voir où sont calculées vos valeurs, mettez count à près de 20, nearest_count à 1 et gray_threshold à 0. Cela fera que tout sera très inégal, et vous pourrez voir les bordures entres les zones. Il y aura un calcul de radiosiré au centre de la plupart des zones. En plus, c'est rapide. Vous pouvez alors changer error_bound vers le haut et le bas pour voir ce qui change. De même, modifiez minimum_reuse.
Une façon d'obtenir des résultats plus lisses : augmentez le compte d'échantillons (nous allons jusqu'à 1300) et réduisez low_error_factor à quelque chose comme 0.6. Faites passer nearest_count à 7 ou 8. Cela donnera de meilleures valeurs, puis modifiera la plupart d'entre elles sur le dernier passage. Ce n'est pas pour les impatients, car c'est comme une fonction carrée. Si votre inquiétude se porte sur certains coins, ou près de certains objets, essayez plutôt de régler la limite d'erreur. Ne la baissez que petit à petit, puisque le temps de travail deviendra très long.
Quelque fois, des échantillons supplémentaires sont pris pendant le dernier passage du rendu. Ces nouveaux échantillons peuvent provoquer des discontinuités dans la radiosité de certaines scènes. Pour réduire ces artefacts, utilisez un pretrace_end de 0.04 (ou même 0.02 si vous êtes patient et pointilleux). Cela fera que la majorité des échantillons seront pris pendant les phases de prévisualisation, et réduira les artefacts créés pendant la phase finale. Vous pouvez forcer POV-Ray pour ne prendre que les données de la phase de prétraçage et ne pas récolter de nouveaux échantillons pendant la dernière phase. Pour cela, utilisez always_sample no dans le bloc de radiosité dans global_settings.
Si votre scène utilise des objets ambient (surtout de petits) comme sources de lumière, vous devrez sans doute utiliser un compteur élevé (100-150 et plus). Pour de telles scènes, un error_bound de 1.0 est habituellement bon. Plus cause trop d'erreurs, mais moins donne des rendus très lents. et il est important d'adapter adc_bailout.
| 3.3 Les objets |