Computergrafik

Raymarching Mit Open GL

Signed Distance Functions | | Raycasting Beispiel

Die OpenGL Pipeline passt nicht 100%ig zum Konzept von Raycasting, deshalb muss man die einzelnen Schritte entsprechend abbilden:

Strahlenerzeugung

  • Man zeichnet einen Quad mit den x- und y-Koordinaten $\pm 1$, ohne Transformation $\rightarrow$ bildschirmfüllend.
  • Man ermittelt/übermittelt die Welt-Koordinaten des Augpunkts
  • Aus Welt-Koordinaten der Vertices oder Screenspace-Koordinaten (glFragCoord) und der Frustum-Parameter (Fovy, Aspect Ratio) berechnet man den Augstrahl (View-Vektor)

Algorithmus

  • Entweder Raycasting oder Raymarching
    • Raycasting:
      • Berechnung aller Schnittpunkte mit der Geometrie
      • niedrigster Abstand $\rightarrow$ Treffer
    • Raymarching:
      • Geometrie z.B. durch SDFs definiert, oder über Texturen
      • Berechnung des nächsten Abtastpunktes mit binärer Suche oder Sphere Tracing
      • niedrigster Abstand gewinnt, negativ $\rightarrow$ Treffer

Bei Treffern

  • Beleuchtungsberechnung, volumetrische Abschwächung etc.
  • Ggf. abschicken von Schattenstrahlen zu den Lichtquellen
  • Verfolgen eines Reflexions- oder Refraktionsstrahls;
    (beide zusammen sind in OpenGL nicht einfach möglich, im Shader ist keine Rekursion erlaubt)
GLSL-Shading GLSL-Fogging

Weitere aufeinander aufbauende Beispiele gibt es auf ShaderToy.

Literatur:

Live Demo: Ray Marching with SDFs (T#A19a-c)

Signed Distance Functions | | Raycasting Beispiel

Options: