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, nachdem alle Eckarbeiten erledigt sind. Wir müssen unsere Mathebücher wieder entstauben, uns mit der Geometrie von Enttäuschungen auseinandersetzen und über das Rätsel der Perspektive nachdenken. Wir werden auch kurz in Raytracing, Beleuchtung und Materialphysik eintauchen - ausgezeichnet!

Das Hauptthema dieses Artikels ist ein wichtiger Schritt beim Rendering, bei dem die dreidimensionale Welt aus Punkten, Linien und Dreiecken zu einem zweidimensionalen Raster aus farbigen Blöcken wird. Das passiert einfach, weil die Prozesse in der 3D-2D-Änderung unsichtbar sind, unser Vorheriger Artikel hier konnten wir sofort die Effekte von Corner Shadern und Mosaiken sehen. Wenn Sie für all das noch nicht bereit sind, machen Sie sich keine Sorgen – Sie können loslegen. 3D-Spielerstellung 101. Aber lesen Sie weiter für unseren nächsten Blick auf die Welt der 3D-Grafik, sobald sie eingerichtet ist.

Vorbereitung auf Größe 2

Die meisten von Ihnen werden diese Website auf einem völlig flachen Monitor oder Smartphone-Bildschirm anzeigen; Selbst wenn Sie mit den Kindern cool und ruhig sind und einen schicken, gebogenen Monitor haben, bestehen die angezeigten Bilder aus einem flachen Raster aus bunten Pixeln. Beim Spielen von Call of Mario: Deathduty Battleyard erscheinen die Bilder jedoch in 3D. Objekte bewegen sich beim Betreten und Verlassen der Kamera in die Umgebung hinein und aus ihr heraus.

Verwenden von Bethesda Fallout 4 Als Beispiel aus dem Jahr 2014 können wir leicht sehen, wie die Ecken gerendert werden, um ein Gefühl von Tiefe und Distanz zu erzeugen, insbesondere wenn Sie im Wireframe-Modus laufen (oben).




Wenn Sie sich für ein 3D-Spiel von heute oder den letzten zwei Jahrzehnten entscheiden, führt fast jedes die gleiche Abfolge von Ereignissen durch, um die 3D-Welt der Scheitelpunkte in ein 2D-Pixel-Array zu verwandeln. Der Name des Prozesses, der die Änderung vorgenommen hat, heißt normalerweise Verpixelung aber dies ist nur einer von vielen Schritten in der ganzen Angelegenheit.



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






Was wurde in der Weltraumphase der Erde gemacht? Teil 1 Artikel: Hier werden die Scheitelpunkte mithilfe mehrerer Matrixberechnungen transformiert und eingefärbt. Wir überspringen den nächsten Abschnitt, da für den Kamerabereich lediglich die Anpassung der transformierten Ecken nach dem Verschieben erforderlich ist, um die Kamera zu einem Referenzpunkt zu machen.

Die nächsten Schritte sind entscheidend, um einzusteigen, denn sie sind absolut entscheidend für den Übergang von 3D zu 2D - richtig gemacht und unser Gehirn wird auf einen Flachbildschirm schauen, aber eine Szene mit Tiefe und Maßstab "sehen" - falsch gemacht und die Dinge sehen sehr aus seltsam!




Alles eine Frage der Perspektive

Der erste Schritt in dieser Sequenz besteht darin, das Sichtfeld aus der Sicht der Kamera zu definieren. Dies geschieht, indem zuerst die Winkel für das horizontale und vertikale Sichtfeld angepasst werden - ersteres kann in Spielen oft geändert werden, da die Menschen eine bessere seitliche Sicht als nach oben und unten haben.

An diesem Bild, das das menschliche Sehfeld zeigt, können wir Folgendes erkennen:




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

Zwei weitere Einstellungen müssen ebenfalls definiert werden - nahe (oder vordere) und ferne (hinten) Position Beschneidungsebenen. Der erste schneidet die Spitze der Pyramide ab, bestimmt aber hauptsächlich, wie nah die Kamera an der Position ist, an der etwas gezeichnet wird; die zweite macht dasselbe, definiert aber, wie weit die Primitive von der Kamera entfernt sind.

Die Größe und Position der Near-Clipping-Ebene sind wichtig, weil dies Aussicht,. Dies ist im Wesentlichen das, was Sie auf dem Monitor sehen, dh der gerenderte Frame, und in den meisten Grafik-APIs wird die Ansicht von der oberen linken Ecke "gezeichnet". In der Abbildung unten ist der Punkt (a1, b2) die Quelle der Ebene, von der aus Breite und Höhe der Ebene gemessen werden.

