3 Punkte von GN⁺ 2024-04-16 | 1 Kommentare | Auf WhatsApp teilen
  • Spektrales ray tracing arbeitet nicht nur mit Lichtstrahlen, die RGB-Werte tragen, sondern auch mit Wellenlänge und Phase und erzeugt so für jedes Pixel eine spectral power distribution (SPD)
  • Gewöhnliches ray tracing verfolgt aus Performance-Gründen den Weg vom Kamera-Standpunkt in Richtung Lichtquelle zurück und vereinfacht Lichtstrahlen zu Partikeln mit einem RGB-Vektor
  • Das menschliche Auge erzeugt Farbe aus den Reaktionen von drei Arten von Zapfenzellen, die auf kurze, mittlere und lange Wellenlängen empfindlich sind; dieselbe Farbe kann aus unterschiedlichen SPDs entstehen
  • In Szenen wie Dispersion oder Dünnschichtinterferenz, bei denen die Wellenlänge den Lichtweg und die Farbe beeinflusst, kann eine reine RGB-Näherung unzureichend sein
  • Ein in JavaScript und GLSL entwickelter spektraler ray tracer ohne Abhängigkeiten wird in Computer Art als Werkzeug eingesetzt, um mit absichtlich veränderten Lichtgesetzen unrealistische Farben und Bewegungen zu erzeugen

Kamera und ray tracing per Code

  • In Computer Art werden sowohl Szene als auch Kamera vollständig per Code erzeugt, und das Rendering-Ergebnis wird in ein Array von RGB-Werten umgewandelt
  • ray tracing lässt Lichtstrahlen zwischen virtuellen Objekten reflektieren und modelliert den Weg des Lichts zwischen simulierter Kamera und Lichtquelle
  • Aus Performance-Gründen wird die tatsächliche Ausbreitung des Lichts nicht direkt verfolgt, sondern mit mehreren Vereinfachungen gearbeitet
    • Da die meisten von einer Lichtquelle ausgehenden Strahlen die Kamera nicht erreichen, wird nicht an der Lichtquelle gestartet, sondern rückwärts aus der Kameraperspektive verfolgt
    • Dieses rückwärts gerichtete Tracing ist physikalisch plausibel unter der Annahme der T-symmetry, dass die Gesetze der Lichtausbreitung bezüglich der Zeitrichtung symmetrisch sind
  • Eine noch größere Vereinfachung ist, Lichtstrahlen nicht als Wellen, sondern als Partikel mit einem RGB-Farbvektor zu behandeln
    • Dabei wird der Wellencharakter des Lichts ignoriert, dennoch liefert das in vielen Szenen physikalisch plausible Ergebnisse
    • Möglich wird diese Näherung dadurch, dass das menschliche Auge drei Arten von Farbrezeptoren besitzt, die auf kurze, mittlere und lange Wellenlängen reagieren

Das Auge reagiert nicht auf RGB, sondern auf Spektren

  • Reales Licht besteht meist nicht aus einer einzelnen Wellenlänge, sondern aus einer spectral power distribution (SPD), also einer Mischung vieler Wellenlängen
  • Einer einzelnen wahrgenommenen Farbe können zahlreiche SPDs entsprechen; dieses Phänomen wird Metamerie genannt
    • Gelb kann zum Beispiel als einzelne Wellenlänge um etwa 580 nm wahrgenommen werden
    • Geräte, die nur RGB verwenden, etwa Computermonitore, stellen Gelb stattdessen über eine Kombination aus rotem und grünem Licht dar
  • Es gibt auch nicht-spektrale Farben, die sich nicht durch eine einzelne Wellenlänge erzeugen lassen, etwa Magenta
    • Magenta liegt nicht an einer einzelnen Position im Spektrum
    • Dafür ist eine Kombination aus niedrigen und hohen Wellenlängen nötig, also blauem und rotem Licht
  • Die Umwandlung einer SPD in eine Farbe lässt sich mathematisch beschreiben
    • Es gibt eine quantitative Verbindung zwischen Physik, Physiologie und subjektiver Farbwahrnehmung
    • Diese Verbindung ist in den 1931 eingeführten CIE 1931 color spaces festgehalten
  • Für eine direkte Implementierung kann das Kapitel zu Farbe in Physically Based Rendering herangezogen werden

