Traversal-Shader, was sind sie und welche Anwendungen haben sie auf der GPU?

Traversal-Shader

Seit dem Erscheinen von DirectX 8 nimmt die Zahl der neuen Shader-Typen im Laufe der Zeit zu, die nächsten, die in die Liste aufgenommen werden, heißen Traversal-Shader, die mit den Fortschritten in Richtung Akzeptanz mit Pause, aber ohne Raytracing-Bremse zu tun haben Spiele. Mal sehen, woraus es besteht und welche Verbesserungen es den Spielen in Bezug auf die Leistung bringt.

Traversal-Shader sind eine der beiden Philosophien, um das Problem des Pfades der räumlichen Datenstruktur in Ray Tracing zu stellen, das darin besteht, Shader-Programme zu verwenden, um die räumliche Datenstruktur zu durchqueren, die die Szene darstellt, anstatt spezialisierte oder dedizierte zu verwenden Hardware.

Erinnern wir uns zunächst daran, was ein Shader ist

Ejemplo funcionamiento Shader

In der Software kennen wir umgangssprachlich als Shader ein Programm, das auf den Kernen der GPU, die je nach Hersteller unterschiedliche Namen haben. So AMD nennt diese Hardware-Teile Computer Units in seiner Radeon, NVIDIA nennt sie Stream Multiprocessors oder SM in seiner GeForce und Intel gibt ihnen in ihren ARC-Namen diese Einheiten Xe Core.

Der Shader selbst ist also die Software, die auf einem dieser Geräte läuft, die sehr ähnlich funktionieren CPU, der Unterschied besteht darin, dass ein Shader ein Programm ist, das auf einem grafischen Grundelement in den verschiedenen Phasen der Renderpipeline ausgeführt wird: Vertices, Grundelemente, Dreiecke, Shards oder Pixel. Obwohl diese Kategorien nichts anderes als Abstraktionen sind, die wir machen, sind für die Shader-Einheit alles Daten und das bedeutet, dass sie alle Arten von Programmen ausführen können.

Warum also keine CPU verwenden? Nun, aufgrund der Tatsache, dass es Probleme gibt, dass GPUs, die für den Parallelbetrieb ausgelegt sind, bei der Lösung bestimmter Kontexte viel besser funktionieren als das, was eine CPU tut, und dies geschieht im Fall von GPUs.

Microsoft, DirectX Raytracing und seine Shader

Microsoft DirectX 12-Raytracing

Als Redmond auf der Games Developer Conference 2018 zum ersten Mal über die Implementierung von Raytracing sprach, waren es noch ein paar Monate bis zum Launch der NVIDIA RTX 20 und zu diesem Zeitpunkt war es zumindest öffentlich völlig unbekannt, welche Einheiten zu beschleunigen sind Raytracing wie NVIDIAs RT Cores und AMDs Ray Acceleration Units.

Was war Microsoft's Vorschlag, seine Multimedia-API zu erweitern? Nun, fügen Sie eine Reihe zusätzlicher Stufen hinzu, die im folgenden Diagramm definiert sind:

DXR-Stufen

Das Diagramm zu verstehen ist einfach:

  • Die blauen Blöcke sind Shader-Programme, die auf GPU-Ebene ausgeführt werden.
  • Die grünen Blöcke werden in der CPU, im Treiber, zusammen mit der GPU ausgeführt.
  • Graue Rauten sind Bedingungen, die auftreten können, wenn ein Blitz durch die Szene geht.

Nun, in diesem Diagramm gibt es ein Element, das nicht enthalten ist und das derzeit eines der größten Probleme im Zusammenhang mit Raytracing ist: der Weg der Beschleunigungsstruktur. Und was ist das? Wir haben in unseren Raytracing-Tutorials darüber gesprochen, aber es schadet nie, sich daran zu erinnern.

Datenstrukturen zur Beschleunigung von Raytracing

rbol BVH

Um die Raytracing-Algorithmen zu beschleunigen und damit schneller laufen zu lassen, wird die Position der Objekte in der Szene in einer Datenstruktur abgebildet, die wie ein binärer Baum geformt ist als die GPU. müsste gehen.

Damit Sie den Prozess des Durchlaufens der Datenstruktur verstehen, beginnen Sie bei der Wurzel, die die gesamte Szene darstellt und durch Ebenen spezifiziert wird, bis Sie die letzte Ebene erreichen. In jeder Ebene wird eine Anfrage an den RT-Kern oder eine gleichwertige Einheit gestellt, um zu berechnen, ob es eine Kreuzung gibt, wenn es eine gibt, dann geht es hinunter zur nächsten Ebene, wenn nicht, stoppt dieser Pfad vollständig. Dies erfolgt bis zum Erreichen des Endes des Baums, an dem der Strahl-Kasten-Schnitt nicht mehr gemacht wird und der Strahl-Polygon-Schnitt ausgeführt wird.

