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
- Raycasting:
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)
Weitere aufeinander aufbauende Beispiele gibt es auf ShaderToy.
Literatur:
- Ray Tracing Gems II - Next Generation Real-Time Rendering with DXR, Vulkan, and OptiX. Springer, 2021.
- Real-Time Rendering Blog
Live Demo: Ray Marching with SDFs (T#A19a-c)