Kohärentes Raytracing: Die nächste Entwicklung im Raytracing

Kohärente Strahlverfolgung

Ray Tracing ist zweifellos die Zukunft des Echtzeit-Renderings geworden, insbesondere wenn die Rasterung bestimmte visuelle Probleme nicht lösen kann und nicht mehr als sich selbst bietet. Die Implementierung ist jedoch nicht einfach und die Leistung ist selbst mit den fortschrittlichsten GPUs nicht ideal. Hier kommt der nächste Schritt ins Spiel, Coherent Ray Tracing. Was trägt es bei, warum ist es notwendig und woraus besteht es?

Ray Tracing, das heutzutage in Spielen verwendet wird, ist das sogenannte Hybrid-Rendering, bei dem der kohärente Teil der Szene mithilfe des Rasterisierungsalgorithmus und der inkohärente Teil der Szene durch Ray Tracing gerendert werden. Trotz der Aussagen der verschiedenen Unternehmen Die Ära, in der Spiele nur durch Raytracing gerendert werden, ist noch nicht gekommen.

Direktes vs indirektes Licht

Um diese Aussage verständlicher zu machen, nehmen wir an, dass die Szene durch Rasterung gerendert wird, wobei die indirekte Beleuchtung, die entsteht, wenn eine Lichtquelle auf ein Objekt fällt und das Licht in neue Richtungen reflektiert, vollständig ignoriert wird.

Rasterización Ray Tracing steuern

Ray Tracing macht inkohärente Elemente der Szene genauer, schneller und effizienter als die Rasterung. Es gibt jedoch ein damit verbundenes Leistungsproblem beim Rendern des inkohärenten Teils der Szene, das die Berechnungskosten bei der Anwendung von Ray Tracing sehr hoch macht genau die nächste große herausforderung für unternehmen wie NVIDIA und AMDOptimieren der Leistung des inkohärenten Teils der Szene beim Raytracing.

Konsistente Raytracing und inkonsistente Raytracing

Kohärente inkohärente Strahlen

Lassen Sie uns das momentan in Spielen verwendete Hybrid-Rendering beiseite legen und unsere Aufmerksamkeit auf das reine Ray Tracing richten, bei dem Strahlen auf zwei verschiedene Arten bewertet werden können.

  • In reinem Ray Tracing, kohärente Strahlen werden als solche betrachtet, die aus der Kamera kommen und dem Pfad der Kegelstumpfansicht der Szene folgen. Diese Strahlen werden als kohärent bezeichnet, aber sie werden beim Hybrid-Rendering nicht verwendet.
  • Inkohärente Strahlen sind solche, die durch den Aufprall eines Lichtstrahls auf ein Objekt erzeugt werden.
  • Kohärente Strahlen sind solche, die aus einer primären Lichtquelle kommen, das heißt, sie wurden nicht durch den Aufprall eines vorherigen Strahls auf das Objekt erzeugt.

Wenn wir auf visueller Ebene nur über direkte Beleuchtung sprechen, gibt es keinen Unterschied in der visuellen Qualität beim Rendern einer Szene mit nur direkter Beleuchtung zwischen Rasterisierung und Raytracing. Fügen Sie dies der Tatsache hinzu, dass alle Spiel-Engines über Raster arbeiten und Sie den Grund verstehen Warum wird welche Raytracing-Funktion beim Rendern des zusammenhängenden Teils der Szene nicht verwendet?

Die Leistung des nicht kohärenten Teils von Ray Tracing auf einer GPU

Das Problem ist, dass, obwohl Raytracing den inkohärenten Teil einer Szene viel besser rendern kann als die Rasterung, das Problem besteht, dass inkohärente Strahlen eine viel geringere Leistung haben als die Berechnung der kohärenten Strahlen der Szene.

Der Grund für diese Leistungsunterschiede liegt in der Tatsache, dass nicht alle Informationen der Szene nicht in der enthalten sind GPU Cache, auf den die Strahlschnitteinheiten zugreifen, mit nicht kohärenten Strahlen wirken sie sich nicht auf denselben Bereich der Szene aus und wirken sich daher nicht auf denselben Shader aus, was zu Stopps in einer großen Anzahl von Threads in der GPU führt Leistungseinbußen.

Pixar Raytracing-Cine

Dies ist ein Problem, das sie in der Filmindustrie durch Strahlenumlagerungsalgorithmen lösen, aber sie können es leicht tun, weil sie die Position der Kamera im Voraus kennen und daher alle inkohärenten Strahlen der Szene in Strahlen umwandeln können. konsistent durch einen Bestellalgorithmus.