Wenn Sie aufschlussreich gewesen sind, werden Sie gesehen haben, dass wir im Diagramm des vorherigen Abschnitts unter den Shader-Typen diejenigen der Schnittmenge haben, aber nicht diejenigen, die dafür verantwortlich sind, den BVH-Baum zu durchqueren, dh sie zu durchqueren, obwohl dies der Fall ist verstanden, dass diese Aufgabe von den Einheiten-Shadern ausgeführt wird, obwohl es dafür keinen speziellen Shader-Typ gibt.

Die Traversal Shader, was sind sie und was ist ihr Ursprung?

In der DirectX-Raytracing-Dokumentation finden wir unter den zukünftigen die sogenannten Traversal-Shader, die in Zukunft in der Pipeline für Raytracing in einer späteren Version der Microsoft-API hinzugefügt werden, aber am besten stellen wir uns selbst in der Situation.

Die Übung des Durchquerens der Datenstruktur bisher trotz der Tatsache, dass es sich um ein Shader-Programm handelt, ist generisch und wird vom Grafiktreiber gesteuert, sodass die Programmierer nichts tun müssen, da der Durchquerungs-Shader selbstverständlich ist Es gibt die Anwendungscodesteuerung, um den Prozess des Durchlaufens der Datenstruktur Knoten für Knoten zu durchlaufen.

Und welche Vorteile bringt das der Leistung? Der wichtigste ist, dass wir Szenarien definieren können, in denen ein oder mehrere Strahlen verworfen werden, bevor die Kreuzung hergestellt wird, was derzeit nicht möglich ist. Ein sehr anschauliches Beispiel wäre das Anvisieren von Objekten, die sehr weit von der Kamera entfernt sind, bei denen die Beleuchtungsdetails nicht so wahrgenommen werden können wie im Nahbereich. Dabei ist zu berücksichtigen, dass wir in der aktuellen Version der Redmond API bezüglich indirekter Beleuchtung zwar definieren können, ob ein Objekt über den Ray Generation Shader Strahlen aussendet oder nicht, aber keine Szenarien erstellen können, in denen wir die Strahlen durch den Flug ausschließen können , vor allem mit Abstand.

Traversal-Shader zum Aufbau der räumlichen Datenstruktur

Traversal-Shader

Die Intel Grafik-Forschungs- und Entwicklungsabteilung hat 2020 ein Dokument mit dem Titel Lazy Build von Beschleunigungsstrukturen mit Traversal-Shadern und diejenigen von Ihnen, die ein wenig die Shakespeare-Sprache beherrschen, werden gefolgert haben, dass sie aus der Konstruktion der gleichen räumlichen Datenstrukturen unter Verwendung von Traversal-Shadern besteht. Diese können also nicht nur zur Steuerung des Kurses, sondern auch zum Aufbau verwendet werden.

Das erste, was auffällt, ist Lazy Build, das wir mit wenig Aufwand als Build übersetzen könnten. Und woraus besteht es? Nun, mit dieser Technik soll die Konstruktionszeit der Datenstruktur reduziert werden. Dafür basiert es auf vorherigen Informationen aus vorherigen Frames, die einem Sichtbarkeitsalgorithmus hinzugefügt wurden. Wenn dies verwirrend erscheint, lassen Sie uns definieren, was Sichtbarkeit bedeutet, wenn wir über 3D-Rendering sprechen.

Sichtweite

Wir müssen von dem Prinzip ausgehen, dass eine GPU beim Rendern die Sichtbarkeit zwischen einem Punkt im Raum und der ersten sichtbaren Oberfläche in einer bestimmten Richtung berechnet oder vereinfacht: die Sichtbarkeit zwischen zwei Elementen. Bevor wir fortfahren, müssen wir eines berücksichtigen, sicherlich haben Sie sich beim Lesen vorgestellt, wie Sie zwei Objekte betrachten. Nun, die Sache ist nicht so, wir sprechen darüber, wie ein Objekt ein anderes sehen würde, wenn es sehen könnte, aber von der einfachsten Definition bezieht es sich auf die Kamera, die die Ansicht ist, aus der wir rendern.

Beim Hybrid-Rendering, das Rasterisierung mit Raytracing kombiniert, das mittlerweile von allen Spielen verwendet wird, wird die Sichtbarkeit der Kamera nicht aus diesem Algorithmus berechnet, sondern mit dem Raster-Algorithmus. Die Idee in Zukunft ist, dass die Sichtbarkeit in Bezug auf die Kamera aus Raytracing gemacht wird, sodass die GPU mit diesen Informationen am Ende eine Datenstruktur der gesamten Szene durch die Traversal-Shader erstellt.