Seitenverhältnis Der Betrachtungswinkel ist nicht nur entscheidend für das Aussehen der gerenderten Welt, sondern muss auch dem Seitenverhältnis des Monitors entsprechen. Das war viele Jahre immer 4:3 (oder 1.3333 als Dezimalzahl...). Heutzutage haben die meisten von uns Widescreen- und Ultrawidescreen-Spiele wie 16:9 oder 21:9.

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

Die Umrechnung erfolgt mit einer anderen Matrix - zu dieser speziellen perspektivische Projektionsmatrix. In unserem Beispiel unten verwenden wir den Clipping-Bereich und die Positionen der Clipping-Ebenen, um die Transformation durchzuführen; wir können stattdessen die Abmessungen des Ansichtsfensters verwenden.

Der Vertexpositionsvektor wird mit dieser Matrix multipliziert und ergibt einen neuen Satz transformierter Koordinaten.

Fleisch voila! Wir haben jetzt alle unsere Scheitelpunkte so geschrieben, dass die ursprüngliche Welt jetzt als erzwungene 3D-Perspektive erscheint, sodass Primitive in der Nähe der vorderen Schnittebene größer erscheinen als diejenigen in der Nähe der entfernten Ebene.

Die Größe und die Ansichtswinkel der Ansicht hängen zwar voneinander ab, können jedoch separat behandelt werden. Mit anderen Worten, Sie können frustriert sein, um basierend auf der Größe und dem Seitenverhältnis der Ansicht eine andere Beschneidungsebene anzugeben. Damit dies geschieht, ist ein zusätzlicher Schritt in der Kette erforderlich, in dem die Scheitelpunkte in der nahen Clipping-Ebene erneut transformiert werden müssen, um den Unterschied zu berücksichtigen.

Dies kann jedoch zu Verzerrungen in der angezeigten Perspektive führen. benutzen Bethesdas 2011er Spiel Skyrim, können wir sehen, wie der horizontale Betrachtungswinkel eingestellt wird βhat einen erheblichen Einfluss auf die Szene, während das gleiche Seitenverhältnis des Ansichtsfensters beibehalten wird:

In diesem ersten Bild, β = 75° und die Szene sieht vollkommen normal aus. Versuchen wir es jetzt β = 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). Allerdings ist der visuelle Effekt der Wasseroberfläche derzeit nicht sichtbar und das liegt daran, dass das Verfahren nicht für dieses Sichtfeld konzipiert wurde.

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

Dieses Sichtfeld bietet uns eine fast panoramische Ansicht, jedoch auf Kosten einer erheblichen Verzerrung von Objekten, die an den Rändern der Sicht erzeugt werden. Dies liegt wiederum daran, dass die Spieledesigner die Spielelemente und visuellen Effekte für diesen Betrachtungswinkel (der Standardwert beträgt etwa 70°) nicht geplant und erstellt haben.

Die Kamera scheint sich in den obigen Bildern bewegt zu haben, aber sie hat sich nicht bewegt - alles, was passiert ist, war, dass die Form des Kegelstumpfes geändert wurde, was die Abmessungen der nahen Schnittebene veränderte. In jedem Bild blieb das Seitenverhältnis des Ansichtsfensters gleich, daher wurde eine Skalierungsmatrix auf die Ecken angewendet, um alles neu einzupassen.

Also, bist du drinnen oder draußen?

Nachdem in der Projektionsphase alles korrekt konvertiert wurde, geht es weiter zum sogenannten Clipbereich. Obwohl dies getan wurde Dann Projektion ist es einfacher zu visualisieren, was vor sich geht, wenn wir es vorher tun:

In unserem obigen Diagramm können wir sehen, dass die Gummiente, eine der Fledermäuse und einige Bäume Dreiecke im Inneren des Kegelstumpfes sind; die andere Fledermaus ist jedoch am weitesten vom Baum- und Pandafrustum entfernt. Obwohl die Ecken, aus denen diese Objekte bestehen, bereits gerendert sind, sind sie im Ansichtsfenster nicht sichtbar. Das heisst verkürzt.

