In diesem zweiten Teil, in dem wir uns eingehender mit der Erstellung von 3D-Spielen befassen, konzentrieren wir uns darauf, was mit der 3D-Welt passiert, wenn der gesamte Eckprozess abgeschlossen ist. Wir müssen unsere Mathe-Lehrbücher wieder abstauben, uns mit der Geometrie der Frustration befassen und über das perspektivische Rätsel nachdenken. Wir werden uns auch kurz mit Raytracing, Beleuchtung und der Physik von Materialien befassen - perfekt!

Das Hauptthema dieses Artikels ist eine wichtige Phase beim Rendern, in der die dreidimensionale Welt aus Punkten, Linien und Dreiecken zu einem zweidimensionalen Raster aus farbigen Blöcken wird. Dies ist etwas, das einfach "passiert", weil die Prozesse in 3D-2D-Änderungen unsichtbar sind Vorheriger Artikel hier konnten wir sofort die Auswirkungen von Eck-Shadern und Mosaiken sehen. Wenn Sie für all dies nicht bereit sind, machen Sie sich keine Sorgen - Sie können loslegen. 3D-Spiel-Rendering 101. Lesen Sie jedoch weiter, um unseren nächsten Blick auf die 3D-Grafikwelt zu werfen, sobald sie festgelegt ist.

Vorbereitung für 2 Dimensionen

Die meisten von Ihnen sehen diese Website auf einem vollständig flachen Monitor oder Smartphone-Bildschirm. Selbst wenn Sie mit den Kindern cool und ruhig sind und einen ausgefallenen, gebogenen Monitor haben, bestehen die angezeigten Bilder aus einem flachen Raster aus farbigen Pixeln. Trotzdem scheinen die Bilder 3D zu sein, wenn Call of Mario: Deathduty Battleyard gespielt wird. Objekte bewegen sich beim Betreten und Verlassen der Kamera in die Umgebung hinein und aus ihr heraus.

Mit Bethesda Fallout 4 Als Beispiel aus dem Jahr 2014 können wir leicht sehen, wie mit Ecken umgegangen wird, um ein Gefühl von Tiefe und Entfernung zu erzeugen, insbesondere wenn Sie im Drahtgittermodus (oben) arbeiten.




Wenn Sie sich für ein 3D-Spiel von heute oder den letzten zwanzig Jahren entscheiden, führt fast jedes von ihnen dieselbe Abfolge von Ereignissen aus, um die 3D-Welt der Eckpunkte in ein 2D-Pixelarray umzuwandeln. Der Name des Prozesses, der die Änderung vorgenommen hat, wird normalerweise aufgerufen Pixelierung Dies ist jedoch nur einer von vielen Schritten in der ganzen Sache.




Wir müssen einige der verschiedenen Phasen aufschlüsseln und die verwendeten Techniken und Mathematik studieren, und wir werden die von Direct3D verwendete Sequenz verwenden, um zu untersuchen, was als Referenz vor sich geht. Das Bild unten zeigt, was mit jedem Gipfel der Welt gemacht wurde:







Was wurde auf der Weltraumbühne gemacht? Teil 1 Artikel: Hier werden Eckpunkte mithilfe mehrerer Matrixberechnungen transformiert und gefärbt. Wir werden den nächsten Abschnitt überspringen, da das einzige, was für den Kamerabereich gilt, ist, dass die konvertierten Ecken nach dem Verschieben angepasst werden, um den Kamera-Referenzpunkt zu erhalten.

Die nächsten Schritte sind für das Überspringen von entscheidender Bedeutung, da sie für den Übergang von 3D zu 2D absolut wichtig sind - richtig gemacht, und unser Gehirn wird auf einen Flachbildschirm schauen, aber eine Szene mit Tiefe und Skalierung "sehen" - falsch gemacht und die Dinge werden sehr seltsam aussehen!




Es ist alles eine Frage der Perspektive

Der erste Schritt in dieser Sequenz besteht darin, das Sichtfeld zu definieren, das von der Kamera gesehen wird. Dies erfolgt zunächst durch Anpassen der Winkel für das horizontale und vertikale Sichtfeld. Ersteres kann in Spielen häufig geändert werden, da die Leute eine bessere periphere Sicht von Seite zu Seite haben als nach oben und unten.

Wir können dies anhand dieses Bildes verstehen, das das Feld des menschlichen Sehens zeigt:




Zwei Blickwinkel (kurz fov), Kegelstumpf - Eine quadratische 3D-Pyramide, die aus der Kamera kommt. Erster Winkel Vertikale fov, der zweite horizontal einer; Wir werden Symbole verwenden α ve β um sie zu zeigen. Jetzt sehen wir die Welt nicht genau so, aber es ist viel einfacher, mit einem Kegelstumpf zu arbeiten, als zu versuchen, ein realistisches Bildvolumen zu erstellen.

