Computergrafik

Raymarching Mit Open GL

Signed Distance Functions | | Bounding Volume Hierarchy

OpenGL passt nicht 100%ig auf Raytracing, 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 (untransformierten) Vertex-Koordinaten oder Screenspace-Koordinaten (glFragCoord), View-Matrix und Projektionsinformationen (Fovy, Aspect Ratio) berechnet man den Augstrahl (View-Vektor)

Algorithmus

  • Entweder Raycasting oder Raymarching z.B. mit Sphere Tracing.
  • Raycasting: Berechnung aller Schnittpunkte mit der Geometrie, der vorderste gewinnt
  • Raymarching: Berechnung aller SDFs pro Abtastpunkt, niedrigster gewinnt, negativ $\rightarrow$ Treffer
  • Geometrie: Entweder explizit im Shader, oder über Texturen

Bei Treffern

  • Beleuchtungsberechnung
  • 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

Es gibt weitere aufeinander aufbauende Beispiele auf ShaderToy.

Signed Distance Functions | | Bounding Volume Hierarchy

Options: