Im ersten Teil, in dem wir uns eingehender mit der Erstellung von 3D-Spielen befassen, konzentrieren wir uns ganz auf die oberste Phase des Prozesses. Das bedeutet, unsere Mathe-Lehrbücher zu ziehen, lineare Algebra, Matrizen und Trigonometrie zu bearbeiten - oh ja!

Wir werden untersuchen, wie 3D-Modelle transformiert und wie Lichtquellen berechnet werden. Die Unterschiede zwischen Eck- und Geometrie-Shadern werden gründlich untersucht und Sie werden sehen, wo die Tessellation passt. Zur Erläuterung verwenden wir Diagramme und Codebeispiele, um zu zeigen, wie Mathematik und Zahlen in einem Spiel behandelt werden. 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 einen ersten Einblick in die 3D-Grafikwelt zu erhalten.

Was ist der Zweck?

In der Welt der Mathematik ist ein Punkt einfach eine Position innerhalb eines geometrischen Feldes. Es gibt nichts Kleineres als einen Punkt, da er keine Größe hat. Sie können daher verwendet werden, um klar zu definieren, wo Objekte wie Linien, Ebenen und Volumen beginnen und enden.




Für 3D-Grafiken sind diese Informationen entscheidend, um zu bestimmen, wie alles aussehen wird, da alles, was angezeigt wird, eine Linie, eine Ebene usw. ist. Sammlung. Das Bild unten ist ein Screenshot aus der Veröffentlichung von Bethesda 2015. Fallout 4:




Es kann etwas schwierig sein zu erkennen, dass es sich nur um einen großen Stapel von Punkten und Linien handelt. Wir zeigen Ihnen daher, wie dieselbe Szene im Drahtgittermodus aussieht. Die 3D-Rendering-Engine überspringt die im Pixelstadium erstellten Texturen und Effekte und zeichnet nur farbige Linien, die die Punkte verbinden.







Jetzt sieht alles ganz anders aus, aber wir können verschiedene Objekte, die Umgebung und alle Linien sehen, die zusammen den Hintergrund bilden. Einige sind nur eine Handvoll Linien, wie Felsen im Vordergrund, während andere genug Linien haben, um solide auszusehen.

Jeder Punkt am Anfang und Ende jeder Zeile wurde mit viel Mathematik durchgearbeitet. Einige dieser Berechnungen sind sehr schnell und einfach; andere sind viel schwieriger. Durch die Zusammenarbeit an Punktgruppen, insbesondere in Dreiecksform, ergeben sich erhebliche Leistungssteigerungen. Schauen wir uns diese also genauer an.




Was wird für ein Dreieck benötigt?

Name Dreieck es sagt uns, dass die Form 3 Innenwinkel hat; Dazu benötigen wir 3 Ecken und 3 Linien, die die Ecken verbinden. Richtiger Name der Ecke Hügel (Eckpunkte sind das Pluralwort) und jeder wird durch einen Punkt definiert. Da wir auf einer geometrischen 3D-Welt basieren, Kartesisches Koordinatensystem für Punkte. Dies wird normalerweise zusammen als 3 Werte geschrieben, zum Beispiel (1, 8, -3) oder allgemeiner (X ve Z.).

Von hier aus können wir zwei weitere Eckpunkte hinzufügen, um ein Dreieck zu erhalten:




Beachten Sie, dass die gezeigten Linien nicht wirklich notwendig sind - wir können nur Punkte haben und dem System mitteilen, dass diese 3 Eckpunkte ein Dreieck bilden. Alle Scheitelpunktdaten werden in einem zusammenhängenden Speicherblock gespeichert, der als a bezeichnet wird Eckstoßstange;; Informationen über die Form, die sie herstellen, werden direkt in das Renderprogramm codiert oder in einem anderen Speicherblock gespeichert. Verzeichnispuffer.

Im ersteren Fall werden verschiedene Formen genannt, die aus den Ecken gebildet werden können Primitive Direct3D präsentiert Dienstpläne, Streifen und Lüfter in Punkt-, Linien- und Dreiecksform. Bei korrekter Verwendung verbessern dreieckige Streifen die Leistung, indem Ecken für mehrere Dreiecke verwendet werden. Im folgenden Beispiel sehen wir, dass nur 4 Ecken benötigt werden, um 2 Dreiecke zu verbinden. Wenn sie getrennt wären, würden wir 6 Eckpunkte benötigen.