In Ernte Frustum, werden alle Primitive außer Frustum vollständig entfernt, und Primitive in jeder der Grenzen werden in neue Primitive umgeformt. Das Clipping hat bis zu diesem Punkt alle nicht sichtbaren Vertices mit Vertex-Shadern usw. Es ist nicht wirklich eine Leistungssteigerung, da es über ausgeführt wird. Die Clipping-Phase selbst kann bei Bedarf übersprungen werden, dies wird jedoch nicht von allen APIs unterstützt (zum Beispiel erlaubt Standard-OpenGL nicht, dies zu überspringen, aber es ist möglich, dies mit einer API-Erweiterung zu tun).

Es ist erwähnenswert, dass die Position der fernen Clipping-Ebene nicht unbedingt dieselbe ist. Zeichnungsabstand in Spielen wird letzteres von der Spiel-Engine selbst gesteuert. Etwas anderes wird der Motor tun Frustum aussortiert - wo Code ausgeführt wird, um zu bestimmen, ob ein Objekt im Frustum ist und/oder um alles zu beeinflussen, was sichtbar ist; wenn die antwort no, wird dieses Objekt nicht zur Erstellung gesendet. Dies ist nicht dasselbe wie das Zuschneiden von Frustrationen, denn obwohl die Primitive außerhalb der Frustration gefallen sind, durchlaufen sie immer noch die Overhead-Verarbeitungsphase. Bei der Subtraktion werden sie überhaupt nicht verarbeitet, was einiges an Leistung spart.

Nachdem wir nun alle unsere Transformationen und Trimmen abgeschlossen haben, sehen die Ecken endlich bereit für den nächsten Schritt in der gesamten Rendering-Sequenz aus. Sie sind nicht draußen. Dies liegt daran, dass die gesamte Mathematik, die bei der Vertex-Verarbeitung und den Erd-zu-Clip-Raum-Operationen durchgeführt wird, mit einem homogenen Koordinatensystem durchgeführt werden muss (d. h. jeder Vertex hat 4 statt 3 Komponenten). Die Ansicht ist jedoch rein 2D und daher sind nur API-Scheitelpunktinformationen x, y (Tiefenwert z obwohl erhalten).

Um Komponente 4 loszuwerden, perspektivischer Schnitt jeder Komponente w Wert. Diese Einstellung sperrt den Wertebereich x ve y Sie erhalten [-1,1] und z Range [0,1] - diese heißen normalisierte Gerätekoordinaten (kurz NDCs).

Wenn Sie mehr darüber erfahren möchten, was wir gerade behandelt haben, und gerne in viel mehr Mathematik eintauchen möchten, ist hier Song Ho Ahns ausgezeichnetes Tutorial Über das Thema. Lassen Sie uns nun diese Scheitelpunkte in Pixel umwandeln!

Rastermaster

Wie bei Transformationen sehen wir uns an, wie Direct3D die Regeln und Operationen zum Konvertieren des Ansichtsfensters in ein Pixelraster festlegt. Dieses Raster ist wie eine Tabelle mit Zeilen und Spalten, in denen jede Zelle mehrere Datenwerte enthält (Farbe, Tiefenwerte, Texturkoordinaten usw.). Normalerweise ist dieses Gitter Raster und der Herstellungsprozess Verpixelung. Unsere 3D-Rendering 101 Artikel, haben wir eine sehr vereinfachte Ansicht des Verfahrens erhalten:

Das obige Bild vermittelt den Eindruck, dass die Primitiven nur in kleine Blöcke geschnitten sind, aber es steckt noch so viel mehr dahinter. Der erste Schritt besteht darin, herauszufinden, ob ein Primitiv tatsächlich in die Kamera schaut – in einem früheren Bild dieses Artikels sind zum Beispiel Primitiven zu sehen, die den Rücken des grauen Kaninchens bilden und Frustration zeigen. Obwohl sie sich also im Ansichtsfenster befinden, müssen sie nicht erstellt werden.

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

Direct3D'de bu, system Bearbeitungsstatus sein wird und diese Anweisung wird Sie auffordern, es zu entfernen (aka Schrott) für jedes Primitiv entweder nach vorne oder nach hinten gerichtet (oder überhaupt nicht blind sein - z. Drahtmodell Modus). Woher weiß es also, was die Vorder- oder Rückseite ist? wenn wir schauen Mathematik in der EckenbearbeitungWir haben gesehen, dass Dreiecke (oder mehr Scheitelpunkte) Normalenvektoren haben, die dem System mitteilen, in welche Richtung es zeigt. Mit diesem Wissen kann eine einfache Prüfung durchgeführt werden und wenn die Primitivprüfung fehlschlägt, wird sie aus der Renderkette entfernt.

