Vous n’allez peut-être pas me croire mais je viens seulement de comprendre une notion importante d’Octane : la différence entre les nœuds RGBSpectrum et GaussianSpectrum. Jusqu’à présent je pensais que ces nœuds avaient une fonction équivalente et qu’il ne correspondaient qu’à des conventions d’écriture : l’un en RVB ou TSL classique et l’autre dans un format abscons destiné aux seuls scientifiques. Il n’en est rien car en réalité ce choix de nœud a un impact en terme de génération de bruit dans les émetteurs de lumière colorée.
Bien entendu, j’avais déjà lu des informations sur ce nœud GaussianSpectrum mais ces infos n’avaient pas traversé la barrière de la langue, Je n’avais pas perçu toute la portée de ce que je lisais et j’en étais resté à une conclusion du genre « ça m’a l’air très compliqué et pas très utile… ». Aujourd’hui, je me rends compte que je suis passé à côté de quelque chose et j’ai décidé de partager ma découverte. Le nœud GaussianSpectrum est très utile dans tout ce qui concerne le filtrage et surtout la génération de lumière car son mode de fonctionnement permet la définition d’une zone du spectre plutôt qu’un point précis pour une couleur donnée, ce qui réduit assez bien la génération de bruit avec des émetteurs contenant une couleur.
Mais aussi, comme le nœud GaussianSpectrum offre une saturation globalement plus prononcée et partiellement dissociée de la luminosité, il peut être utile également dans un nœud Scattering ou un Absorption medium ou bien encore dans le port Transmission. Pour ma part, après l’avoir essayé, je trouve qu’il offre des avantages dans un nœud de type medium mais je n’ai néanmoins pas constaté d’amélioration notable pour ce qui est du bruit.
Quelques explications
Si j’ai bien compris, en interne Octane utilise des couleurs de type GaussianSpectrum. Toutes les valeurs de couleur RGBSpectrum sont converties automatiquement en GaussianSpectrum. Donc le nœud RGBSpectrum n’est en quelque sorte qu’un sous-nœud du GaussianSpectrum. Jusque là rien de bien grave si ce n’est que la méthode de conversion ne permet pas de respecter toute la logique intrinsèque du nœud GaussianSpectrum : la définition d’un éventail de couleurs, d’une tendance, d’un ensemble de longueurs d’ondes plutôt qu’une couleur précise. C’est la valeur de Width du GaussianSpectrum qui détermine cet éventail mais, si je comprends bien, avec la conversion du RGBSpectrum c’est comme si cette valeur était à son minimum, comme si ce n’était qu’un point dans le spectre plutôt qu’une zone.
Dans le GaussianSpectrum, plus la valeur du Width est basse, plus cette zone du spectre est étroite et plus la couleur sera saturée (jusqu’à devenir sombre puis noire) mais même dans des valeurs assez basse, ça reste néanmoins une zone de longueur d’ondes plutôt qu’une longueur d’onde spécifique. Du coup, lorsqu’on utilise une valeur GaussianSpectrum, même relativement saturée, dans une source lumineuse à la place d’une valeur en RGBSpectrum, Octane génère beaucoup moins de bruit.
Comment fonctionne le nœud
En réalité, le noeud GaussianSpectrum est plus simple à utiliser qu’il n’y paraît et est très proche d’une mécanique TSL (Teinte, Saturation, Luminosité, HSV en anglais) si ce n’est que la valeur de Wavelength ne correspond pas à une roue chromatique (tournant sur elle-même où les rouges à 0 et 360° sont équivalents) mais à une longueur d’onde du spectre visible : les valeurs basses étant proches de l’ultraviolet et les valeurs hautes proches des infrarouges comme un arc-en-ciel (https://fr.wikipedia.org/wiki/Spectre_visible).
Pour définir la teinte sur base de données réelles (d’une lampe par exemple), le calcul est assez simple. Les valeurs utilisées par Octane sont les suivantes :
μ = 380 + 340 * longueur d’onde (donc les valeurs se situent entre 380 et 720 nm)
σ = 800 * Width.
Imaginons que vous voulez une valeur de 470 nm qui correspond par exemple à une lampe LED spécifique. Il suffit de soustraire de cette valeur (470) la valeur de départ du spectre visible pris en compte par Octane, soit 380 nm, ce qui donne 90. Comme le champ Wavelength d’Octane est un nœud Float (de 0 à 1), on va tout simplement diviser 1 par 340 (la largeur du spectre visible pris en compte par Octane) et multiplier le résultat par la valeur du calcul précédent, soit 90. On obtient alors une valeur approximative de 0.265 (comme ce calcul contient exclusivement des valeurs constantes, une simple formule dans une feuille Excel ou OpenOffice devrait faire l’affaire…).
Le Width, la largeur du spectre pris en compte (une bande ou zone en quelque sorte) va définir la saturation globale. Plus cette valeur est basse, plus la saturation sera forte. Bien entendu, si la valeur est radicalement basse, on risque de voir réapparaître du bruit donc, comme toujours, c’est un compromis à trouver. Globalement, la saturation est naturellement plus forte avec un nœud GaussianSpectrum, ce qui fait qu’il n’est généralement pas nécessaire d’atteindre ces extrémités.
Le Power est l’équivalent de la luminosité des valeurs TSL si ce n’est qu’ici ont est moins dans un cadre chromatique soustractif et plus dans un cadre lumineux additif. D’où l’appellation de Power et non de luminosité. Il s’agit bien ici de puissance lumineuse et non de luminosité… La différence semble très « linguistique » dans mon explication mais vous verrez en essayant que le comportement d’Octane est différent.
Déroutant mais puissant
D’une manière générale, ce nœud peut sembler déroutant de prime abord car, dans un matériau Diffuse avec un GaussianSpectrum connecté au port Diffuse par exemple, un Wavelength de 0.75 avec un Width à 0.1 et un Power à 0.8 donneront un jaune prononcé alors que les mêmes Wavelength et Power avec un Width à 0.025 donneront un rouge orangé. Dans le même ordre d’idée, j’avoue que j’ai été très surpris de constater que je ne pouvais obtenir de pourpre, de violet ou de magenta qu’en utilisant deux GaussianSpectrum (l’un à ± 0 en Wavelength et l’autre à ± 1) et un CosineMix. Si on se réfère à Wikipedia (https://fr.wikipedia.org/wiki/Pourpre), ça semble assez logique puisque les pourpres font partie des couleurs qui n’apparaissent pas dans l’arc-en-ciel et qui nécessitent un mélange (au sens strict des longueurs d’onde). Cela étant, mes représentations symboliques ont eu la vie dure et j’ai eu de la peine à y croire…
Juste pour les émetteurs de lumière ?
Jusqu’à présent, j’ai surtout parlé d’émission de lumière car c’est surtout dans ce cadre que l’utilisation du nœud GaussianSpectrum est immédiatement utile. Mais comme tout est flux de lumière dans Octane : réflexion, réfraction, filtrage, etc ; le bénéfice de l’utilisation de ce nœud est perceptible dans d’autres cadres comme la translucidité avec les nœuds Absoption et Scattering medium puisqu’ils agissent comme des filtres, ou même avec de la couleur spéculaire ou de la réflexion. Bien entendu, ce n’est pas pour autant qu’il faut l’utiliser dans toutes les situations car c’est certain qu’il est moins aisé à paramétrer mais si on est confronté à du bruit généré par une couleur, il me semble que c’est la première chose à tester.
Pour le nœud Scattering medium, j’ai constaté que le nœud GaussianSpectrum fonctionne bien avec l’Absorption mais pas avec le Scattering. Je suppose qu’il doit s’agir de la nécessité de donner au Scattering une valeur stricte au lieu d’une plage de valeurs mais je n’en ai aucune certitude. À tester plus en profondeur donc…
Merci pour ces infos… vraiment très intéressantes et utiles !
Salut Atom,
toujours super intéressant de passer par ici…
un noeud auquel je vais accorder plus de temps
merci pour le petit laïus…;-)