3 points par GN⁺ 2024-04-16 | 1 commentaires | Partager sur WhatsApp
  • Le ray tracing spectral produit une distribution spectrale de puissance (SPD) pour chaque pixel en traitant non seulement la longueur d’onde, mais aussi la phase, au lieu d’utiliser des rayons qui ne transportent que des valeurs RGB
  • Le ray tracing classique remonte généralement des rayons de la caméra vers la source lumineuse pour des raisons de performances, et simplifie les rayons en particules munies d’un vecteur RGB
  • L’œil humain construit la couleur à partir des réactions de trois types de cônes sensibles aux longueurs d’onde courtes, moyennes et longues, et une même couleur peut provenir de SPD différentes
  • Dans des scènes où la longueur d’onde influence la trajectoire et la couleur de la lumière, comme avec la dispersion ou l’interférence en couche mince, l’approximation RGB seule peut devenir insuffisante
  • Un ray tracer spectral sans dépendances, réalisé en JavaScript et GLSL, sert d’outil pour créer des couleurs et des mouvements irréalistes dans un art informatique qui modifie volontairement les lois de la lumière

Caméra codée et ray tracing

  • Dans l’art informatique, la scène et la caméra sont toutes deux créées par le code, puis le rendu est converti en tableau de valeurs RGB
  • Le ray tracing fait rebondir des rayons entre des objets virtuels et modélise le trajet de la lumière entre une caméra simulée et les sources lumineuses
  • Pour des raisons de performances, il ne suit pas exactement le déplacement réel de la lumière et recourt à plusieurs simplifications
    • Comme la plupart des rayons émis par les sources n’atteignent pas la caméra, le traçage part non pas de la source mais à rebours depuis le point de vue de la caméra
    • Ce traçage inverse est physiquement valable sous l’hypothèse de T-symmetry, selon laquelle les lois de transport de la lumière sont symétriques par rapport au sens du temps
  • Une simplification encore plus forte consiste à traiter les rayons non comme des ondes, mais comme des particules porteuses d’un vecteur de couleur RGB
    • Cela ignore la nature ondulatoire de la lumière, mais produit des résultats physiquement plausibles dans de nombreuses scènes
    • Cette approximation est possible parce que l’œil humain possède trois types de cellules de détection des couleurs sensibles aux longueurs d’onde courtes, moyennes et longues

L’œil réagit au spectre, pas au RGB

  • Dans le monde réel, la lumière n’est généralement pas constituée d’une seule longueur d’onde, mais d’une distribution spectrale de puissance (SPD) mêlant plusieurs longueurs d’onde
  • Une seule couleur perçue par l’humain peut correspondre à de très nombreuses SPD ; ce phénomène est appelé metamerism
    • Par exemple, le jaune peut être perçu comme une longueur d’onde unique autour de 580 nm
    • Sur des appareils qui n’utilisent que le RGB, comme les moniteurs, le jaune est aussi reproduit par la combinaison de lumière rouge et verte
  • Il existe aussi des couleurs non spectrales qui ne peuvent pas être produites par une seule longueur d’onde, comme le magenta
    • Le magenta ne correspond pas à une position unique dans le spectre
    • Il nécessite une combinaison de faibles et de fortes longueurs d’onde, autrement dit de lumière bleue et rouge
  • Le passage d’une SPD à une couleur peut être traité mathématiquement
    • Il existe un lien quantitatif entre la physique, la physiologie et l’expérience subjective de la couleur
    • Ce lien est décrit dans les CIE 1931 color spaces, établis en 1931
  • Pour une implémentation directe, on peut consulter le chapitre sur la couleur de Physically Based Rendering

Les scènes où la longueur d’onde change le résultat

  • En ray tracing, il n’est pas toujours nécessaire de prendre en compte l’ensemble du spectre ni la longueur d’onde de chaque rayon
  • Mais dans certaines scènes, la nature ondulatoire de la lumière influence directement sa trajectoire, et donc aussi la couleur visible au final
  • L’exemple le plus représentatif est la dispersion
    • La trajectoire de la lumière se courbe différemment selon la longueur d’onde
    • C’est ce qui explique qu’un prisme sépare la lumière blanche en ses fréquences constitutives
  • Un autre exemple est l’interférence en couche mince (thin film interference)
    • Elle explique les motifs irisés visibles sur les bulles de savon
    • La lumière réfléchie par les couches supérieure et inférieure de la pellicule de savon produit des interférences constructives et destructives
    • Ce processus ne sépare pas le spectre en longueurs d’onde uniques ; il renforce ou réduit la contribution de certaines parties du spectre
    • Il produit ainsi fréquemment des couleurs non spectrales comme le cyan-vert, le teal, le magenta ou le brun