Als nächstes ist es an der Zeit, das Pixelraster anzuwenden. Auch dies ist überraschend komplex, denn wenn ein Pixel vollständig in ein Primitiv passt – ganz, teilweise oder gar nicht – sollte das System funktionieren. Um dies zu tun, Umfangsprüfung getan. Das Bild unten zeigt, wie Dreiecke in Direct3D 11 gerastert werden:

Die Regel ist ziemlich einfach: Wenn das Pixelzentrum das überschreitet, was Microsoft es nennt, wird das Pixel als Dreieck betrachtet. 'oben links' Regel. Das 'Top' ist ein horizontales Liniensteuerelement; Pixelzentrum on diese Linie. Der 'linke' Teil ist für nicht-horizontale Linien und die Pixelmitte muss links von einer solchen Linie liegen. Es gibt zusätzliche Regeln für Nicht-Primitive, d.h. einfache Linien und Punkte und wenn Regeln zusätzliche Bedingungen gewinnen Multisampling'i ist angestellt.

Wenn wir uns das Bild in der Microsoft-Dokumentation genau ansehen, können wir feststellen, dass die von den Pixeln erzeugten Formen den ursprünglichen Primitiven 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 über die Originalobjekte und Überlappung.

lass uns verwenden 3DMark03 . von UL Benchmark um den Alias ​​in der Verarbeitung zu sehen:

Im ersten Bild ist die Scangröße auf einen sehr niedrigen Wert von 720 x 480 Pixel eingestellt. Die Überlappung ist am Handlauf gut sichtbar und der Schatten wirft die Waffe, die der oberste Soldat hält. Vergleichen Sie das mit dem, was Sie bei einem Scan mit 24 mal so vielen Pixeln erhalten:

Hier sehen wir, dass der Alias ​​auf Geländer und Schatten komplett weg ist. Es mag jedes Mal wie ein größerer Rasterpfad erscheinen, aber die Abmessungen des Rasters müssen vom Monitor unterstützt werden, auf dem das Bild angezeigt wird, und diese Pixel müssen nach der Rasterung verarbeitet werden. eine offensichtliche Leistungseinbuße sein.

Hier kann Multisampling helfen und so funktioniert es in Direct3D:

Anstatt zu prüfen, ob ein Pixelzentrum den Rasterisierungsregeln entspricht, können mehrere Positionen (Subpixel-Samples oder Unterstichproben) wird innerhalb jedes Pixels getestet, und wenn eines davon passt, bildet dieses Pixel einen Teil der Form. Dies ist möglicherweise nicht von Nutzen und kann das Aliasing sogar verschlimmern, aber wenn Multisampling verwendet wird, werden welche Unterabtastungen durch das Grundelement abgedeckt und die Ergebnisse der Pixelverarbeitung werden in einem Puffer im Speicher gespeichert.

Dieser Puffer wird dann verwendet, um die Unterabtast- und Pixeldaten so zu mischen, dass die primitiven Kanten weniger blockiert werden. Wir werden uns das gesamte Aliasing in einem späteren Artikel noch einmal ansehen, aber im Moment kann Multisampling Folgendes tun, wenn es in einem Scan mit sehr wenigen Pixeln verwendet wird:

Wir sehen, dass die Kantenglättung bei verschiedenen Formen stark reduziert wird. Ein größeres Raster ist definitiv besser, aber die Leistungseinbußen können stattdessen die Verwendung von Multisampling begünstigen.

Eine andere Sache, die im Rasterisierungsprozess zu tun ist Okklusionstest. Dies sollte erfolgen, da das Ansichtsfenster voller Grundelemente ist, die sich überlappen (verstopft) - zum Beispiel überlappen sich im obigen Bild die Dreiecke auf der Vorderseite, aus denen der Soldat im Vordergrund besteht, mit den gleichen Dreiecken beim anderen Soldaten. Neben der Überprüfung, ob ein Primitiv ein Pixel bedeckt, können auch relative Tiefen verglichen werden, und wenn eines hinter dem anderen liegt, kann es durch den Rest des Renderprozesses übersprungen werden.