Zwei weitere Einstellungen müssen ebenfalls definiert werden - nahe (oder vorne) und ferne (hinten) Position Flugzeuge abschneiden. Der erste schneidet die Spitze der Pyramide, bestimmt jedoch hauptsächlich, wie nahe die Kamera an der Position ist, an der etwas gezeichnet wurde. Der zweite Vorgang macht dasselbe, definiert jedoch, wie weit Grundelemente von der Kamera entfernt werden.

Die Größe und Position der nahezu schneidenden Ebene ist wichtig, da dies der Fall ist Aussicht,. Dies ist tatsächlich das, was Sie auf dem Monitor sehen, d. H. Der gerenderte Rahmen, und in den meisten Grafik-APIs wird die Ansicht von der oberen linken Ecke aus "gezeichnet". In der Abbildung unten ist der Punkt (a1, b2) die Quelle der Ebene, und von hier aus werden Breite und Höhe der Ebene gemessen.

Seitenverhältnis So wichtig die Perspektive für das Erscheinungsbild der erstellten Welt ist, muss sie auch dem Seitenverhältnis des Monitors entsprechen. Für viele Jahre ist dies immer 4: 3 (oder 1,3333 ... in Dezimalzahl). Heutzutage haben die meisten von uns Breitbild- und Ultra-Breitbildspiele wie 16: 9 oder 21: 9.

Die Koordinaten jedes Scheitelpunkts im Kamerabereich müssen so transformiert werden, dass sie alle in die nahe Schnittebene passen, wie unten gezeigt:

Die Transformation erfolgt mit einer anderen Matrix - zu dieser speziellen perspektivische Projektionsmatrix. In unserem Beispiel unten verwenden wir die Zuschneidefläche und die Positionen der Schnittebenen zur Transformation. Wir können stattdessen die Abmessungen des Ansichtsfensters verwenden.

Der Scheitelpunktpositionsvektor wird mit dieser Matrix multipliziert und ergibt einen neuen transformierten Satz von Koordinaten.

Et voila! Wir haben jetzt alle unsere Ecken so geschrieben, dass die ursprüngliche Erde jetzt als erzwungene 3D-Perspektive erscheint, sodass Grundelemente in der Nähe der Ebene vor dem Abschneiden größer erscheinen als solche in der Nähe der entfernten Ebene.

Während die Größe der Ansicht und das Blickfeld voneinander abhängig sind, können sie einzeln verarbeitet werden. Mit anderen Worten, Sie können Kegelstumpf haben, um je nach Größe und Seitenverhältnis der Ansicht eine andere Schnittebene zu erhalten. Dazu ist ein zusätzlicher Schritt in der Kette erforderlich, bei dem die Ecken in der nahen Schnittebene recycelt werden müssen, um den Unterschied zu berücksichtigen.

Dies kann jedoch zu Verzerrungen in der angezeigten Perspektive führen. verwenden Bethesdas 2011er Spiel Skyrimkönnen wir sehen, wie der horizontale Betrachtungswinkel eingestellt wird βDies hat erhebliche Auswirkungen auf die Szene bei gleichem Seitenverhältnis des Ansichtsfensters:

In diesem ersten Bild β = 75 ° und die Szene sieht völlig normal aus. Lass es uns jetzt versuchen β = 120°:

Die beiden Unterschiede sind sofort offensichtlich: Erstens können wir jetzt viel mehr an den Seiten unserer „Vision“ sehen, und zweitens erscheinen Objekte jetzt viel weiter entfernt (insbesondere Bäume). Die visuelle Wirkung der Wasseroberfläche ist derzeit jedoch nicht sichtbar, da der Prozess nicht für dieses Sichtfeld ausgelegt wurde.

Nehmen wir nun an, unser Charakter hat fremde und augenähnliche Augen. β = 180°!

Dieses Sichtfeld bietet uns einen fast panoramischen Blick, jedoch auf Kosten einer ernsthaften Verzerrung der an den Rändern der Sicht erzeugten Objekte. Dies liegt wiederum daran, dass die Spieleentwickler die Elemente und visuellen Effekte des Spiels für diesen Standpunkt nicht geplant und erstellt haben (der Standardwert liegt bei etwa 70 °).

Die Kamera scheint sich in den obigen Bildern bewegt zu haben, aber es ist nicht passiert - alles, was passiert ist, ist, dass die Form meines Kegelstumpfs geändert wurde, wodurch sich die Abmessungen der nahen Schnittebene verändert haben. In jedem Bild blieb das Seitenverhältnis des Ansichtsfensters gleich, sodass eine Skalierungsmatrix auf die Ecken angewendet wurde, um alles neu anzupassen.

Also, bist du drinnen oder draußen?