Wenn Sie eine größere Sammlung von Ecken abdecken möchten, z. ein NPC-Modell im Spiel, dann a - Dies ist ein weiterer Speicherblock, der jedoch aus mehreren Puffern (Scheitelpunkt, Index usw.) und Texturressourcen für das Modell besteht. Microsoft bietet eine kurze Einführung in diese Pufferverwendungen. Online-Dokumente Quelle.

Konzentrieren wir uns vorerst darauf, was in einem 3D-Spiel mit diesen Ecken gemacht wird, jedes Mal, wenn ein neuer Frame erstellt wird (wenn Sie nicht sicher sind, was das bedeutet, wiederholen Sie den Vorgang). 101 rendern). Einfach ausgedrückt, ein oder zwei Dinge werden ihnen angetan:

  • Verschieben Sie den Scheitelpunkt an eine neue Position
  • Ändern Sie die Farbe der Ecke

Bereit für etwas Mathe? Gut! Denn so wird es gemacht.

Geben Sie den Vektor ein

Stellen Sie sich vor, auf dem Bildschirm befindet sich ein Dreieck, und Sie drücken eine Taste, um es nach links zu verschieben. Natürlich (X ve Z.) die Zahlen jedes Scheitelpunkts variieren entsprechend und sie sind; aber, Wie Dies mag etwas ungewöhnlich erscheinen. Die überwiegende Mehrheit der 3D-Grafik-Rendering-Systeme verwendet, anstatt die Koordinaten zu ändern, ein spezielles mathematisches Werkzeug, um die Aufgabe zu erledigen: Vektoren.

Ein Vektor kann als Pfeil betrachtet werden, der auf eine bestimmte Stelle im Raum zeigt und eine beliebige Länge haben kann. Ecken werden tatsächlich mit Vektoren beschrieben, die auf kartesischen Koordinaten basieren:

Beachten Sie, wie der blaue Pfeil an einer Stelle beginnt (in diesem Fall Ursprung) und erstreckt sich bis zum Gipfel. Wir haben das benutzt, was genannt wurde cSpaltennotation um diesen Vektor zu beschreiben Rudern Notation funktioniert auch. Sie werden auch feststellen, dass es noch einen zusätzlichen Wert gibt - die 4. Zahl ist normalerweise mit w Komponente und wird verwendet, um anzuzeigen, ob der Vektor verwendet wird, um die Position eines Scheitelpunkts zu beschreiben ( Vektorposition) oder ein allgemeiner Aspekt (a die Nacht Vektor). Im letzteren Fall sieht es so aus:

Dieser Vektor zeigt in die gleiche Richtung und hat die gleiche Länge wie der vorherige Positionsvektor, also (X ve Z.) Werte sind gleich; Aber w-Komponentenvektoren sind Null statt 1. Die Verwendung von Richtungsvektoren wird später in diesem Artikel erläutert. Betrachten wir jedoch zunächst die Tatsache, dass alle Eckpunkte in der 3D-Szene auf diese Weise definiert werden. Warum? Denn mit diesem Format wird es viel einfacher, sie zu verschieben.

Mathe, Mathe und noch mehr Mathe

Denken Sie daran, dass wir ein grundlegendes Dreieck haben und es nach links verschieben möchten. Jeder Scheitelpunkt wird durch einen Positionsvektor definiert, daher müssen wir die 'Moving Math' ( Umbauten) muss an diesen Vektoren arbeiten. Geben Sie das nächste Fahrzeug ein: Serie (oder Mutter für eine davon). Dies ist eine Reihe von Werten, die als Zeilen und Spalten geschrieben sind, ähnlich einer Excel-Tabelle.

Für jede Art von Transformation, die wir durchführen möchten, gibt es eine zugehörige Matrix, und es ist nur der Fall, die Transformationsmatrix und den Positionsvektor miteinander zu multiplizieren. Wir gehen nicht auf die spezifischen Details ein, wie und warum dies geschieht, aber wir können sehen, wie es aussieht.