Wenn jedoch das nahe Primitiv transparent ist, ist das andere immer noch sichtbar, obwohl die Okklusion nicht überprüft wird. Deshalb führen fast alle 3D-Engines Occlusion Checks durch Vor etwas an die GPU senden und stattdessen Z-Tampon als Teil des Erstellungsprozesses. Hier wird der Frame normalerweise gerendert, aber die GPU speichert nur die Tiefenwerte, anstatt die endgültigen Pixelfarben im Speicher zu speichern. Dies kann dann in Shadern verwendet werden, um die Sichtbarkeit bei Aspekten mit Objektüberlappung mit größerer Kontrolle und Präzision zu steuern.

Im obigen Bild gilt: Je dunkler das Pixel, desto näher ist das Objekt an der Kamera. Um den Z-Puffer zu erstellen, wird der Frame einmal gerendert und dann erneut gerendert, aber dieses Mal wird beim Rendern der Pixel ein Shader ausgeführt, um sie mit den Werten im Z-Puffer zu vergleichen. Wenn sie nicht sichtbar ist, wird diese Pixelfarbe nicht im letzten Bildpuffer platziert.

Vorerst der wirklich letzte Schritt Eckenattribut-Interpolation - In unserem ersten vereinfachten Diagramm war das Primitiv ein vollständiges Dreieck, aber denken Sie daran, dass die Ansicht mit den Ecken der Formen gefüllt ist, nicht mit der Form selbst. Das System muss also herausfinden, wie Farbe, Tiefe und Textur des Primitivs zwischen den Scheitelpunkten liegen, und so wird es genannt. Interpolation. Wie Sie sich vorstellen können, ist dies keine einfache Berechnung, sondern eine andere Berechnung.

Obwohl der gerasterte Bildschirm 2D ist, stellen die Strukturen im Inneren eine erzwungene 3D-Perspektive dar. Wenn Linien wirklich zweidimensional wären, wäre ein einfaches linear verschiedene Farben usw., wenn Sie von einem Scheitelpunkt zum anderen gehen. Aber wegen des 3D-Aspekts der Szene muss die Interpolation die Perspektive berücksichtigen - Simon Yeung'un muhteşem blogu erhalten Sie weitere Informationen zum Ablauf.

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

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

Bevor wir unsere Betrachtung der Rasterung beenden, müssen wir noch etwas über die Reihenfolge des Renderns sagen. Wir sprechen zum Beispiel nicht darüber, woher die Tesselation kommt; Stattdessen sprechen wir über die Verarbeitungsreihenfolge von Primitiven. Objekte werden normalerweise in der Reihenfolge gerendert, in der sie im Indexpuffer erscheinen (der Speicherblock, der dem System mitteilt, wie Scheitelpunkte gruppiert werden), und dies kann einen erheblichen Einfluss darauf haben, wie transparente Objekte und Effekte gerendert werden.

Dies liegt daran, dass Primitive einzeln behandelt werden und wenn Sie die vorderen zuerst ausführen, werden keine der dahinter liegenden angezeigt (hier kommt die Okklusionsextraktion wirklich ins Spiel). und kann aus dem Prozess entfernt werden (Leistung verbessern) - dies wird normalerweise als 'von vorne nach hinten' erfordert, dass der Rendering- und der Indexpuffer auf diese Weise angeordnet sind.

Wenn jedoch einige dieser Primitive direkt vor der Kamera transparent sind, führt das Rendern von vorne nach hinten dazu, dass Objekte hinter dem transparenten übersehen werden. Eine Lösung besteht darin, alles von vorne nach hinten mit transparenten Grundelementen und zuletzt ausgeführten Effekten auszuführen.

Alle modernen Spiele werden also Rücken an Rücken gerendert, oder? Nicht, wenn es geholfen werden kann - seien Sie sich bewusst, dass die Erstellung jedes Primitivs viel höhere Leistungskosten verursacht als diejenigen, die nur sichtbar sind. Es gibt andere Möglichkeiten, transparente Objekte zu handhaben, aber im Allgemeinen gibt es keine Universallösung und jede Situation muss einzigartig behandelt werden.

Dies fasst im Wesentlichen die Vor- und Nachteile der Rasterung zusammen – auf moderner Hardware ist sie wirklich schnell und effizient, aber immer noch eine Annäherung an das, was wir sehen. In der realen Welt absorbiert, reflektiert und bricht jedes Objekt Licht, was sich alle auf die betrachtete Szene auswirkt. Indem wir die Welt in Primitive einteilen und nur einige erschaffen, erhalten wir ein schnelles, aber grobes Ergebnis.