Nachdem in der Projektionsphase alles richtig transformiert wurde, fahren wir mit dem fort, was genannt wird Clip-Bereich. Obwohl dies getan ist Dann Projektion ist einfacher zu visualisieren, was passiert, wenn wir es vorher tun:

In unserem Diagramm oben können wir sehen, dass die Gummiente, eine der Fledermäuse und einige Bäume Dreiecke im Kegelstumpf sind; Die andere Fledermaus, der am weitesten entfernte Baum und der Panda befinden sich jedoch außerhalb des Kegelstumpfes. Obwohl die Ecken, aus denen diese Objekte bestehen, bereits bearbeitet wurden, werden sie nicht im Ansichtsfenster angezeigt. Das heisst verkürzt.

In KegelstumpfAlle Prinzipien außer Kegelstumpf werden vollständig entfernt, und die in einer der Grenzen gefundenen Grundelemente werden in neue Grundelemente umgeformt. Beschneiden Sie bis zu diesem Punkt alle unsichtbaren Ecken-Eck-Shader usw. Es ist nicht wirklich eine Leistungssteigerung, da es über ausgeführt wird. Die Beschneidungsphase selbst kann bei Bedarf auch übersprungen werden, dies wird jedoch nicht von allen APIs unterstützt (in der Standard-OpenGL können Sie dies beispielsweise nicht überspringen, dies ist jedoch mit einer API-Erweiterung möglich).

Es ist zu beachten, dass der Ort der entfernten Schnittebene nicht unbedingt der gleiche ist. Zeichnungsentfernung In Spielen wird letzteres von der Spiel-Engine selbst gesteuert. Alles andere wird der Motor tun Kegelstumpf Keulung - Hier wird der Code ausgeführt, um zu bestimmen, ob sich ein Objekt im Kegelstumpf befindet und / oder um etwas zu beeinflussen, das sichtbar ist. Wenn die Antwort ist noDieses Objekt wird nicht zur Erstellung gesendet. Dies ist nicht dasselbe wie das Zuschneiden von Enttäuschungen, denn obwohl primitive Elemente aus Frustration abgefallen sind, durchlaufen sie die Spitzenverarbeitungsphase. Mit der Subtraktion werden sie überhaupt nicht verarbeitet, was eine Menge Leistung spart.

Nachdem wir alle Transformationen und Anpassungen vorgenommen haben, erscheinen die Ecken endlich bereit für die nächste Stufe in der gesamten Rendersequenz. Sie sind nicht raus. Dies liegt daran, dass die gesamte Mathematik, die bei der Scheitelpunktmanipulation und den Welt-zu-Clip-Raumoperationen ausgeführt wird, mit einem homogenen Koordinatensystem durchgeführt werden muss (d. H. Jeder Scheitelpunkt hat 4 Komponenten anstelle von 3). Die Ansicht ist jedoch vollständig 2D, sodass nur die API-Scheitelpunktinformationen angezeigt werden x, y (Tiefenwert z bleibt jedoch erhalten).

Um die 4. Komponente loszuwerden, perspektivischer Abschnitt jede Komponente w Wert. Diese Einstellung sperrt den Wertebereich x ve y [-1,1] kann und nehmen z [0,1] Bereich - diese werden aufgerufen normalisierte Gerätekoordinaten (Kurz NDCs).

Wenn Sie mehr über das wissen möchten, was wir gerade behandelt haben, und gerne in viel mehr Mathematik eintauchen möchten, dann Song Ho Ahn's ausgezeichnetes Tutorial Über das Thema. Konvertieren wir diese Ecken in Pixel!

Rastermeister

Wie bei Transformationen sehen wir uns an, wie Direct3D die Regeln und Aktionen festlegt, um das Ansichtsfenster in ein Pixelraster umzuwandeln. Dieses Raster ähnelt einer Tabelle mit Zeilen und Spalten, in der jede Zelle mehrere Datenwerte enthält (Farbe, Tiefenwerte, Texturkoordinaten usw.). Normalerweise ist dieses Gitter Raster und der Prozess der Herstellung Pixelierung. Unsere 3D-Rendering 101 ArtikelWir haben eine sehr vereinfachte Ansicht des Verfahrens:

Das Bild oben vermittelt den Eindruck, dass die Grundelemente nur in kleine Blöcke geschnitten wurden, aber dazu gehört noch viel mehr. Der erste Schritt besteht darin, zu verstehen, ob ein Grundelement tatsächlich in die Kamera schaut. In einem früheren Bild dieses Artikels sind beispielsweise die Grundelemente sichtbar, aus denen der Rücken des grauen Kaninchens besteht und die Enttäuschung zeigen. Sie müssen also nicht erstellt werden, obwohl sie sich im Sichtfeld befinden.