Ce que traite le ray tracing spectral

  • Le ray tracing spectral est une forme de ray tracing qui prend en compte les propriétés ondulatoires de la lumière
  • Au lieu de calculer le monde uniquement en couleurs RGB, il génère une distribution spectrale de puissance pour chaque pixel de la scène
  • Il utilise à la fois la longueur d’onde et la phase des rayons pour mieux estimer la couleur lorsque ces informations sont importantes
  • Il est particulièrement utile lorsque la longueur d’onde et la phase modifient la couleur résultante, comme dans la dispersion ou l’interférence en couche mince

Utilisation dans l’art informatique

  • Dans des travaux récents, on utilise une approche qui enfreint volontairement les lois du mouvement de la lumière et code des caméras pour des univers légèrement différents du réel
  • Elle permet à la fois de traiter toute la richesse du spectre lumineux et de modifier les règles du transport de la lumière de manière irréaliste
  • Les productions publiées ont été générées avec un ray tracer spectral JavaScript et GLSL sans dépendances, écrit à la main
  • Les travaux d’exemple incluent :
    • Light Doesn't Bend That Way #1, 2023
      • généré en faisant de l’angle de réflexion une fonction de la longueur d’onde
      • le résultat semble ne produire que des couleurs spectrales
    • Untitled, 2023
      • œuvre en cours pour la série FULL_SPECTRUM, présentée à Tokyo en 2023
    • Untitled, 2023
      • disponible sous la forme de Video 3
      • le processus qui met l’œuvre en mouvement dans ce système y est particulièrement important
    • Untitled, 2024