Ich wünschte es gäbe einen anderen Weg...

Dort is ein anderer Weg: Raytracing

Vor etwa zwanzig Jahren entwickelte ein Informatiker namens Arthur Appel ein System zum Erstellen von Bildern auf einem Computer, bei dem ein einzelner Lichtstrahl direkt von der Kamera geworfen wird, bis er auf ein Objekt trifft. Von dort aus verändern die Materialeigenschaften (Farbe, Reflektivität etc.) dann die Intensität des Lichtstrahls. Jedes Pixel im gerenderten Bild hätte einen Ray-Dump, und ein Algorithmus würde ausgeführt, indem eine mathematische Sequenz durchlaufen würde, um die Farbe des Pixels zu decodieren. Appels Verfahren Schienenguss.

Ungefähr 10 Jahre später ein anderer Wissenschaftler John Whitted Er entwickelte einen mathematischen Algorithmus, der dem Ansatz von Appel entsprach, aber wenn der Strahl ein Objekt traf, erzeugte er zusätzliche Strahlen, die je nach Material des Objekts in verschiedene Richtungen feuerten. Da dieses System für jede Objektinteraktion neue Strahlen erzeugen würde, war der Algorithmus viel rekursiver und daher rechnerisch schwieriger; Es hatte jedoch einen erheblichen Vorteil gegenüber Appels Methode, da es Reflexion, Brechung und Schattierung richtig erklären konnte. Dieses Verfahren heißt: Raytracing (um ehrlich zu sein, rückwärts Raytracing, wir folgen dem Strahl der Kamera und nicht dem Objekt) und dem Heiligen Gral für Computergrafik und Filme seit dieser Zeit.

Dieses Verfahren hieß Raytracing (reverse Raytracing, genau genommen, da wir Strahlen von der Kamera und nicht von Objekten verfolgen) und ist seither der heilige Gral für Computergrafiken und Filme.

Im obigen Bild können wir uns ein Bild von Whitteds Algorithmusarbeit machen. Für jedes Pixel im Bild wird ein Strahl von der Kamera emittiert und bewegt sich, bis er eine Oberfläche erreicht. Diese spezielle Oberfläche ist durchscheinend, sodass Licht reflektiert und gebrochen wird. In beiden Fällen werden Sekundärstrahlen erzeugt und ausgestoßen, bis sie mit einer Oberfläche wechselwirken. Es gibt auch eine zusätzliche Sekundärseite, die die Farbe von Lichtquellen und die von ihnen geworfenen Schatten berücksichtigt.

Der rekursive Teil des Prozesses besteht darin, dass jedes Mal, wenn ein neuer Gießstrahl eine Oberfläche schneidet, Nebenträger erzeugt werden können. Dies kann leicht außer Kontrolle geraten, sodass die Anzahl der produzierten Nebenträger immer begrenzt ist. Wenn ein Strahlengang fertiggestellt ist, wird seine Farbe an jedem Endpunkt basierend auf den Materialeigenschaften dieser Oberfläche berechnet. Dieser Wert schaltet dann den Strahl auf den vorherigen um, passt die Farbe dieser Fläche an usw., bis er den effektiven Ursprung (Pixel im Rahmen) des Primärstrahls erreicht.

Dies kann äußerst komplex sein, und selbst einfache Szenarien können zu einer Flut von Berechnungen führen. Glücklicherweise können einige Dinge getan werden, um zu helfen - eine wäre die Verwendung von Hardware, die speziell entwickelt wurde, um diese speziellen mathematischen Operationen zu beschleunigen, genau wie für die Matrizenmathematik bei der Vertex-Verarbeitung (mehr dazu gleich). Ein weiterer wichtiger Punkt ist die Beschleunigung des Prozesses, um herauszufinden, welches Objekt ein Strahl trifft und wo genau er sich auf der Oberfläche des Objekts schneidet - dies kann überraschend sein, wenn das Objekt aus vielen Dreiecken besteht. schwer zu machen:

Anstatt jedes Dreieck zu testen, wird vor dem Raytracing an jedem Objekt eine Liste von Bounding Volumes (BV) erstellt - dies sind nichts anderes als die Quader, die das jeweilige Objekt umgeben, und werden für die verschiedenen Strukturen darin sukzessive kleiner. Objekt.