Mit dem folgenden Diagramm können wir grob verstehen, wie dies aussieht. Der Würfel hat mehrere Transformationen durchlaufen, um das 3D-Modell in den 2D-Anzeigebereich zu verschieben. In der Ansicht der Kamera sind einige Gesichter des Würfels nicht sichtbar. Angenommen, keine der Oberflächen ist transparent, können einige dieser Grundelemente ignoriert werden.

Direct3D'de bu, sisteme Verarbeitungsstatus wird sein und diese Anweisung wird seine Entfernung mitteilen (aka verwerfen) für jede primitive Seite, die nach vorne oder hinten zeigt (oder überhaupt nicht blind ist - zum Beispiel Drahtmodell Modus). Woher weiß er also, was die Vorder- oder Rückseite ist? Wenn wir schauen Mathe in der EckbearbeitungWir haben gesehen, dass Dreiecke (oder mehr Eckpunkte) normale Vektoren haben, die dem System mitteilen, in welche Richtung es zeigt. Mit diesen Informationen kann eine einfache Überprüfung durchgeführt werden. Wenn die primitive Überprüfung fehlschlägt, wird sie aus der Generierungskette entfernt.

Dann ist es Zeit, mit der Implementierung des Pixelrasters zu beginnen. Auch dies ist überraschend komplex, da das System funktionieren muss, wenn ein Pixel vollständig in ein Grundelement passt - vollständig, teilweise oder überhaupt. Um dies zu tun, Umfangstest getan. Das folgende Bild zeigt, wie die Dreiecke in Direct3D 11 gerastert werden:

Die Regel ist ganz einfach: Wenn die Pixelmitte das überschreitet, was Microsoft nennt, wird das Pixel als Dreieck betrachtet. Regel 'oben links'. Der obere Teil ist eine horizontale Liniensteuerung. Pixelmitte on diese Linie. Der 'linke' Teil ist für nicht horizontale Linien und die Mitte des Pixels muss links von einer solchen Linie liegen. Es gibt zusätzliche Regeln für Nicht-Grundelemente, d. H. Einfache Linien und Punkte, und wenn Regeln zusätzliche Bedingungen erhalten Multisampling'i beschäftigt sind.

Wenn wir uns das Bild in der Microsoft-Dokumentation genau ansehen, können wir feststellen, dass die durch Pixel erstellten Formen den ursprünglichen Grundelementen nicht sehr ähnlich sind. Dies liegt daran, dass die Pixel zu groß sind, um ein realistisches Dreieck zu bilden. Das Raster enthält nicht genügend Daten zu den Originalobjekten und Überlappung.

Lassen Sie uns verwenden 3DMark03 von UL Benchmark So sehen Sie den Alias ​​in der Verarbeitung:

Im ersten Bild ist die Scangröße auf einen sehr niedrigen Wert von 720 x 480 Pixel eingestellt. Überlappung ist auf dem Handlauf deutlich sichtbar, und der Schatten wirft die Waffe des Spitzensoldaten. Vergleichen Sie dies mit dem, was Sie mit einem Scan mit 24-mal mehr Pixeln erhalten:

Hier können wir sehen, dass der Spitzname auf dem Geländer und Schatten vollständig verschwunden ist. Es mag jedes Mal wie ein größerer Scanpfad erscheinen, aber die Abmessungen des Rasters müssen von dem Monitor unterstützt werden, auf dem der Rahmen angezeigt wird, und diese Pixel müssen nach der Rasterung verarbeitet werden. eine offensichtliche Leistungsstrafe sein.

Hier kann Multi-Sampling helfen, und es funktioniert in Direct3D wie folgt:

Anstatt zu überprüfen, ob ein Pixelcenter die Rasterungsregeln erfüllt, mehrere Standorte (Subpixel-Samples oder Unterproben) werden innerhalb jedes Pixels getestet, und wenn eines davon geeignet ist, bildet dieses Pixel einen Teil der Form. Dies kann nicht helfen und den Alias ​​sogar verschlechtern, aber wenn Mehrfachabtastung verwendet wird, werden diese Unterabtastungen vom Grundelement abgedeckt und die Ergebnisse der Pixelverarbeitung werden in einem Puffer im Speicher gespeichert.

Dieser Puffer wird dann verwendet, um die Unterabtast- und Pixeldaten zu mischen, so dass die primitiven Kanten weniger blockiert sind. Wir werden uns in einem späteren Artikel noch einmal mit der gesamten festgefahrenen Situation befassen, aber im Moment ist dies das, was Multi-Sampling tun kann, wenn es in einem Scan mit sehr niedrigen Pixeln verwendet wird:

Wir können sehen, dass das Ausmaß des Anti-Aliasing an den Kanten der verschiedenen Formen stark reduziert ist. Ein größeres Raster ist definitiv besser, aber der Leistungstreffer kann stattdessen die Verwendung von Multi-Sampling unterstützen.