Szenen, in denen Wellenlängen das Ergebnis verändern

  • Beim ray tracing muss nicht immer das gesamte Spektrum oder die Wellenlänge einzelner Lichtstrahlen berücksichtigt werden
  • In manchen Szenen beeinflusst die Wellennatur des Lichts jedoch direkt den Lichtweg und damit letztlich auch die sichtbare Farbe
  • Ein typisches Beispiel ist Dispersion
    • Der Ausbreitungsweg des Lichts wird je nach Wellenlänge unterschiedlich gebrochen
    • Dazu gehört auch der Effekt, dass ein Prisma weißes Licht in seine Frequenzbestandteile aufspaltet
  • Ein weiteres Beispiel ist Dünnschichtinterferenz (thin film interference)
    • Sie erklärt die regenbogenartigen Muster auf Seifenblasen
    • Licht, das an der oberen und unteren Schicht der Seifenhaut reflektiert wird, erzeugt konstruktive und destruktive Interferenz
    • Dabei wird das Spektrum nicht in einzelne Wellenlängen zerlegt, sondern der Beitrag bestimmter Spektralanteile verstärkt oder abgeschwächt
    • Dadurch entstehen häufig nicht-spektrale Farben wie Cyan, Teal, Magenta und Braun

Was spektrales ray tracing behandelt

  • Spektrales ray tracing ist ray tracing, das die Wellennatur des Lichts berücksichtigt
  • Es berechnet die Welt nicht nur in RGB-Farben, sondern erzeugt für jedes Pixel der Szene eine spectral power distribution
  • Durch die gemeinsame Verwendung von Wellenlänge und Phase kann Farbe in Situationen, in denen diese Informationen wichtig sind, besser geschätzt werden
  • Besonders nützlich ist das bei Effekten wie Dispersion oder Dünnschichtinterferenz, bei denen Wellenlänge und Phase die resultierende Farbe verändern

Einsatz in Computer Art

  • In neueren Arbeiten wird bewusst mit gebrochenen Gesetzen der Lichtbewegung gearbeitet, indem Kameras für ein leicht von der Realität abweichendes Universum per Code erzeugt werden
  • Dabei lässt sich der Reichtum des gesamten Lichtspektrums nutzen und zugleich können die Regeln der Lichtübertragung auf unrealistische Weise verändert werden
  • Die veröffentlichten Arbeiten wurden mit einem handgeschriebenen spektralen ray tracer ohne Abhängigkeiten in JavaScript und GLSL erzeugt
  • Beispielarbeiten sind unter anderem
    • Light Doesn't Bend That Way #1, 2023
      • Entstand, indem der Reflexionswinkel als Funktion der Wellenlänge definiert wurde
      • Dabei scheinen nur spektrale Farben erzeugt zu werden
    • Untitled, 2023
      • Ein Work in Progress für die Serie FULL_SPECTRUM, 2023 in Tokio gezeigt
    • Untitled, 2023
      • Verfügbar als Video 3
      • Besonders wichtig ist dabei, wie die Arbeiten in diesem System in Bewegung versetzt werden
    • Untitled, 2024