Zum Beispiel gilt die erste BV für alle Kaninchen. Das nächste Paar hat Kopf, Beine, Rumpf, Schwanz usw. jede dieser dann kleine Strukturen im Kopf usw. Es wird eine weitere Sammlung von Lautstärken für und der endgültige Lautstärkepegel mit einer kleinen Anzahl von zu testenden Dreiecken geben. Alle diese Bände werden dann in einer geordneten Liste ( BV-Hierarchie oder kurz BVH), so dass das System eine relativ kleine Anzahl von BVs gleichzeitig prüft:

Während die Verwendung eines BVH das eigentliche Raytracing technisch nicht beschleunigt, ist der Aufbau der Hierarchie und des anschließenden Suchalgorithmus oft viel schneller als die Prüfung, ob ein Strahl eines von Millionen Dreiecken schneidet. in der 3D-Welt.

Programme wie heute Rührgerät ve POV-Ray Verwenden Sie Raytracing mit zusätzlichem Tracking (wie Photontracing und Radio), um hochrealistische Bilder zu erstellen:

Die offensichtliche Frage ist, ob Raytracing so gut ist, warum verwenden wir es nicht überall? Die Antworten liegen in zwei Bereichen: Erstens produziert selbst einfaches Raytracing Millionen von Strahlen, die immer wieder neu berechnet werden müssen. Das System startet mit nur einem Strahl pro Bildschirmpixel, sodass es bei einer Auflösung von nur 800 x 600 480.000 Primärstrahlen erzeugt, von denen jeder mehrere Sekundärstrahlen erzeugt. Dies ist selbst für die heutigen Desktop-Computer ein ernstes Geschäft. Das zweite Problem ist, dass grundlegendes Raytracing eigentlich nicht sehr realistisch ist und eine Reihe zusätzlicher, sehr komplexer Gleichungen hinzugefügt werden müssen, um genau zu sein.

Selbst mit moderner PC-Hardware ist der Aufwand dafür in Echtzeit für ein bestehendes 3D-Spiel nicht zu bewältigen. Unsere 3D-Rendering 101 In dem Artikel haben wir gesehen, dass es bei einem Raytracing-Benchmark mehrere zehn Sekunden dauert, um ein einzelnes Bild mit niedriger Auflösung zu erzeugen.

Wie war das ursprüngliche Wolfenstein 3D-Ray-Casting, es ist zurück im Jahr 1992 und warum es getroffen wird? Battlefield V ve Metro-Migration, beide im Jahr 2019 veröffentlicht, bieten sie Raytracing-Funktionen? Machen sie Rasterisierung oder Raytracing? 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 namens DXR (DirectX Raytracing) an. Dies war eine neue Grafikpipeline, die die Standard-Rasterisierungs- und Berechnungspipelines ergänzte. Zusätzliche Funktionalität ist die Art und Weise, wie Shader, Datenstrukturen usw. Es wurde mit seiner Einführung erreicht, erforderte jedoch keine spezielle Hardwareunterstützung außer der, die bereits für Direct3D 12 erforderlich war.

Auf der gleichen Spieleentwicklerkonferenz, Microsoft sprach über DXR, Electronic Arts hat darüber gesprochen Pica Pica Projekte - Ein 3D-Engine-Experiment mit DXR. Sie zeigten, dass Raytracing verwendet werden kann, jedoch nicht für das vollständige Render-Framework. Stattdessen werden für den Großteil der Arbeit traditionelle Rasterisierungs- und Computational Shader-Techniken verwendet, wobei DXR für bestimmte Bereiche verwendet wird – was bedeutet, dass die Anzahl der erzeugten Strahlen viel geringer ist als für die gesamte Szene.

Dieser hybride Ansatz wurde in der Vergangenheit, wenn auch seltener, verwendet. Zum Beispiel Wolfenstein 3D gebrauchter Schienenguss um herauszufinden, wie der gerenderte Frame aussieht, aber mit einem Strahl pro Pixel und nicht pro Pixelspalte. Dies kann immer noch überwältigend erscheinen, bis Sie feststellen, dass das Spiel ursprünglich mit einer Auflösung von 640 x 480 lief, also nicht mehr als 640 Strahlen gleichzeitig liefen.

Die Grafikkarte von Anfang 2018 – wie AMDs Radeon RX 580 oder Nvidias GeForce 1080 Ti – erfüllte sicherlich die Hardwareanforderungen für DXR, aber selbst mit ihren Rechenfähigkeiten gab es einige Missverständnisse, dass sie leistungsstark genug wären, um DXR zu verarbeiten. auf sinnvolle Weise.