Alles andere, was im Rasterungsprozess getan werden kann Okklusionstest. Dies muss erfolgen, da das Sichtfeld voll von Grundelementen ist, die sich überlappen (verstopft) - Im obigen Bild überlappen sich beispielsweise die Dreiecke auf der Vorderseite, aus denen die Solideri im Vordergrund bestehen, mit den gleichen Dreiecken auf dem anderen Soldaten. Zusätzlich zur Überprüfung, ob ein Grundelement ein Pixel bedeckt, können die relativen Tiefen auch verglichen und vom Rest des Renderprozesses übersprungen werden, wenn sich eines hinter dem anderen befindet.

Wenn das nahe Primitiv jedoch transparent ist, ist das andere weiterhin sichtbar, obwohl die Okklusionsprüfung nicht bestanden wurde. Deshalb führen fast alle 3D-Motoren Okklusionsprüfungen durch vor Senden Sie etwas an die GPU und stattdessen Z-Tampon als Teil des Erstellungsprozesses. Hier wird der Frame normalerweise gerendert, aber die GPU speichert nur Tiefenwerte, anstatt die endgültigen Pixelfarben im Speicher zu speichern. Dies kann dann in Shadern verwendet werden, um die Sichtbarkeit mit größerer Kontrolle und Präzision über Aspekte zu steuern, die eine Objektüberlappung beinhalten.

Im obigen Bild ist das Objekt umso näher an der Kamera, je dunkler die Farbe des Pixels ist. Um den Z-Puffer zu erstellen, wird der Frame einmal erstellt und dann neu erstellt. Dieses Mal wird jedoch bei der Verarbeitung der Pixel ein Shader ausgeführt, um sie mit den Werten im Z-Puffer zu vergleichen. Wenn es nicht sichtbar ist, wird diese Pixelfarbe nicht im endgültigen Bildpuffer abgelegt.

Vorerst der eigentliche letzte Schritt Vertex-Attribut-Interpolation - In unserem ersten vereinfachten Diagramm war das Grundelement ein vollständiges Dreieck. Denken Sie jedoch daran, dass die Ansicht mit Scheitelpunkten der Formen gefüllt ist, nicht mit der Form selbst. Das System muss also herausfinden, wie sich Farbe, Tiefe und Textur des Grundelements zwischen den Ecken befinden, und so heißt es. Interpolasyon. Wie Sie sich vorstellen können, ist dies keine einfache Berechnung, sondern eine andere Berechnung.

Obwohl der gerasterte Bildschirm 2D ist, repräsentieren die Strukturen im Inneren eine erzwungene 3D-Perspektive. Wenn die Linien wirklich zweidimensional wären, eine einfache linear verschiedene Farben und so weiter, wenn Sie von einem Gipfel zum anderen gehen. Aufgrund des 3D-Aspekts der Szene muss bei der Interpolation jedoch die Perspektive berücksichtigt werden - Simon Yeung'un muhteşem blogu um weitere Informationen über den Prozess zu erhalten.

Los geht's - die 3D-Welt der Ecken wird zu einem 2D-Raster aus farbigen Blöcken. Trotzdem sind wir nicht viel fertig.

Alles von vorne nach hinten (außer wenn es nicht da ist)

Bevor wir uns mit der Rasterung befassen, müssen wir noch etwas zur Reihenfolge des Renderns sagen. Zum Beispiel sprechen wir nicht darüber, woher die Tessellation wiederum kam; Stattdessen sprechen wir über die Reihenfolge der Primitiven. Objekte werden häufig in der Reihenfolge verarbeitet, in der sie im Verzeichnispuffer angezeigt werden (dem Speicherblock, der dem System mitteilt, wie die Scheitelpunkte gruppiert sind). Dies kann erhebliche Auswirkungen auf den Umgang mit transparenten Objekten und Effekten haben.

Dies liegt daran, dass die Grundelemente einzeln behandelt werden. Wenn Sie zuerst die vorderen Grundelemente ausführen, ist niemand dahinter sichtbar (hier kommt die Okklusionssortierung wirklich ins Spiel). und kann außer Betrieb genommen werden (unterstützt die Leistung) - dies ist normalerweise 'von vorne nach hinten erfordert, dass Erstellung und Verzeichnispufferung auf diese Weise angeordnet werden.

Wenn jedoch einige dieser Grundelemente direkt vor der Kamera transparent sind, führt das Rendern von vorne nach hinten dazu, dass Objekte hinter dem transparenten Objekt übersehen werden. Eine Lösung besteht darin, alles von vorne nach hinten zu tun, wobei transparente Grundelemente und Effekte zuletzt ausgeführt werden.

