Wie funktionieren Raymarch-Shader?

49

Ich habe mir Shader angesehen, die hier auf shadertoy.com zu finden sind, und die meisten coolen haben Lärm und Raymarch gemeinsam. Ich verstehe den Quellcode überhaupt nicht, aber ich möchte es wirklich. Wie funktionieren diese Shader und wie funktioniert der Raymarch-Algorithmus? Ich habe überall gesucht und kann zu dem Thema nichts finden.

Vielen Dank

jmasterx
quelle
6
Iñigo Quilez hat hervorragende Tutorials dazu geschrieben. Siehe iquilezles.org/www/articles/raymarchingdf/raymarchingdf.htm , iquilezles.org/www/material/nvscene2008/nvscene2008.htm und iquilezles.org/www/articles/distfunctions/distfunctions.htm . Diese coolen Shader sind nicht irgendein Raymarching, sondern speziell Raymarching-Distanzfelder, auch Sphere Tracing genannt.
Msell
Fragen Sie nach Ray Marching im Allgemeinen oder Ray Marching auf der GPU?
concept3d
@Milo Könnten Sie Ihre Frage klären? Fragen Sie sich, wie diese Algorithmen verwendet werden, um die Bilder zu generieren, die Sie in den coolen Demos sehen? Fragen Sie sich, wie Ray Marching funktioniert? Fragen Sie sich, wie Ray-Marching in Fragment- / Pixel-Shadern (dh effiziente Implementierung) funktioniert?
TravisG
Ich implementierte Raymarching in Unity - Engine github.com/smkplus/UnityRayMarching
Seyed Morteza Kamali

Antworten:

79

Im Gegensatz zum Raytracing ist es wahrscheinlich am einfachsten zu verstehen.

Um ein Grundelement mit Raytracing zu rendern, benötigen Sie eine Funktion, die Ihnen anhand des Grundelements und des Eingabestrahls genau sagt, wo dieses Strahls auf das Grundelement trifft. Dann können Sie den Strahl mit allen relevanten Grundelementen testen und den nächstgelegenen Schnittpunkt auswählen. CPUs sind gut darin.

Beim Raymarchen gibt es keine so einfache Funktion zum Schneiden von Strahlen. Wenn Sie einen Punkt auf dem Strahl haben, können Sie schätzen, wie nahe der Punkt an der Oberfläche liegt, aber Sie wissen nicht genau, wie weit Sie diesen Strahl ausdehnen müssen, um auf die Oberfläche zu treffen.

Sie "marschieren" also Schritt für Schritt:

  1. Beginnen Sie am "Anfang" des Strahls - der nahen Ebene für das Rendern der Szene oder dem Schnittpunkt mit dem Begrenzungsvolumen, wenn es sich nur um ein Objekt in der Szene handelt. (P0 im Diagramm unten)

  2. Werten Sie Ihre Distanzfunktion aus, um eine Schätzung zu erhalten, wie nahe Sie an der Oberfläche sind. (Der größte Kreis im Diagramm)

  3. Bewegen Sie sich gemäß Ihrer Schätzung auf dem Strahl vorwärts. Die Bewegung sollte konservativ kurz sein, sodass Sie sicher sind, dass Sie nirgendwo durch die Oberfläche tunneln werden.

  4. Jetzt haben Sie einen neuen Punkt (P1 unten) - erhalten Sie eine neue Schätzung und wiederholen Sie diese.

  5. Fordern Sie weitere Schätzungen an und gehen Sie vorwärts, bis Sie sich innerhalb eines Schwellenabstands von der Oberfläche befinden oder Ihre maximale Schrittzahl erreicht ist. (P4 unten)

  6. Jetzt haben Sie die Tiefe der Oberfläche und können Dinge wie Normalen / Umgebungsokklusion aus nahegelegenen Proben ableiten und diese Daten zum Beleuchten und Färben des Pixels verwenden.

Marschiere einen Strahl von P0 in Richtung seiner Kreuzung

Beispieldiagramm aus GPU Gems 2, Kapitel 8

Da jeder Strahl unabhängig ist und bei jedem Schritt (im Allgemeinen) nur lokale Informationen verwendet, ist er reif für die Parallelisierung auf GPUs. Oft werden nur zwei Dreiecke auf dem Bildschirm gezeichnet. Nach dem Rastern repräsentiert jedes Pixel, das an den Fragment-Shader übergeben wird, einen einzelnen Strahl. Der Fragment-Shader marschiert diesen Strahl bis zur Oberfläche und gibt das Ergebnis zurück (häufig nur den Tiefenwert für Texturierung und Schattierung in einem separaten Vollbilddurchlauf).

Die genauen Schritte hängen stark von dem jeweiligen Effekt ab, den Sie erzielen möchten. Raymarching-Techniken werden bei ...

  • Höhenfelder zur Simulation von Oberflächenverschiebungen in traditioneller gerasterter Geometrie (Parallaxenokklusionskartierung)
  • Szenentiefenpuffer für Dinge wie Screenspace-Reflexionen
  • Volumentexturen zur Visualisierung von 3D-abgetasteten Datensätzen (häufig wissenschaftlich / medizinisch)
  • implizite Funktionen zum Rendern von Dingen wie Fraktalen
  • prozedurale Distanzfelder wie bei Iñigo Quilez (tolle Links von msell in den Kommentaren oben).

Raymarching wird auch beim Mischen bei jedem Schritt verwendet (häufig werden feste Schritte verwendet, anstatt jedes Mal einen Abstand zu schätzen), um die volumetrische Transluzenz wiederzugeben, wie in diesem Beispiel aus Wikipedia .

Raymarching eine lichtdurchlässige Volumenbeschaffenheit

Dies ist eine beliebte Methode, um detaillierte Wolken in Echtzeit zu rendern .

Sogar Interior Mapping , eine Methode zur Simulation von Innenraumdetails hinter Gebäudefenstern, kann als Raymarching angesehen werden, bei dem der Strahl von dem Punkt, an dem er in das Fenster eintritt, zur nächstgelegenen Wand, zum nächstgelegenen Boden / zur nächstgelegenen Decke oder zur nächstgelegenen Möbelebene geführt wird.

Wenn Sie an einem bestimmten Raymarching-Effekt interessiert sind, können Sie wahrscheinlich genauere Antworten erhalten, indem Sie eine neue Frage mit bestimmten Beispielen stellen. Als Familie ist die Technik zu vielfältig, um alles in einer kurzen Antwort abzudecken. ;) Ich hoffe, das gibt dir einen Rahmen, um zu verstehen, was in diesen Shadern unter der Haube passiert.

DMGregory
quelle