Aber wenn es darum geht, einen Film zu rendern, den sie weltweit immer haben, müssen sie nicht alle paar Millisekunden ein Bild anzeigen, und die Sortieralgorithmen sparen mehr Zeit und damit die Kosten ihrer leistungsstarken Rendering-Farmen, aber Die Situation in Videospielen ist anders.

Cyberpunk-Raytracing

In einem Videospiel, in dem jedes Bild ein Unikat ist, ist dies jedoch nicht möglich. Außerdem wäre eine hochleistungsfähige Hardware erforderlich, damit die Anordnung der Strahlen der Szene die hohe Bildrate nicht beeinträchtigt. Dies ist derzeit die nächste große Herausforderung von GPU-Herstellern gelöst werden und es ist ein entscheidendes Element, wenn Ray Tracing in Bezug auf die Leistung nicht stagnieren soll.

Aktuelle GPUs sind nicht für inkonsistentes Ray Tracing vorgesehen

VRAM

Die Grafikprozessoren, die wir in unseren PCs verwenden, wurden für die Rasterung entwickelt. Hierbei handelt es sich um einen ausgenutzten Rendering-Algorithmus, der sehr gut von der räumlichen und zeitlichen Position der Speicherzugriffe profitiert.

Die meisten Arbeiten, die die GPU während der Rasterung ausführen muss, haben die Besonderheit, dass beim Anwenden eines Shader-Programms, insbesondere während des Pixel-Shaders, die Daten der Pixel und Dreiecke, die sie verarbeitet, mit ihren nächsten Nachbarn geteilt werden. In der Szene.

Es gibt also viele Möglichkeiten, dass die GPU, wenn sie auf die Daten für eine Gruppe von Dreiecken und Pixeln zugreift und alle in der Nähe befindlichen im Speicher in den Caches sammelt, bereits die Daten für die benachbarten Pixel und Dreiecke hat. Die Änderungen müssen also erfolgen, um diese gemeinsame Eigenschaft aller GPUs auszunutzen.

Die räumliche Datenstruktur

Estucturas Datos Espacial

Um das Ray Tracing zu beschleunigen, wird lediglich eine räumliche Datenstruktur erstellt. Diese Struktur ist nichts anderes als die Karte der Position der Objekte in der Szene in geordneter Weise.

Die Szene wird in eine Art Würfel mit mehreren Unterteilungen umgewandelt, die angeben, wo sich die Objekte befinden. Es gibt zwei Arten:

  • Die Szene ist durch den Raum in reguläre Blöcke unterteilt.
  • Die Szene ist in diejenigen Teile unterteilt, in denen Geometrie oder Elemente vorhanden sind.

In Spielen wurde der zweite Typ durch die Einführung von BVH ausgewählt, insbesondere aufgrund der Tatsache, dass NVIDIA dedizierte Hardware in seinen GPUs hat, um schnell in dieser Baumdatenstruktur zu navigieren. Es gibt jedoch zwei Arten von BVH:

  • Statische BVHs müssen erneut erstellt werden, nachdem wir ein Objekt in der Szene geändert haben. Sobald sie jedoch erstellt wurden, beschleunigen sie die Renderzeit der Szene.
  • Mit dynamischen BVHs können die Objekte einzeln aktualisiert werden, sodass beim Wiederherstellen des BVH die Zeit dafür viel kürzer ist, im Gegenzug jedoch die nachfolgende Renderzeit zunimmt.

Und wie wichtig ist das? Wenn wir die Strahlen nach ihrer Flugbahn in der Szene ordnen möchten, müssen wir zunächst eine Karte derselben Szene haben können, auf der wir die Flugbahn der Strahlen speichern können.

Kartierung des Strahlengangs

Raytracing-Steuerung

Eine Lösung besteht darin, die Strahlen die Szene vorab durchlaufen zu lassen, ohne sie zu ändern, nur um zu wissen, welche Objekte die verschiedenen Strahlen beeinflussen und welche die Strahlen die Szene durchqueren werden. Sobald die Pre-Tour beendet ist, werden die verschiedenen Strahlen, die insbesondere einen Teil der Szene betreffen, in einem Speicherpuffer gespeichert, obwohl sie nicht miteinander in Beziehung stehen.