Also werden alle modernen Spiele hintereinander gerendert, oder? Wenn dies nicht hilfreich ist, denken Sie daran, dass jedes primitive Rendering viel höhere Leistungskosten verursacht, als nur sichtbar ist. Es gibt andere Möglichkeiten, transparente Objekte anzusprechen, aber im Allgemeinen gibt es keine einheitliche Lösung, und jede Situation muss auf einzigartige Weise behandelt werden.

Dies fasst im Grunde die Vor- und Nachteile der Rasterung zusammen - in moderner Hardware ist es sehr schnell und effektiv, aber es ist immer noch eine Annäherung an das, was wir sehen. In der realen Welt absorbiert, reflektiert und bricht jedes Objekt Licht, und all dies wirkt sich auf die betrachtete Szene aus. Wir erhalten ein schnelles, aber grobes Ergebnis, indem wir die Welt in Grundelemente aufteilen und nur einige davon erstellen.

Wenn es nur einen anderen Weg gäbe ...

Dort is Ein anderer Weg: Raytracing

Vor ungefähr zwei Jahrzehnten entwickelte ein Informatiker namens Arthur Appel ein System zum Erstellen von Bildern auf einem Computer, so dass ein einzelner Lichtstrahl von der Kamera geworfen wurde, bis er auf ein Objekt trifft. Von dort aus ändern die Eigenschaften des Materials (Farbe, Reflexionsvermögen usw.) dann die Intensität des Lichtstrahls. Jedes Pixel in dem gerenderten Bild würde einen Strahlwurf haben und ein Algorithmus würde ausgeführt, um die Farbe des Pixels durch Durchlaufen einer mathematischen Sequenz zu decodieren. Appels Prozess Schienenguss.

Etwa 10 Jahre später ein anderer Wissenschaftler John Whitted Er entwickelte einen mathematischen Algorithmus, der dem Ansatz von Appel entsprach, aber wenn der Strahl auf ein Objekt trifft, erzeugt er zusätzliche Strahlen, die je nach Material des Objekts in verschiedene Richtungen abgefeuert werden. Da dieses System für jede Objektinteraktion neue Strahlen erzeugen würde, war der Algorithmus rekursiv und daher viel rechenintensiver. Es hatte jedoch einen signifikanten Vorteil gegenüber Appels Methode, da es Reflexion, Brechung und Schattierung richtig erklären konnte. Der Name dieser Prozedur lautet: Ray Tracing (um ehrlich zu sein, rückwärts Raytracing, wie wir dem Strahl der Kamera folgen, nicht dem Objekt) und dem Heiligen Gral für Computergrafik und Filme seit dieser Zeit.

Der Name dieses Verfahrens war Raytracing (genau genommen Rückstrahlverfolgung, da wir Strahlen eher von der Kamera als von Objekten verfolgen) und ist seitdem der heilige Gral für Computergrafiken und Filme.

Im obigen Bild können wir uns ein Bild von Whitteds Arbeit am Algorithmus machen. Für jedes Pixel im Bild wird ein Strahl von der Kamera ausgesendet, der sich bis zu einer Oberfläche bewegt. Diese spezielle Oberfläche ist durchscheinend, sodass Licht durch sie reflektiert und gebrochen wird. In beiden Fällen werden Sekundärstrahlen erzeugt und gehen aus, bis sie mit einer Oberfläche interagieren. Es gibt auch eine zusätzliche Sekundärseite, die die Farbe der Lichtquellen und die von ihnen erzeugten Schatten berücksichtigt.

Der rekursive Teil des Prozesses besteht darin, dass Sekundärstrahlen jedes Mal erzeugt werden können, wenn ein neuer Gussstrahl eine Oberfläche schneidet. Dies kann leicht außer Kontrolle geraten, so dass die Anzahl der erzeugten Sekundärstrahlen immer begrenzt ist. Wenn ein Strahlengang abgeschlossen ist, wird seine Farbe an jedem Endpunkt gemäß den Materialeigenschaften dieser Oberfläche berechnet. Dieser Wert leitet den Strahl dann an den vorherigen weiter, wobei die Farbe dieser Oberfläche usw. angepasst wird, bis der effektive Ursprungspunkt (Pixel im Rahmen) des Primärstrahls erreicht ist.

Dies kann äußerst komplex sein, und selbst einfache Szenarien können einen Rechenschwellenwert schaffen. Glücklicherweise können einige Dinge getan werden, um zu helfen - eine wäre, speziell entwickelte Hardware zu verwenden, um diese speziellen mathematischen Operationen zu beschleunigen, genau wie bei der Matrixmathematik in der Eckbearbeitung (mehr in einem Moment)). Ein weiterer wichtiger Punkt ist die Beschleunigung der Bearbeitung des Objekts, auf das ein Strahl trifft, und genau dort, wo er sich auf der Oberfläche des Objekts befindet, auf dem er sich schneidet. Dies kann überraschend sein, wenn das Objekt aus einer großen Anzahl von Dreiecken besteht. schwer zu tun:

