@Ganjaware
Raytracing ist eine Methode aus einer dreidimensionalen Definition einer Szene ein zweidimensionales Bild zu erzeugen. Mit Szene meine ich zum Beispiel Lichtquellen, Dreiecken und Materialien, die die Reflexions- und Transmissionseigenschaften der Dreiecke definieren
Rasterisierung ist ein anderes sogenanntes "Rendering"-Verfahren. Dort wird im Prinzip einfach nur bestimmt, welches Dreieck in welchem Pixel zu sehen ist, und dann in Abhängigkeit der Position auf diesem Dreieck das Pixel anders eingefärbt (das ist die Aufgabe des Pixel Shaders). (Vertex-, Geometrie- und Tesselation-Shader ignoriere ich hier einfach mal.
)
Mittlerweile ist das Programm zur Berechnung der Farbe in dem Pixel deutlich komplexer als früher. (Am Anfang ordnete man jedem Dreieck eine Farbe zu und färbte das Pixel dann entsprechend ein.)
Raytracing hingegen verfolgt die Ausbreitung von Licht als Strahlen von der Kamera zur Lichtquelle. Je nachdem, welche Materialen unter welchem Winkel auf diesem Weg getroffen wurden, kommt unterschiedlich viel Licht einer bestimmten Farbe in der Kamera an.
Raytracing ist ein deutlich
realistischeres Modell, um zu simulieren, wie eine Kamera ein Bild aufnimmt.
Ich hoffe das beantwortet deine Frage halbwegs verständlich.
Ein
Vorteil des Raytracings ist, dass es keine große Suppe von Hacks ist:
Moderne Rasterisierungsengines sind eine Riesensammlung von Schummeleien, die alle ihre Spezialfälle haben, in denen diese dann sichtbar werden.
Beispiel: Die Unreal Engine 4 simuliert Spiegelungen auf Objekten mit einer Mischung aus Relection Captures und Screen-Space-Reflections. Das kann richtig gut aussehen. (
https://www.youtube.com/watch?v=B3ZNf6-SDZA)
ABER: Diese Szene verwendet als Lichtquelle nicht nur die Spots an der Decke und die Sonne, sondern auch noch 4 Lampen die am Fenster platziert sind, um die richtige Beleuchtung zu erzeugen.
Indirekte Beleuchtung (das Sofa spiegelt sich in der Vase, beleuchtet die Umgebung rot schimmernd etc.) werden über spezielle unsichtbare Objekte (Reflection Captures) realisiert, die vom Level-Designer mit einer Abwägung zwischen Performance und Optik sowie etwas Können gesetzt werden müssen.
In einem Raytracer definiere ich einfach die Sonne und die Deckenlampen und der Rest kommt von selbst.
Wenn ich jetzt eine simple spiegelnde Oberfläche in diese Szene setze (habe ich selbst probiert), dann wird plötzlich offensichtlich, dass diese Spiegelungen eigtl. grausam falsch sind. Dann muss man beginnen, mit virtuellen Kameras, speziellen Render-Targets und so weiter einen Spiegel hinzutricksen.
Ansonsten gilt aber auch, dass der Übergang fließend ist. Die indirekte Beleuchtung wird in dieser Szene mit Raytracing(!) offline berechnet. Aber das Egebnis ist dann halt nur eine Approximation.
@paulinus
Es stimmt, dass die logarithmische Skalierung (Geschwindigkeit proportional zu log(Anzahl an Dreiecken)) meistens bei Raytracing durch hierarchische Strukturen wie QBVH-Bäume erzeugt wird. Aber das ist nicht der einzige Ansatz.
Mora et al haben vor ein paar Jahren das Konzept des Divide and Conquer Raytracings vorgestellt, das (analog zu zum Beispiel Quicksort) die Dreiecke und Lichtstrahlen sortiert und damit ohne explizite Baumstruktur auskommt. Im Bestfall kann das auch logarithmisch skalieren. In ihren Tests war es als Single-Core-Implementierung (nach ihren Benchmarks) wettbewerbsfähig. Mittlerweile gab es auch Verbesserungen und eine Implementierung auf GPUs. In einem production ready Raytracer habe ich den Algorithmus bisher nicht gesehen, aber das wäre ein Ansatz, der auch für dynamische Szenen funktioniert.
Aber bisher ist ja Echtzeit selbst mit statischer Geometrie eine harte Nummer.