Das hat sich im August 2018 etwas geändert, als Nvidia seine neueste GPU-Architektur auf den Markt brachte. Codename Turing. Das kritische Merkmal dieses Chips waren sogenannte RT-Cores: spezielle Logikeinheiten zur Beschleunigung von Beam-Dreieck-Schnitt- und Bounding-Volume-Hierarchie-(BVH)-Kreuzberechnungen. Diese beiden Prozesse sind zeitaufwendige Routinen, bei denen ein Licht mit den Dreiecken interagiert, die verschiedene Objekte innerhalb einer Szene bilden. Da RT-Cores Turing-Prozessor-spezifisch sind, kann der Zugriff nur über die proprietäre API von Nvidia erfolgen.

Das erste Spiel, das diese Funktion unterstützt, ist Battlefield V von EA und Als wir die Verwendung von DXR . getestet haben, waren wir von der Verbesserung der Wasser-, Glas- und Metallreflexionen im Spiel beeindruckt, weniger jedoch von dem späteren Leistungshit:

Um fair zu sein, spätere Patches haben sich etwas verbessert, aber es gab (und ist) einen enormen Rückgang der Rendergeschwindigkeit von Frames. Bis 2019 sind einige andere Spiele erschienen, die diese API unterstützen und Raytracing für bestimmte Teile in einem Frame durchführen. Wir testeten Metro-Migration ve Schatten des Grabräubersund fand eine ähnliche Geschichte - bei starker Nutzung würde es sich besonders auf die DXR-Framerate auswirken.

Ungefähr zur gleichen Zeit wurden UL Benchmarks angekündigt Ein DXR-Funktionstest für 3DMark:

Unser Test zu DXR-fähigen Spielen und der 3DMark-Funktionstest haben jedoch eines in Bezug auf Raytracing bewiesen: Es ist auch 2019 noch ernsthafte Arbeit, selbst für die über 1000-Dollar-Modelle für den Grafikprozessor. Bedeutet das, dass wir keine echte Alternative zur Rasterung haben?

Die neuesten Funktionen in der 3D-Grafiktechnologie für Verbraucher sind oft sehr teuer und die anfängliche Unterstützung neuer API-Funktionen kann ziemlich lückenhaft oder langsam sein (wie wir festgestellt haben). Als wir Max Payne 3 getestet haben In einer Reihe von Direct3D-Releases um 2012) - Letzteres ist normalerweise darauf zurückzuführen, dass Spieleentwickler versuchen, so viele erweiterte Funktionen wie möglich zu integrieren, manchmal mit begrenzter Erfahrung.

Vertex- und Pixel-Shader, Tessellation, HDR-Rendering und Screen Space Ambient Occlusion waren jedoch früher sehr anspruchsvoll, nur für High-End-GPUs geeignet, ihre Verwendung ist heute in Spielen üblich und wird von einer Vielzahl von Grafikkarten unterstützt. Dasselbe gilt für Raytracing und mit gegebener Zeit wird es nur eine weitere Detaileinstellung, die für die meisten Benutzer standardmäßig aktiviert ist.

Ein paar abschließende Gedanken

Und damit sind wir am Ende unseres zweiten Deep Dive angelangt, bei dem wir uns die Welt der 3D-Grafik genauer ansehen. Wir haben uns angeschaut, wie die Ecken von Modellen und Welten von 3D verschoben und in ein flaches 2D-Bild umgewandelt wurden. Wir haben gesehen, wie die Einstellungen des Sichtfelds berücksichtigt werden müssen und welche Auswirkungen sie haben. Der Prozess der Pixelierung dieser Scheitelpunkte wurde untersucht und wir schließen mit einem kurzen Blick auf einen alternativen Prozess zur Rasterung.

Wir konnten nach wie vor nicht alles abdecken und hier und da ein paar Details überfliegen - es ist doch kein Lehrbuch! Aber wir hoffen, dass Sie dabei ein wenig mehr gelernt haben und eine neu entdeckte Faszination für Programmierer und Ingenieure haben, die wirklich die Mathematik und Wissenschaft beherrschen, die erforderlich sind, um all dies in Ihren Lieblings-3D-Titeln zu verwirklichen.

Wir beantworten gerne Ihre Fragen, also schreiben Sie uns gerne im Kommentarbereich. bis zum nächsten.

Masthead-Gutschrift: Monochromdruck Raster abstrakt von Aleksei Derin