Scheitelpunkt im 3D-Raum verschieben Übersetzung und die erforderliche Berechnung ist:

x0etc. Werte stellen die ursprünglichen Koordinaten des Scheitelpunkts dar; Delta-x Die Werte geben an, um wie viel sich der Peak bewegen muss. Die Matrixvektorberechnung führt dazu, dass beide einfach addiert werden ( w Die Komponente bleibt unberührt, sodass die endgültige Antwort immer noch ein Positionsvektor ist.

Zusätzlich zum Bewegen möchten wir das Dreieck möglicherweise drehen oder auf eine größere oder kleinere Größe skalieren - für beide gibt es Transformationen.

WebGL-basiertes grafisches Tool Echtzeit-Rendering-Website diese Berechnungen an einer ganzen Figur zu visualisieren. Beginnen wir mit einem Quader an einem Standardort:

In diesem Online-Tool bezieht sich der Modellpunkt auf den Positionsvektor, die Erdmatrix ist die Transformationsmatrix und der Erdraumpunkt ist der Positionsvektor für den transformierten Scheitelpunkt.

Wenden wir nun verschiedene Transformationen auf den Quader an:

Im Bild oben die Abbildung Übersetzung 5 Einheiten in jede Richtung. Wir können diese Werte in der mittleren großen Matrix, der letzten Spalte, sehen. Der ursprüngliche Positionsvektor (4, 5, 3, 1) bleibt wie er sollte, aber der transformierte Scheitelpunkt wird jetzt als (9, 10, 8, 1) übersetzt.

Bei dieser Transformation wurde alles zweimal skaliert: Der Quader hat jetzt doppelt so lange Seiten. Das letzte Beispiel ist ein Wendepunkt:

Der Quader wird in einem Winkel von 45 ° gedreht, aber die Matrix ihr ve Kosinus Winkel es. Eine schnelle Überprüfung aller wissenschaftlichen Taschenrechner ohne (45 °) = 0,7071 ... rundet auf den angezeigten Wert 0,71. Wir bekommen die gleiche Antwort Kosinus Wert.

Matrizen und Vektoren müssen nicht verwendet werden. eine übliche Alternative für die Handhabung besonders komplexer Rotationen, komplexer Zahlen und kuaterniyonlar. Diese Mathematik ist ein großer Fortschritt gegenüber Vektoren, daher werden wir Transformationen durchlaufen.

Die Leistung des Peak-Shaders

In diesem Stadium müssen wir berücksichtigen, dass all dies von den Personen gelöst werden muss, die den Build-Code programmieren. Wenn ein Spieleentwickler eine Drittanbieter-Engine (wie Unity oder Unreal) verwendet, wird dies bereits für ihn erledigt, aber jeder, der seine eigenen Berechnungen von Grund auf neu erstellt, muss herausfinden, welche Ecken er tun muss.

Wie sieht das in Bezug auf Code aus?

Wir werden Beispiele von der ausgezeichneten Website verwenden, um dabei zu helfen. Braynzar Soft. Es ist ein großartiger Ort, um die Grundlagen und fortgeschritteneren Dinge zu lernen, wenn Sie selbst mit der 3D-Programmierung beginnen möchten.

Dieses Beispiel ist die All-in-One-Transformation. Erstellt die entsprechenden Transformationsmatrizen basierend auf einer Tastatureingabe und wendet sie dann in einer einzigen Operation auf den ursprünglichen Positionsvektor an. Denken Sie daran, dass dies immer in einer bestimmten Reihenfolge (Skalieren - Drehen - Umdrehen) erfolgt, da auf andere Weise das Ergebnis vollständig beeinträchtigt wird.

Diese Arten von Codeblöcken werden aufgerufen Hill Shader und sie können sehr unterschiedlich sein, was sie tun, in Größe und Komplexität. Das obige Beispiel ist genauso einfach und unbestreitbar wie sie kommen nur ein Shader, weil er nicht die voll programmierbare Natur der Shader nutzt. Ein komplexeres Array von Shadern kann es im 3D-Raum transformieren, berechnen, wie die Szene auf seiner Kamera angezeigt wird, und diese Daten dann in die nächste Stufe des Renderprozesses übertragen. Wir werden uns weitere Beispiele ansehen, während wir die Trimmsequenz für Ecken durchlaufen.

Natürlich können sie für viel mehr verwendet werden, und denken Sie daran, dass jedes Mal, wenn Sie ein in 3D gespieltes Spiel spielen, alle Bewegungen, die Sie sehen können, vom Grafikprozessor ausgeführt werden, indem Sie den Anweisungen in den Ecken-Shadern folgen.

Dies war jedoch nicht immer der Fall. Grafikkarten aus dieser Zeit, die bis Mitte bis Ende der neunziger Jahre zurückreichen, waren nicht in der Lage, Ecken und Grundelemente selbst zu handhaben, und das alles ausschließlich auf der CPU.

Einer der ersten Prozessoren, der eine dedizierte Hardwarebeschleunigung für diese Art der Verarbeitung bereitstellt Nvidias ursprüngliche GeForce wurde im Jahr 2000 veröffentlicht und diese Eigenschaft wurde markiert Hardware-Konvertierung und Beleuchtung (oder kurz Hardware TnL). Die Operationen, die diese Hardware ausführen konnte, waren in Bezug auf Befehle sehr streng und konstant, aber das änderte sich schnell, als neue Grafikchips veröffentlicht wurden. Heutzutage gibt es keine separate Hardware für die Eckenverarbeitung und dieselben Einheiten verarbeiten alles: Punkte, Grundelemente, Pixel, Texturen usw.

Sprechen über BeleuchtungEs ist erwähnenswert, dass alles, was wir sehen, natürlich durch Licht verursacht wird. Lassen Sie uns also sehen, wie dies in der Spitzenphase gehandhabt werden kann. Dazu verwenden wir etwas, das wir bereits in diesem Artikel erwähnt haben.

Leuchtet Kameramotor!

Stellen Sie sich diese Szene vor: Der Schauspieler steht in einem dunklen Raum, der von einer einzelnen Lichtquelle rechts beleuchtet wird. In der Mitte des Raumes steht eine riesige schwimmende, klobige Teekanne. Ok, wir werden wahrscheinlich ein bisschen Hilfe brauchen, um das so zu visualisieren Echtzeit-Rendering-Website, um so etwas in Aktion zu sehen:

Beachten Sie nun, dass dieses Objekt eine Sammlung von geraden Dreiecken ist, die zusammengenäht sind. Dies bedeutet, dass die Ebene jedes Dreiecks in eine bestimmte Richtung zeigt. Einige schauen in die Kamera, andere in die andere Richtung, während andere schief sind. Das Licht von der Quelle trifft auf jede Ebene und wird in einem bestimmten Winkel reflektiert.

Abhängig davon, wohin das Licht geht, ändern sich Farbe und Helligkeit der Ebene. All dies muss berechnet und berechnet werden, um sicherzustellen, dass die Farbe des Objekts korrekt erscheint.

Zunächst müssen wir wissen, in welche Richtung das Flugzeug zeigt und dafür normaler Vektor Flugzeug. Dies ist ein weiterer Pfeil, aber im Gegensatz zum Positionsvektor spielt die Größe keine Rolle (tatsächlich werden sie nach der Berechnung immer skaliert, sodass sie genau 1 Einheit lang sind) und immer dik (rechtwinkliger) Ebene.

Die Normale der Ebene jedes Dreiecks, das Vektorprodukt der beiden Richtungsvektoren (p ve q Oben gezeigt) bilden die Seiten des Dreiecks. Es ist eigentlich besser, für jeden Scheitelpunkt und nicht für jedes Dreieck zu arbeiten, aber wenn man bedenkt, dass es im Vergleich zu letzterem immer mehr als das vorherige ist, ist es schneller, es nur für Dreiecke zu tun.

Nachdem Sie die Normalen einer Oberfläche erreicht haben, können Sie beginnen, die Lichtquelle und die Kamera zu berücksichtigen. Lichter können beim 3D-Rendering unterschiedlich sein, jedoch nur für den Zweck dieses Artikels gerichtet Lichter, z. ein Scheinwerfer. Wie die Ebene eines Dreiecks zeigen der Scheinwerfer und die Kamera in eine bestimmte Richtung, vielleicht in etwa so:

Der Lichtvektor und der Normalenvektor können verwendet werden, um den Winkel zu ermitteln, unter dem das Licht auf die Oberfläche trifft (unter Verwendung der Beziehung zwischen dem Punktprodukt der Vektoren und dem Produkt ihrer Abmessungen). Die Eckpunkte des Dreiecks enthalten zusätzliche Informationen zu ihren Farben und Materialien. Im letzteren Fall wird erklärt, was mit dem Licht passiert, wenn es auf die Oberfläche trifft.

Eine glatte, metallische Oberfläche reflektiert fast das gesamte einfallende Licht in dem Winkel, aus dem es kommt, und ändert kaum die Farbe. Im Gegensatz dazu streut ein raues, mattes Material das Licht weniger vorhersehbar und ändert die Farbe subtil. Um dies zu berücksichtigen, müssen Eckpunkte zusätzliche Werte haben:

  • Originalfarbbasis
  • Umgebungsmaterialeigenschaft - Ein Wert, der bestimmt, wie viel Hintergrundlicht der Scheitelpunkt absorbieren und reflektieren kann
  • Diffuse Materialeigenschaft - ein weiterer Wert, der diesmal jedoch zeigt, wie grob der Peak ist. Dies beeinflusst, wie stark das gestreute Licht absorbiert und reflektiert wird
  • Spekulative Materialeigenschaften - zwei Werte, die ein Maß dafür geben, wie hell der Peak ist

Verschiedene Beleuchtungsmodelle verwenden verschiedene mathematische Formeln, um sie alle zu gruppieren, und die Berechnung erzeugt einen Vektor für das einfallende Licht. Wird dies mit dem Vektor der Kamera kombiniert, kann das allgemeine Erscheinungsbild des Dreiecks bestimmt werden.

Wir haben die feineren Details hier und aus einem besseren Grund durchgearbeitet: Nehmen Sie ein Lehrbuch über 3D-Rendering und Sie werden alle Kapitel sehen, die diesem einzelnen Prozess gewidmet sind. Moderne Spiele führen jedoch häufig die meisten Beleuchtungsberechnungen und Materialeffekte in der Pixel-Computing-Phase durch. Daher werden wir dieses Thema in einem anderen Artikel erneut behandeln.

Alles, was wir bisher behandelt haben, wurde mit Hill Shadern gemacht, und es scheint, als gäbe es fast nichts, was sie nicht können. Leider gibt es. Vertex-Shader können keine neuen Eckpunkte erstellen, und jeder Shader muss an jedem Vertex arbeiten. Es wäre nützlich gewesen, wenn es eine Möglichkeit gegeben hätte, Code zu verwenden, um mehr Dreiecke zu erstellen, einen Shader zwischen dem, was wir bereits haben (um die visuelle Qualität zu verbessern) und über alles Primitive (um die Dinge zu beschleunigen) zu haben. bis um). Mit modernen Grafikprozessoren, Können Mach das!