Obwohl es keine direkte Beziehung zwischen den verschiedenen Strahlen desselben Ortes gibt, gibt es eine räumliche Beziehung, die dazu beiträgt, die gemeinsame Architektur aller GPUs beim Rendern einer Szene mit nicht kohärenten Strahlen auszunutzen. Die Idee ist, die Szene vorab zu rendern, aber ohne die Shader zu berechnen, die die Farbwerte der verschiedenen Objekte beim Rendern der Szene variieren, sind wir einfach daran interessiert zu wissen, welche Teile der Szene die einzelnen Strahlen beeinflussen.

Strahlen, die die Szene vorab ausführen

Rayus Rebotando Espacio

Die Strahlen, die die Szene vorkreuzen, führen nur einen Shader aus, den Ray Generation Shader, der anzeigt, dass dieses Objekt in der Szene einen indirekten Lichtstrahl erzeugen kann, da für die Strahlen selbst eine Reihe mit ihnen vorhanden ist Parameter, die verhindern, dass sie für immer springen, wie Tischtennisbälle in der ganzen Szene.

Zu diesem Zweck ist es notwendig, eine Reihe von Parametern zu platzieren, die den Strahlen und den Objekten zugeordnet sind, die die folgenden wären:

  • Eine Konstante, die die Anzahl der Bounces ist, die ein Strahl in der Szene erzeugen kann. Sobald diese Anzahl der Bounces unabhängig von den anderen Bedingungen erfolgt ist, hört der Strahl auf zu springen.
  • Eine Konstante in jedem Material, die die Brechungskonstante ist, die von 0 bis 1 geht, wobei bei jedem Schnittpunkt der Energiewert des Strahls mit der Brechungskonstante multipliziert wird, wenn ein Strahl ein Energieniveau erreicht, das niedrig genug ist, dass er verworfen wird.

Raytracing Coherente

Damit können wir die Strahlen bereits vorab durch die Szene springen lassen, was die Reihenfolge der Daten erleichtert, da wir damit wissen, in welchen Teilen der Szene die verschiedenen Strahlen wirken. Dies beschleunigt die Leistung erheblich, erfordert jedoch zwei Hardwareänderungen.

Eingebetteter Speicher zum Speichern der räumlichen Datenstruktur

3DIC-SRAM

Was jetzt bleibt, ist, in der Lage zu sein, die gesamte räumliche Datenstruktur in einem Speicher so nah wie möglich am Prozessor sowie die Daten vor der Tour zu speichern, aber diese Datenstruktur kann nicht in den begrenzten Caches von einigen Megabyte gespeichert werden. Weder der Infinity Caché könnte trotz seiner 128 MB eine solche Datenmenge speichern.

Was benötigt wird, ist, einen Weg zu finden, um so viel Speicher wie möglich in der Nähe der GPU zu platzieren, der zum Speichern der gesamten räumlichen Datenstruktur dient. Dieser Speicher wäre kein Cache und würde nicht Teil der Speicherhierarchie des Prozessors sein. es würde einfach dazu dienen, die gesamte räumliche Datenstruktur darin zu speichern.

Eine Möglichkeit, dies zu erreichen, wäre die Verwendung eines vertikal mit der GPU verbundenen SRAM-Speichers. Die Implementierung dieses Speichers könnte jedoch mit einigen zusätzlichen Ergänzungen verbunden sein, die die zukünftige Implementierung in den GPUs nutzen. Obwohl es andere Möglichkeiten gibt, dies zu tun, können sie dies sogar in Form eines neuen Caches der letzten Ebene mit hoher Dichte tun.

Die nächsten festen Funktionseinheiten

GPU-HPC

Es wird zwei geben, die für die Leistungssteigerung von entscheidender Bedeutung sind:

  • Der erste ist für die Erzeugung der Geodatenstruktur durch die Position der Geometrie in der Szene verantwortlich.
  • Als zweites müssen Sie notieren, wo jeder Strahl während der Tour trifft, bevor Sie Ray Tracing anwenden.

Beide Einheiten werden den enormen eingebetteten Speicher nutzen, den die GPUs zum Speichern der räumlichen Datenstruktur der Szene enthalten. Dank ihnen werden wir eine starke Leistungssteigerung in Bezug auf Ray Tracing sehen.

PowerVR-Assistent

Diese Einheiten sind bereits in Hardwarelösungen wie Wizard's PowerVR in Form von Scene Hierarchy Generator und Coherency Engine enthalten. Ihre Nützlichkeit wurde mehr als demonstriert, jedoch nicht in extrem komplexen Umgebungen, in denen die Implementierung von eingebettetem Speicher erforderlich sein wird.