Anstatt jedes Dreieck zu testen, wird vor dem Raytracing in jedem Objekt eine Liste von Begrenzungsvolumina (BV) erstellt. Dies sind nichts anderes als Quader, die das betreffende Objekt umgeben, und dies sind sukzessive kleinere für die verschiedenen Strukturen darin. Objekt.

Zum Beispiel wäre die erste BV für das ganze Kaninchen. Das nächste Paar ist Kopf, Beine, Rumpf, Schwanz usw. Jede dieser dann kleinen Strukturen im Kopf usw. Es wird jeweils eine weitere Sammlung von Volumes geben, und die endgültige Volume-Ebene enthält eine kleine Anzahl von zu testenden Dreiecken. Alle diese Bände sind dann in einer geordneten Liste angeordnet ( BV-Hierarchie oder kurz BVH), so dass das System jedes Mal eine relativ kleine Anzahl von BV steuert:

Während die Verwendung eines BVH die tatsächliche Strahlverfolgung technisch nicht beschleunigt, ist die Erstellung der Hierarchie und des nachfolgenden Suchalgorithmus oft viel schneller als die Überprüfung, ob ein Strahl eines der Millionen Dreiecke schneidet. In einer 3D-Welt.

Programme wie heute Rührgerät ve POV-Ray Verwenden Sie Raytracing mit zusätzlichem Tracking (z. B. Photonen-Tracking und Radio), um äußerst realistische Bilder zu erstellen:

Die naheliegende Frage ist, ob Raytracing so gut ist. Warum verwenden wir es nicht überall? Die Antworten liegen in zwei Bereichen: Erstens erzeugt selbst die einfache Strahlverfolgung Millionen von Strahlen, die immer wieder berechnet werden müssen. Das System beginnt mit nur einem Strahl pro Bildschirmpixel und erzeugt bei einer Auflösung von nur 800 x 600 480.000 Primärstrahlen, von denen jeder mehrere Sekundärstrahlen erzeugt. Dies ist selbst für heutige Desktop-Computer ein ernstes Geschäft. Das zweite Problem ist, dass die grundlegende Strahlverfolgung tatsächlich nicht sehr realistisch ist und eine Reihe zusätzlicher, sehr komplexer Gleichungen enthalten sein müssen, um korrekt zu sein.

Selbst mit moderner PC-Hardware ist der Arbeitsaufwand, der für ein aktuelles 3D-Spiel in Echtzeit erforderlich ist, nicht möglich. Unsere 3D-Render 101 In seinem Artikel haben wir gesehen, dass es einige zehn Sekunden dauerte, um ein einzelnes Bild mit niedriger Auflösung auf einem Raytracing-Benchmark zu erstellen.

Wie war der ursprüngliche Wolfenstein beim 3D-Beamcasting im Jahr 1992 und warum ist er beliebt? Battlefield V ve Metro Migration, beide im Jahr 2019 gestartet, bieten Raytracing-Funktionen? Raster oder Raytrace? Antwort: ein bisschen von beidem.

Ein hybrider Ansatz für heute und die Zukunft

Im März 2018 kündigte Microsoft eine neue API-Erweiterung für Direct3D 12 mit dem Namen DXR (DirectX Raytracing) an. Dies war eine neue Diagrammlinie, die die Standard-Rasterisierungs- und Berechnungs-Pipelines ergänzte. Zusätzliche Funktionen, Shader, Datenstrukturen usw. Es wurde bei der Einführung bereitgestellt, erforderte jedoch keine spezielle Hardwareunterstützung außer der, die bereits für Direct3D 12 erforderlich ist.

Auf der gleichen Spieleentwicklerkonferenz, Sprach über Microsoft DXRElectronic Arts sprach über sie Pica Pica Projesi - 3D-Motorexperiment mit DXR. Sie zeigten, dass Raytracing verwendet werden kann, aber nicht für den gesamten Rendering-Frame. Stattdessen werden für den größten Teil der Arbeit traditionelle Raster- und Computer-Shader-Techniken verwendet. DXR wird für bestimmte Bereiche verwendet - was bedeutet, dass die Anzahl der erzeugten Strahlen viel geringer ist als für die gesamte Szene.

Dieser hybride Ansatz wurde in der Vergangenheit in geringerem Maße verwendet. Zum Beispiel Wolfenstein 3D Gebrauchtschienenguss um zu lösen, wie der gerenderte Rahmen aussieht, aber mit einem Strahl pro Pixelspalte und nicht pro Pixel erstellt wurde. Dies könnte immer noch sehr beeindruckend aussehen, bis mir klar wurde, dass das Spiel ursprünglich mit einer Auflösung von 640 x 480 lief, sodass nicht mehr als 640 Strahlen gleichzeitig arbeiteten.