Bitte, Sir, ich möchte noch mehr (Dreiecke)

Die neuesten Grafikchips sind extrem leistungsfähig und können jede Sekunde Millionen von Matrixvektorberechnungen durchführen. Sie können in kürzester Zeit leicht über einen großen Stapel von Ecken fahren. Auf der anderen Seite ist das Erstellen sehr detaillierter Modelle sehr zeitaufwändig, und wenn das Modell etwas außerhalb der Szene liegt, werden all diese zusätzlichen Details verschwendet.

Was wir brauchen, ist eine Möglichkeit, den Prozessor anzuweisen, es in ein größeres Grundelement aufzuteilen, eine Sammlung kleinerer Dreiecke, die alle innerhalb des ursprünglichen größeren Dreiecks verbunden sind, wie das einzelne gerade Dreieck, das wir betrachten. Der Name dieses Prozesses: tesselation und Grafikchips sind dazu schon seit einiger Zeit in der Lage; Was sich im Laufe der Jahre verbessert hat, ist die Anzahl der Steuerungsprogrammierer, die über den Betrieb verfügen.

Um dies in Aktion zu sehen, verwenden wir: Unigines Paradise-Benchmark-Tool, mit dem wir unterschiedliche Tessellationsbeträge auf die im Test verwendeten spezifischen Modelle anwenden können.