1 commentaires

 
GN⁺ 2024-04-16
Avis sur Hacker News
  • Si vous voulez essayer d’en créer un vous-même, l’ebook gratuit Ray Tracing Gems II 1 traite du ray tracing GPU temps réel basé sur les API récentes et l’accélération matérielle, et contient aussi un chapitre sur le rendu spectral
    Le chapitre 42, « Efficient spectral rendering on the GPU for predictive rendering », est particulièrement pertinent

    1 https://www.realtimerendering.com/raytracinggems/rtg2/

    • Pour une introduction très rapide, Ray Tracing in One Weekend 1 est aussi recommandé ; si vous voulez ensuite approfondir, Physically Based Rendering [2] est un bon choix

      1 https://raytracing.github.io/

      [2] https://pbrt.org/

    • Je n’ai pas le temps de pratiquer moi-même le ray tracing, mais en parcourant le début du livre, l’échantillonnage par alias (alias sampling) m’a semblé être une technique très élégante et efficace
      Elle est utile dans un contexte bien plus large que le graphisme, et je regrette de ne pas l’avoir découverte plus tôt

  • Il existe plusieurs exemples de ray tracers spectraux
    Mitsuba est un renderer open source de recherche avec beaucoup de fonctionnalités intéressantes, comme le rendu différentiable https://www.mitsuba-renderer.org/
    Maxwell propose deux modes spectraux de précision différente, et l’approche la plus complexe est souvent utilisée en optique https://maxwellrender.com/
    Manuka de Wētā FX est un renderer spectral utilisé dans plusieurs longs-métrages https://dl.acm.org/doi/10.1145/3182161 et https://www.wetafx.co.nz/research-and-tech/technology/manuka

  • À mon avis, le rendu spectral est un bon exemple montrant que le ray tracing lui-même n’est pas l’aboutissement du rendu, mais plutôt son point de départ
    On voit parfois l’idée que le ray tracing temps réel aurait résolu le problème du rendu, mais je pense que c’est très loin de la réalité
    À ma connaissance, la plupart des systèmes de rendu spectral ne gèrent pas l’interférence en film mince ni d’autres effets ondulatoires, ce qui constitue encore une autre frontière
    La réalité contient une quantité étonnante de détails

    • À mesure que le rendu se rapproche des principes physiques sous-jacents, les moteurs de jeu deviendront de plus en plus des moteurs de simulation du monde
      Plusieurs composants de moteurs aujourd’hui généralement séparés pourraient converger vers un point commun, par exemple avec une séparation moins nette entre la couche physique et la couche de rendu
      Je me demande si cette tendance est déjà observable dans une certaine mesure
      Quand la puissance de calcul aura encore gagné plusieurs ordres de grandeur, nos abstractions actuelles apparaîtront, comme les technologies de pointe d’il y a 30 ans, comme des formes issues de contraintes techniques passées

    • C’est comme un fractal : plus on regarde de près, plus on découvre de détails qui influencent ce que nous voyons
      Nous nous rapprochons peu à peu d’un rendu physiquement exact à 100 %, mais nous n’atteindrons probablement jamais les 100 % et continuerons plutôt à ajouter de petites fractions

    • En plus de l’idée que la réalité contient une quantité étonnante de détails, il y a aussi la polarisation de la lumière1, rarement implémentée mais capable de produire des effets assez visibles dans certaines scènes

  • LuxRender est un excellent moteur de ray tracing spectral : https://luxcorerender.org/
    Cela dit, c’est vrai pour les anciennes versions, et le renderer LuxCore actuel ne prend pas entièrement en charge le spectral
    Au-delà des effets mentionnés ici, le rendu spectral présente d’autres avantages
    S’il est implémenté sous forme de light tracing, on peut modifier plus tard la couleur, le spectre et l’intensité des sources lumineuses, et l’éclairage indirect devient aussi bien plus précis dans de nombreuses scènes

  • Si vous voulez vous amuser avec une implémentation de ray tracing, l’écrire soi-même est étonnamment simple
    Il existe un très bon livre gratuit (https://raytracing.github.io/books/RayTracingInOneWeekend.ht...), et si vous connaissez un peu Unity, le tutoriel basé GPU (https://medium.com/@jcowles/gpu-ray-tracing-in-one-weekend-3...) est aussi très bien
    La version Unity dispose d’une GUI qui facilite l’aperçu de la scène et le déplacement de la caméra, ce qui la rend plus agréable à manipuler
    Si vous ne voulez pas partir de zéro, il existe aussi beaucoup d’implémentations basées sur ce type de ressources, mais ça vaut clairement le coup d’essayer soi-même
    En jouant avec une implémentation de base, j’ai essayé de faire se déplacer les rayons comme des particules, en courbant leur trajectoire vers les objets ou à l’inverse, ou encore en mémorisant le dernier angle de réflexion pour l’utiliser lors de la collision avec le matériau suivant
    La plupart des résultats n’étaient pas terribles, mais ça m’a donné une intuition de ce que je regardais, et bouger légèrement la caméra aide aussi beaucoup
    C’est vraiment amusant comme petit projet de programmation hobby
    En gros, lorsqu’un rayon croise un objet, on fixe une longueur maximale de rayon plus courte, puis depuis ce point on lance plusieurs rayons autour, en appliquant à chaque collision quelque chose qui ressemble à une équation de gravité
    Bien sûr, c’est lent et ce n’est qu’une approximation, mais c’est facile, et on peut même implémenter des objets trou noir qui courbent la lumière dans la scène

    • Quand j’ai écrit mon premier ray tracer, ça ne m’a pas pris tout un week-end : c’était environ quatre pages de C écrites en une nuit

      http://canonical.org/~kragen/sw/aspmisc/my-very-first-raytra...

      Par la suite, j’ai fait des ray tracers en Clojure et en Lua, et un ray marcher en JavaScript ; ça peut être très petit et très simple
      Hier soir, j’ai regardé Spongy de mentor/TBC https://www.pouet.net/prod.php?which=53871 : un ray tracer d’animation fractale avec brouillard, écrit en 65 instructions machine, et dont l’exécutable MS-DOS fait 128 octets
      Comme les images de ray tracing sont tellement impressionnantes, on peut facilement être intimidé et imaginer que les algorithmes et structures de données nécessaires sont eux aussi très difficiles, mais si vous connaissez déjà les vecteurs 3D, c’est en réalité assez simple
      Le ray marching à SDF me semble encore plus simple que les ray tracers traditionnels à la Whitted, parce qu’il remplace l’essentiel des maths compliquées nécessaires pour calculer les intersections exactes avec la géométrie de la scène par un algorithme d’approximation séquentielle très simple
      Les ray tracers extrêmement petits, comme Spongy ou le bootsector raytracer d’Oscar Toledo G. https://github.com/nanochess/RayTracer, sont souvent plus difficiles à comprendre que des implémentations un peu plus grandes
      Pour les rendre aussi petits, il faut beaucoup d’astuces, et ces astuces sont plus difficiles à comprendre qu’un code simple

  • Pour aller jusqu’au bout, il faudrait suivre non seulement la longueur d’onde de chaque rayon, mais aussi sa polarisation et sa phase
    Ces propriétés n’affectent réellement la perception humaine que dans des cas rares, comme les films minces ou les réseaux de diffraction, mais elles existent bel et bien

  • On voit la beauté des mathématiques et de la physique qui fonctionnent réellement
    Je me demande si certains ajustements ajoutés pour l’esthétique pourraient aussi être utiles dans d’autres modes de visualisation
    Ça me rappelle l’époque où je recopiais le code d’un livre pour faire de la musique polyphonique sur Apple II
    En l’exécutant, quelque chose n’allait clairement pas, mais au lieu d’un bruit âpre, cela produisait un motif sonore étrangement beau, et cette erreur accidentelle était assez fascinante

  • Je me demande s’il ne serait pas possible de créer des images avec bien plus que 3 canaux, comme des images hyperspectrales
    J’avais regardé ça pour accentuer le spectre afin de mieux enseigner les couleurs aux enfants
    Par exemple, en passant la souris sur un pixel de l’image1, on afficherait le spectre, renforçant ainsi le lien entre couleur et spectre
    Mais les images hyperspectrales sont rares, et les caméras[2] étaient traditionnellement chères
    Alors pourquoi pas des images hyperspectrales synthétiques ?
    Un moteur de rendu dans le navigateur à très basse résolution pourrait être assez rapide pour permettre de jouer de façon interactive avec l’éclairage et les matériaux
    On pourrait aussi implémenter le point de vue de personnes daltoniennes, d’humains « capables de voir les UV après ablation du cristallin cataracté », de mammifères non primates dichromates (souris/chiens), ou encore de poissons-zèbres tétrachromates

    1 http://www.ok.sc.e.titech.ac.jp/res/MSI/MSIdata31.html
    [2] Caméra multispectrale peu coûteuse utilisant un éclairage à bande étroite multiplexé dans le temps : https://ubicomplab.cs.washington.edu/publications/hypercam/

    • Avec du light tracing, on peut l’implémenter efficacement
      La valeur finale de l’image est la transformation des contributions de chaque source lumineuse, et comme on connaît le spectre des sources, on peut aussi obtenir le spectre du pixel
      En revanche, en présence d’une dispersion significative ou d’effets de films minces, il faut échantillonner la longueur d’onde pour chaque chemin, ce qui devient une approche plus approximative
  • J’envisageais d’implémenter la réfraction dans mon traceur de rayons distribué
    C’est une approche stochastique, pas une approche parallèle https://en.m.wikipedia.org/wiki/Distributed_ray_tracing
    Il me semble qu’il suffirait d’échantillonner aléatoirement les fréquences, de calculer la couleur correspondante, puis de l’utiliser pour ajuster la couleur du rayon
    Pour compenser le fait que la couleur de réfraction pure vaille 1/3 de la luminosité, il faut multiplier le résultat par 3

    • Le terme « ray tracing distribué » me semble correspondre à une étape intermédiaire dans l’évolution du ray tracing de Whitted vers ce qu’on appelle aujourd’hui le path tracing
      Si je me souviens bien, c’est un terme issu de l’un des articles SIGGRAPH de Rob Cook
      Pour un concept plus général et unifié, mieux vaut passer au path tracing ; il est aussi plus facile de trouver des astuces et techniques en faisant des recherches
      Quand on combine rendu spectral et réfraction, il faut bien échantillonner la distribution pour choisir les fréquences
      En général, cela peut être délicat, donc il vaut mieux construire les choses progressivement
      C’est pareil pour la réflexion, mais dans les deux cas, l’utilisation de matériaux dépendants de la fréquence reste un choix
      Même avec des matériaux simplifiés, il y a toujours de bonnes raisons d’utiliser une approche spectrale