Die Grafikkarte von Anfang 2018 - wie die Radeon RX 580 von AMD oder die GeForce 1080 Ti von Nvidia - erfüllte zwar die Hardwareanforderungen für DXR, aber selbst mit Rechenfunktionen gab es einige Missverständnisse, dass sie für die Verwendung von DXR leistungsfähig genug wären. sinnvoll.

Dies änderte sich geringfügig im August 2018, als Nvidia seine neueste GPU-Architektur auf den Markt brachte. Codename Turing. Das entscheidende Merkmal dieses Chips waren sogenannte RT-Kerne: spezielle Logikeinheiten zur Beschleunigung des Abschnitts von Strahl zu Dreieck und zur Berechnung der BVH-Kreuzberechnung (Limit Volume Hierarchy). Diese beiden Prozesse sind zeitaufwändige Routinen für Arbeiten, bei denen ein Licht mit Dreiecken interagiert, aus denen verschiedene Objekte innerhalb einer Szene bestehen. Da RT-Kerne spezifisch für den Turing-Prozessor sind, kann der Zugriff nur über die proprietäre API von Nvidia erfolgen.

Das erste Spiel, das diese Funktion unterstützt, ist EAs Battlefield V und Als wir die Verwendung von DXR getestet habenWir waren beeindruckt von der Verbesserung der Wasser-, Glas- und Metallreflexionen im Spiel, aber weniger beeindruckt von den nachfolgenden Performance-Hits:

Um fair zu sein, haben sich spätere Patches etwas verbessert, aber es gab (und gibt) einen großen Rückgang der Geschwindigkeit, mit der Frames gerendert werden. Bis 2019 sind einige andere Spiele aufgetaucht, die diese API unterstützen und Raytracing für bestimmte Teile in einem Frame durchführen. Wir testeten Metro Migration ve Tomb Raider Shadowund fand eine ähnliche Geschichte - DXR würde die Bildrate besonders beeinflussen, wenn es ausgiebig verwendet wird.

Etwa zur gleichen Zeit UL Benchmarks er erklärte Ein DXR-Funktionstest für 3DMark:

Unsere Überprüfung der DXR-fähigen Spiele und der 3DMark-Funktionstest haben jedoch gezeigt, dass eines bei der Raytracing-Methode sicher ist: 2019 ist es selbst für die über 1000-Dollar-Modelle für den Grafikprozessor noch eine ernsthafte Arbeit. Bedeutet das, dass wir keine echte Alternative zur Rasterung haben?

Die neuesten Funktionen in der 3D-Grafiktechnologie für Endverbraucher sind häufig sehr teuer, und die anfängliche Unterstützung neuer API-Funktionen kann sehr unberechenbar oder langsam sein (wie wir feststellen). Als wir Max Payne 3 getestet haben In einer Reihe von Direct3D-Versionen (ca. 2012) - Letzteres ist normalerweise darauf zurückzuführen, dass Spieleentwickler versuchen, so viele erweiterte Funktionen wie möglich einzubeziehen, manchmal mit begrenzter Erfahrung.

Als Vertex- und Pixel-Shader, Tessellation, HDR-Rendering und Okklusion des Bildschirmraums früher recht anspruchsvoll waren und nur für High-End-GPUs geeignet waren, ist ihre Verwendung heute in Spielen üblich und wird von einer Vielzahl von Grafikkarten unterstützt. Das Gleiche gilt für die Raytracing-Funktion und wird mit der Zeit nur zu einer weiteren Detaileinstellung, die für die meisten Benutzer standardmäßig aktiviert ist.

Einige abschließende Gedanken

Und so sind wir am Ende unseres zweiten tiefen Tauchgangs angelangt, wo wir uns die 3D-Grafikwelt genauer ansehen. Wir haben uns angesehen, wie die Ecken von Modellen und Welten von 3D verschoben und in ein flaches 2D-Bild umgewandelt werden. Wir haben gesehen, wie Einstellungen für das Sichtfeld berücksichtigt werden sollten und welche Auswirkungen sie haben. Der Prozess des Pixelierens dieser Ecken wurde untersucht und wir haben einen kurzen Blick auf einen alternativen Prozess zur Rasterisierung geworfen.

Nach wie vor konnten wir nicht alles abdecken und wir konnten hier und da nicht ein paar Details sehen - es ist schließlich kein Lehrbuch! Wir hoffen jedoch, dass Sie auf diesem Weg etwas mehr gelernt haben und eine neue Faszination für Programmierer und Ingenieure, die wirklich die Mathematik und Naturwissenschaften beherrschen, die erforderlich sind, um all dies in Ihren bevorzugten 3D-Titeln zu erreichen.

Gerne beantworten wir Ihre Fragen. Sie können sich also gerne in den Kommentaren melden. Bis zum nächsten.

Masthead Kredit: Monochromes Druckraster abstrakt von Aleksei Deep