Nehmen wir zunächst einen Platz im Benchmark ein und untersuchen ihn ohne das angewendete Mosaik. Achten Sie darauf, dass das Kopfsteinpflaster auf dem Boden zu falsch aussieht - die verwendete Textur ist effektiv, sieht aber nicht richtig aus. Wenden wir ein Mosaik auf die Szene an. Unigine wendet den Motor nur auf bestimmte Teile an, aber der Unterschied ist dramatisch.

Der Boden, die Gebäudekanten und die Tür sehen jetzt viel realistischer aus. Wenn wir den Prozess erneut ausführen, können wir sehen, wie dies erreicht wird, diesmal jedoch mit hervorgehobenen Kanten der Grundelemente (Drahtgittermodus):

Wir können deutlich sehen, warum der Boden so seltsam aussieht - völlig flach! Die Tür ist auch bündig mit den Wänden, und die Gebäudekanten sind nichts weiter als einfache Würfel.

In Direct3D können primitive Elemente in eine kleinere Gruppe von Teilen aufgeteilt werden ( unteres Fach) Durch Ausführen einer dreistufigen Sequenz. Erstens Programmierer Body Shader - Im Grunde ist dieser Code ein Geometrie-Patch. Stellen Sie sich dies als eine Karte vor, die dem Prozessor mitteilt, wo die neuen Prinzipien und Linien im ursprünglichen Grundelement erscheinen.