1 Kommentare

 
GN⁺ 2024-04-16
Hacker-News-Kommentare
  • Wenn man selbst etwas bauen möchte, behandelt das kostenlose E-Book Ray Tracing Gems II 1 Echtzeit-GPU-Raytracing auf Basis moderner APIs und Hardwarebeschleunigung und enthält auch ein Kapitel zu Spectral Rendering.
    Besonders relevant ist Kapitel 42, „Efficient spectral rendering on the GPU for predictive rendering“.

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

    • Für einen sehr schnellen Einstieg empfiehlt sich auch Ray Tracing in One Weekend 1; wer danach tiefer einsteigen möchte, ist mit Physically Based Rendering [2] gut bedient.

      1 https://raytracing.github.io/

      [2] https://pbrt.org/

    • Ich habe keine Zeit, selbst mit Raytracing herumzuspielen, aber beim Überfliegen der ersten Kapitel des Buchs wirkte Alias Sampling wie eine sehr elegante und gute Technik.
      Sie ist in einem viel breiteren Kontext als nur Grafik nützlich; ich wünschte, ich hätte früher davon erfahren.

  • Als Beispiele für Spectral Ray Tracer gibt es einige.
    Mitsuba ist ein Open-Source-Renderer für die Forschung mit vielen spannenden Funktionen wie differenzierbarem Rendering: https://www.mitsuba-renderer.org/
    Maxwell hat zwei Spectral-Modi mit unterschiedlicher Genauigkeit; der komplexere Ansatz wird häufig in der Optik verwendet: https://maxwellrender.com/
    Manuka von Wētā FX ist ein Spectral Renderer und wurde in mehreren Spielfilmen eingesetzt: https://dl.acm.org/doi/10.1145/3182161 sowie https://www.wetafx.co.nz/research-and-tech/technology/manuka

  • Meiner Ansicht nach ist Spectral Rendering ein gutes Beispiel dafür, dass Raytracing selbst nicht der Endpunkt des Renderings ist, sondern eher der Ausgangspunkt.
    Manchmal entsteht der Eindruck, Echtzeit-Raytracing habe das Rendering-Problem gelöst, aber ich halte das für weit von der Realität entfernt.
    Soweit ich weiß, behandeln die meisten Spectral-Rendering-Systeme keine Dünnschichtinterferenz oder andere wellenbasierte Effekte; auch das ist also eine weitere Grenze.
    Die Realität enthält erstaunlich viele Details.

    • Je näher Rendering an die zugrunde liegenden physikalischen Prinzipien heranrückt, desto mehr werden Game Engines zu Weltsimulations-Engines werden.
      Verschiedene Engine-Komponenten, die heute oft getrennt sind, könnten auf einen gemeinsamen Punkt zulaufen, sodass etwa die Trennung zwischen Physikschicht und Renderingschicht kleiner wird.
      Ich frage mich, ob man diesen Trend schon in gewissem Maß beobachten kann.
      Wenn die Rechenleistung um einige Größenordnungen wächst, werden heutige Abstraktionen so wirken, als seien sie durch technische Beschränkungen der Vergangenheit geformt worden – ähnlich wie wir heute den Stand der Technik von vor 30 Jahren betrachten.

    • Es ist wie ein Fraktal: Je näher man hinsieht, desto mehr Details treten zutage, die das beeinflussen, was wir sehen.
      Wir nähern uns schrittweise einem 100 % physikalisch korrekten Rendering, werden 100 % aber wahrscheinlich nie erreichen und stattdessen immer weitere kleine Prozentanteile hinzufügen.

    • Zusätzlich zu der Aussage, dass die Realität erstaunlich viele Details enthält, gibt es auch die Polarisation von Licht1: Sie wird nur von wenigen Implementierungen berücksichtigt, kann in bestimmten Szenen aber recht auffällige Effekte erzeugen.

  • Eine hervorragende Spectral-Raytracing-Engine ist LuxRender: https://luxcorerender.org/
    Allerdings bezieht sich das auf ältere Versionen; der aktuelle LuxCore-Renderer hat keine vollständige Spectral-Unterstützung.
    Neben den hier genannten Effekten hat Spectral Rendering noch weitere Vorteile.
    Wenn es als Light-Tracing-Ansatz implementiert wird, kann man später Farbe, Spektrum und Intensität der Lichtquellen ändern, und in vielen Szenen wird auch die indirekte Beleuchtung deutlich genauer.

  • Wenn man mit einer Raytracing-Implementierung herumspielen möchte, ist es überraschend einfach, selbst eine zu schreiben.
    Es gibt ein gutes kostenloses Buch (https://raytracing.github.io/books/RayTracingInOneWeekend.ht...), und wenn man sich ein wenig mit Unity auskennt, ist auch ein GPU-basiertes Tutorial (https://medium.com/@jcowles/gpu-ray-tracing-in-one-weekend-3...) gut.
    Die Unity-Version hat eine GUI, die Szenenvorschau und Kamerabewegung erleichtert, und lässt sich daher bequemer ausprobieren.
    Wenn man nicht bei null anfangen möchte, gibt es viele Implementierungen auf Basis solcher Materialien, aber es lohnt sich definitiv, es selbst zu versuchen.
    Ich habe mit einer Basisimplementierung herumgespielt und Strahlen wie Partikel bewegt, sodass ihre Pfade zu Objekten hin oder von ihnen weg gekrümmt wurden, oder den letzten Reflexionswinkel gespeichert, um ihn beim nächsten Materialtreffer zu verwenden.
    Die meisten Ergebnisse waren nicht besonders gut, aber ich habe ein Gefühl für das betrachtete Objekt bekommen, und die Kamera leicht zu bewegen hilft ebenfalls enorm.
    Als kleines Hobby-Programmierprojekt macht das wirklich Spaß.
    Dabei setzt man, wenn ein Objekt geschnitten wird, die maximale Länge des Strahls klein, schießt von diesem Punkt aus mehrere Strahlen in die Umgebung und wendet auf jeden Treffer etwas Ähnliches wie eine Gravitationsgleichung an.
    Natürlich ist das langsam und nur eine Näherung, aber es ist einfach, und man kann sogar so etwas wie ein Schwarzes-Loch-Objekt implementieren, das das Licht in der Szene krümmt.

    • Als ich meinen ersten Raytracer geschrieben habe, hat es nicht das ganze Wochenende gedauert, sondern war ungefähr vier Seiten C-Code, die ich in einer Nacht geschrieben habe.

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

      Später habe ich Raytracer in Clojure und Lua sowie einen Ray Marcher in JavaScript gebaut; sie können sehr klein und einfach sein.
      Gestern Abend habe ich Spongy von mentor/TBC gesehen https://www.pouet.net/prod.php?which=53871: ein fraktaler Animations-Raytracer mit Nebel, der aus 65 Maschinenbefehlen besteht; die MS-DOS-Executable ist 128 Byte groß.
      Weil Raytracing-Bilder so beeindruckend sind, lässt man sich leicht davon einschüchtern und nimmt an, dass auch die Algorithmen und Datenstrukturen zu ihrer Erzeugung sehr schwierig sein müssen; wenn man 3D-Vektoren bereits kennt, ist es in Wirklichkeit ziemlich einfach.
      SDF-Raymarching empfinde ich als noch einfacher als einen traditionellen Raytracer nach Whitted-Art, weil es den Großteil der komplexen Mathematik zum exakten Lösen von Schnittpunkten mit der Szenengeometrie durch einen sehr einfachen iterativen Näherungsalgorithmus ersetzt.
      Extrem kleine Raytracer wie Spongy oder Oscar Toledo G.s Bootsector-Raytracer https://github.com/nanochess/RayTracer sind oft sogar schwerer zu verstehen als etwas größere Implementierungen.
      Um sie so klein zu machen, braucht man viele Tricks, und diese Tricks sind schwerer zu verstehen als einfacher Code.

  • Wenn man es konsequent zu Ende führen will, muss man nicht nur die Wellenlänge jedes Strahls verfolgen, sondern auch Polarisation und Phase.
    Solche Eigenschaften beeinflussen die tatsächliche menschliche Wahrnehmung nur in seltenen Fällen, etwa bei dünnen Filmen oder Beugungsgittern, aber es gibt sie eindeutig.

  • Man sieht die Schönheit daran, dass Mathematik und Physik tatsächlich funktionieren.
    Ich frage mich, ob einige Anpassungen, die für die Schönheit eingebaut wurden, auch für andere Visualisierungsarten nützlich sein könnten.
    Das erinnert mich auch an die Zeit, als ich Code aus einem Buch abgetippt habe, um auf dem Apple II polyphone Musik zu erzeugen.
    Als ich ihn ausführte, war offensichtlich etwas falsch, aber statt rauem Rauschen entstand ein seltsam schönes Tonmuster, und dieser zufällige Fehler war ziemlich faszinierend.

  • Ich frage mich, ob man Bilder mit weit mehr als drei Kanälen erstellen könnte, wie bei hyperspektralen Bildern.
    Ich habe mir das einmal angesehen, um Spektren hervorzuheben und Kindern Farben besser zu erklären.
    Zum Beispiel könnte man auf einem Bild1 mit der Maus über ein Pixel fahren und dessen Spektrum anzeigen, um den Zusammenhang zwischen Farbe und Spektrum zu verstärken.
    Hyperspektrale Bilder sind jedoch selten, und Kameras[2] waren traditionell teuer.
    Wie wäre es also mit synthetischen hyperspektralen Bildern?
    Ein Browser-Renderer mit sehr niedriger Auflösung könnte schnell genug sein, um interaktiv mit Beleuchtung und Materialien herumzuspielen.
    Außerdem könnte man Perspektiven wie Farbfehlsichtigkeit, Menschen, die „nach Entfernung der kataraktösen Linse UV sehen können“, dichromatische nicht-primaten Säugetiere (Mäuse/Hunde) oder tetrachromatische Zebrafische implementieren.

    1 http://www.ok.sc.e.titech.ac.jp/res/MSI/MSIdata31.html
    [2] Eine günstige multispektrale Kamera mit zeitlich multiplexierter schmalbandiger Beleuchtung: https://ubicomplab.cs.washington.edu/publications/hypercam/

    • Mit Light Tracing lässt sich das effizient umsetzen.
      Der Endwert eines Bildes ist die transformierte Summe der Beiträge der einzelnen Lichtquellen, und da man die Spektren der Lichtquellen kennt, kann man auch das Spektrum eines Pixels erhalten.
      Trifft man allerdings auf nennenswerte Dispersion oder Dünnschichteffekte, muss für jeden Pfad eine Wellenlänge gesampelt werden, wodurch es zu einem stärker approximativen Verfahren wird.
  • Ich überlegte, ob ich Brechung in meinen Distribution Ray Tracer einbauen sollte.
    Das ist ein stochastischer Ansatz, kein paralleler: https://en.m.wikipedia.org/wiki/Distributed_ray_tracing
    Es müsste reichen, zufällig Frequenzen zu sampeln, deren Farbe zu berechnen und sie dann zum Anpassen der Strahlenfarbe zu verwenden.
    Um zu korrigieren, dass die reine Brechungsfarbe nur 1/3 der Helligkeit hat, muss man das Ergebnis mit 3 multiplizieren.

    • Der Begriff „Distribution Ray Tracing“ war, glaube ich, eher eine Bezeichnung aus der Zwischenphase der Entwicklung vom Whitted Ray Tracing zum heutigen Path Tracing.
      Soweit ich mich erinnere, stammt der Begriff aus einem der SIGGRAPH-Paper von Rob Cook.
      Als allgemeineres und einheitlicheres Konzept ist es besser, sich in Richtung Path Tracing zu orientieren; dabei findet man bei der Suche oder Recherche auch leichter Tipps und Techniken.
      Wenn man spektrales Rendering mit Brechung kombiniert, ist es richtig, die Verteilung zu sampeln und eine Frequenz auszuwählen.
      Da das im Allgemeinen knifflig sein kann, ist es besser, das schrittweise aufzubauen.
      Für Reflexion gilt dasselbe, aber in beiden Fällen ist es eine Entscheidung, ob man frequenzabhängige Materialien verwenden will.
      Selbst bei vereinfachten Materialien gibt es weiterhin Gründe, einen spektralen Ansatz zu nutzen.