Als nächstes wendet die Tesselator-Einheit im Grafikprozessor den Patch auf das Prinzip an. Schließlich, Area Shader berechnet die Positionen aller neuen Ecken wird ausgeführt. Diese Daten können nach Bedarf in den Scheitelpunktpuffer zurückgeführt werden, sodass die Beleuchtungsberechnungen erneut durchgeführt werden können, diesmal jedoch mit besseren Ergebnissen.

Wie sieht das aus? Lassen Sie uns die Wireframe-Version der Mosaikszene abfeuern:

Die Wahrheit ist, dass wir den Grad der Tessellation auf ein ziemlich extremes Niveau einstellen, um den Prozess zu erklären. So gut wie moderne Grafikchips, ist es nicht etwas, das Sie in jedem Spiel tun möchten - nehmen Sie zum Beispiel den Laternenpfahl an der Tür.

In den Bildern ohne Drahtgitter werden Sie aufgefordert, den Unterschied in dieser Entfernung zu beschreiben, und Sie können sehen, dass diese Tessellationsstufe in zu viele Dreiecke zusammengefasst ist, von denen einige schwer zu erkennen sind. Es wird jedoch ordnungsgemäß verwendet, und diese Funktion des Renderns von Ecken kann zu großartigen visuellen Effekten führen, insbesondere wenn versucht wird, Kollisionen mit weichen Körpern zu simulieren.

In den Bildern ohne Drahtgitter werden Sie aufgefordert, den Unterschied in dieser Entfernung zu beschreiben, und Sie können sehen, dass diese Tessellationsstufe in zu vielen Dreiecken zusammengefasst ist, von denen einige schwer zu erkennen sind. Schauen wir uns an, wie dies in Bezug auf Direct3D-Code aussehen könnte. Dazu verwenden wir ein Beispiel von einer anderen großartigen Website. RasterTek.

Hier wird ein einzelnes grünes Dreieck in viele weitere Baby-Dreiecke gekachelt.

Die Krönung erfolgt mit 3 separaten Shadern (siehe Abb. Codebeispiel): Ein Vertex-Shader zum Bereitstellen des Dreiecks für die Triangulation, ein Body-Shader zum Erstellen des Patches und ein Domain-Shader zum Rendern neuer Ecken. Das Ergebnis ist sehr einfach, aber das Beispiel von Unigine zeigt die potenziellen Vorteile und Gefahren der Verwendung von Mosaiken überall auf. Es wird jedoch ordnungsgemäß verwendet, und diese Funktion des Renderns von Ecken kann zu großartigen visuellen Effekten führen, insbesondere wenn versucht wird, Kollisionen mit weichen Körpern zu simulieren.

Sie können damit umgehen, Captain!

Erinnerst du dich an Corner Shader und immer in jeder Ecke der Szene? Es ist nicht schwer zu erkennen, wie Tessellation dies zu einem echten Problem machen kann. Und es gibt viele visuelle Effekte, mit denen Sie mehrere Versionen desselben Grundelements angehen möchten, aber zunächst keine große Anzahl erstellen möchten. Haare, Fell, Gras und explodierende Partikel sind gute Beispiele dafür.

Glücklicherweise gibt es einen anderen Shader, der nur für diese Art von Dingen verfügbar ist - Geometrie-Shader. Es ist eine restriktivere Version des Vertex-Shaders, kann jedoch auf ein ganzes Prinzip angewendet werden und bietet Programmierern in Kombination mit Tessellation eine bessere Kontrolle über große Vertex-Gruppen.

Direct3D ermöglicht wie alle modernen Grafik-APIs eine Vielzahl von Berechnungen an Eckpunkten. Finalisierte Daten können an die nächste Stufe des Erstellungsprozesses gesendet werden (Pixelierung) oder in den Speicherpool zurückgeführt, damit er von der CPU für andere Zwecke überarbeitet oder gelesen werden kann. Dies kann als Datenstrom erfolgen, wie Microsoft hervorhebt Direct3D-Dokumentation:

Durchflussleistung Die Szene ist besonders nützlich für Effekte mit vielen Partikeln überall, da sie alle Prinzipien (nicht einzelne Ecken) in die Rendering-Schleife zurückführen kann. Der gleiche Trick kann geändert werden oder dynamisch Eckstoßstange, aber es ist besser, die Eingangspuffer ruhig zu halten, da es zu Leistungseinbußen kommt, wenn sie zum Ändern geöffnet werden müssen.

Das Rendern von Ecken ist ein wichtiger Bestandteil des Renderns, da es bestimmt, wie die Szene aus der Perspektive der Kamera angeordnet ist. Moderne Spiele können Millionen von Dreiecken verwenden, um ihre Welten zu erschaffen, und jede dieser Ecken wird auf irgendeine Weise transformiert und verbrannt.

Der Umgang mit all diesen Berechnungen und Daten mag wie ein logistischer Albtraum erscheinen, aber Grafikprozessoren (GPUs) und APIs wurden unter diesem Gesichtspunkt entwickelt - sie zeigen eine nahtlos laufende Fabrik, feuern einen Artikel durch eine Reihe von Produktionsphasen und machen das gut. du wirst verstehen.

Erfahren 3D-Spieleerstellung Programmierer haben eine umfassende Grundlage in fortgeschrittener Mathematik und Physik; Sie verwenden jeden Trick und jedes Werkzeug im Handel, um Transaktionen zu optimieren und die Spitzenverarbeitungsphase auf wenige Millisekunden zu reduzieren. Und das ist erst der Anfang der Erstellung eines 3D-Rahmens - dann die Rasterungsphase, und dann gibt es ein ziemlich kompliziertes Pixel- und Textur-Rendering, bevor es irgendwo in die Nähe Ihres Monitors gelangt.

Nachdem Sie das Ende dieses Artikels erreicht haben, hoffen wir, dass Sie einen tieferen Einblick in die Reise eines Scheitelpunkts erhalten, wenn Sie für einen 3D-Rahmen bearbeitet werden. Wir haben nicht alles abgedeckt (es ist ein Muazzam Artikel!), und wir sind sicher, dass Sie viele Fragen zu Vektoren, Matrizen, Lichtern und primitiven Elementen haben werden. Lassen Sie sie auf unserem Weg in den Kommentaren fallen und wir werden unser Bestes tun, um sie alle zu beantworten.

Lesen Sie auch