3D-Spiel-Rendering: Einführung


Sie spielen den frischen Call of Mario: Deathduty Battleyard auf Ihrem perfekten Gaming-PC. Schauen Sie sich den wunderschönen, super breiten 4K-Monitor an und bewundern Sie die herrliche Landschaft und die komplizierten Details. Haben Sie sich jemals gefragt, wie Grafiken auf den Bildschirm gelangen? Haben Sie sich jemals gefragt, wie das Spiel den Computer dazu bringt, Ihnen das alles zu zeigen?

Willkommen zu unserer Tour zum Rendern von 3D-Spielen: Eine Reise für Anfänger, auf der Sie lernen, wie Sie einen Grundrahmen auf dem Bildschirm erstellen.



Jedes Jahr werden Hunderte neuer Spiele für Smartphones, Konsolen und PCs veröffentlicht. Die Vielfalt der Formate und Genres ist sehr groß, aber eines davon wird vielleicht am besten gemeistert - dies sind 3D-Spiele. Welches Spiel das erste war - eine umstrittene Frage und ein kurzer Blick auf die Basis des Guinness-Buchs der Rekorde lieferten mehrere Ergebnisse. Es kann als das erste Ultimate Knight Lore-Spiel angesehen werden, das 1984 veröffentlicht wurde, aber genau genommen waren die Bilder in diesem Spiel zweidimensional - es wurden keine Informationen in vollen drei Dimensionen verwendet.

Wenn wir also wirklich verstehen wollen, wie moderne 3D-Spiele ein Bild bilden, müssen wir mit einem anderen Beispiel beginnen: Winning RunNamco, veröffentlicht 1988. Vielleicht war dies das erste vollständig dreidimensionale Spiel, bei dem Technologien verwendet wurden, die sich nicht allzu sehr von modernen unterscheiden. Natürlich sind Spiele, deren Alter 30 Jahre überschritten hat, keineswegs mit denen von Codemasters F1 identisch, die 2018 veröffentlicht wurden. Die Schaltpläne sind jedoch ähnlich.


In diesem Artikel wird der Prozess der Erstellung eines Basisbilds für einen Monitor oder Fernseher mithilfe eines 3D-Spiels beschrieben. Beginnen wir mit dem Endergebnis und fragen uns: "Was schaue ich an?"

Dann analysieren wir jede Phase der Bildbildung, die wir sehen. Im Verlauf der Aktion werden Konzepte wie Scheitelpunkte und Pixel, Texturen und Durchgänge, Puffer und Schattierungen, Software und Anweisungen berücksichtigt. Wir werden herausfinden, wie die Grafikkarte in den Prozess involviert ist und warum sie überhaupt benötigt wird. Danach können Sie Ihre Spiele und PCs in einem neuen Licht betrachten und beginnen, Videografiken mehr zu schätzen.

Rahmenoptionen: Pixel und Farben


Beginnen wir mit dem 3D-Spiel. Als Beispiel nehmen wir die 2007 veröffentlichte Crytek-Firma Crysis . Unten sehen Sie ein Foto der Anzeige, auf der das Spiel angezeigt wird:


Dieses Bild wird normalerweise als Rahmen bezeichnet . Aber was genau sehen wir? Wir verwenden ein Makroobjektiv:


Leider verderben die Blendung und die externe Hintergrundbeleuchtung des Monitors das Foto, aber wenn wir es ein wenig verbessern, bekommen wir


Wir sehen, dass der Rahmen im Monitor aus einem Raster aus separaten farbigen Elementen besteht, und wenn wir sie noch weiter vergrößern, werden wir feststellen, dass jedes Element ein Block aus drei Teilen ist. Ein solcher Block wird als Pixel (Pixel, kurz für Bildelement) bezeichnet. Bei den meisten Monitoren werden Pixel in drei Farben gemalt: Rot, Grün und Blau (RGB, Rot-Grün-Blau). Um einen neuen Frame anzuzeigen, müssen Sie eine Liste mit Tausenden, wenn nicht Millionen von RGB-Werten verarbeiten und in einem Speicher speichern, auf den der Monitor Zugriff hat. Solche Speicherfragmente werden Puffer genannt, dh der Monitor empfängt den Inhalt des Bildpuffers .

Dies ist der letzte Punkt des gesamten Prozesses. Jetzt bewegen wir uns in die entgegengesetzte Richtung zu seinem Beginn. Der Prozess wird oft durch den Begriff Rendering (Rendering) beschrieben, aber in Wirklichkeit handelt es sich um eine Folge von miteinander verbundenen getrennten Schritten, die sich im Wesentlichen stark unterscheiden. Stellen Sie sich vor, Sie sind Koch in einem mit einem Michelin-Stern ausgezeichneten Restaurant: Das Endergebnis ist ein Teller mit leckerem Essen, aber wie viel muss getan werden, um dies zu erreichen. Wie beim Kochen werden Grundzutaten für das Rendern benötigt.

Notwendige Bauelemente: Modelle und Texturen


Die Hauptbausteine ​​eines 3D-Spiels sind visuelle Ressourcen, die die zu zeichnende Welt füllen. Filme, Fernsehsendungen und Theater brauchen Schauspieler, Kostüme, Requisiten, Kulissen, Beleuchtung - die Liste ist ziemlich lang. Das gleiche gilt für 3D-Spiele. Alles, was Sie im generierten Rahmen sehen, wurde von Künstlern und Modellierungsexperten entwickelt. Um es klarer zu machen, wenden wir uns der alten Schule zu und werfen einen Blick auf das Quake II-Modell des id Software-Unternehmens:


Das Spiel kam vor mehr als 20 Jahren heraus. Zu dieser Zeit war Quake II ein technologisches Meisterwerk, obwohl die Modelle hier wie in jedem Spiel dieser Jahre sehr primitiv aussehen. Es ist jedoch einfach zu demonstrieren, woraus sie bestehen.


Im vorherigen Bild sehen wir einen eckigen Kerl, der aus miteinander verbundenen Dreiecken besteht. Jede Ecke wird als Scheitelpunkt oder Scheitelpunkt bezeichnet. Jeder Scheitelpunkt fungiert als Punkt im Raum und wird durch mindestens drei Zahlen beschrieben: die Koordinaten x, y, z . Dies reicht jedoch für ein 3D-Spiel nicht aus. Daher hat jeder Scheitelpunkt zusätzliche Werte: Farbe, Richtung der Vorderseite (ja, ein Punkt kann keine Vorderseite haben ... lesen Sie einfach weiter!), Helligkeit, Transparenzgrad usw.


Scheitelpunkte haben immer eine Reihe von Werten, die Texturkarten zugeordnet sind. Dies sind Bilder der „Kleidung“, die das Modell trägt. Da das Bild jedoch flach ist, sollte die Karte eine Ansicht aus jeder Richtung enthalten, von der aus wir das Modell betrachten können. Das Quake II-Beispiel zeigt einen einfachen Ansatz: Bilder von vorne, hinten und von den Seiten (Armen). Und moderne 3D-Spiele funktionieren bereits für Modelle mit zahlreichen Texturkarten, von denen jede viele Details enthält, ohne Leerzeichen dazwischen. Einige Karten sehen nicht wie Materialien oder Eigenschaften aus, sondern geben Auskunft darüber, wie Licht von der Oberfläche reflektiert wird. Jeder Scheitelpunkt hat einen Satz von Koordinaten in der Texturkarte, die dem Modell zugeordnet sind, so dass er über den Scheitelpunkt „gestreckt“ werden kann. Dies bedeutet, dass sich die Textur beim Verschieben des Scheitelpunkts mitbewegt.

In der gerenderten dreidimensionalen Welt beginnt alles, was Sie sehen, mit einer Reihe von Eckpunkten und Texturkarten. Sie werden in miteinander verbundene Speicherpuffer geladen. Der Scheitelpunktpuffer (Scheitelpunktpuffer) enthält Texturen und Teile des Speichers, die für das nachfolgende Rendern zugewiesen sind. Der Befehlspuffer enthält eine Liste mit Anweisungen zum Umgang mit diesen Ressourcen.

All dies bildet den notwendigen Rahmen, der verwendet wird, um das endgültige Raster aus farbigen Pixeln zu erstellen. In einigen Spielen ist dies eine große Datenmenge, da es zu lange dauert, die Puffer für jeden neuen Frame neu zu erstellen. Spiele speichern auch in Puffern die Informationen, die erforderlich sind, um eine ganze Welt zu bilden, die ein Spieler sehen kann, oder einen ausreichend großen Teil davon, der bei Bedarf aktualisiert wird. In einem Rennspiel wie F1 2018 wird beispielsweise alles in einer großen Sammlung von Puffern gespeichert. In einem Open-World-Spiel wie Skyrim werden Daten in Puffer geladen und aus diesen gelöscht, wenn sich die Kamera um die Welt bewegt.

Szeneneinrichtung: Scheitelpunkte


Mit allen visuellen Informationen beginnt das Spiel mit der visuellen Anzeige. Die Szene beginnt standardmäßig an einer bestimmten Position mit der Basisanordnung von Modellen, Lichtquellen usw. Dies ist der Bildschirm „Null“ - der Ausgangspunkt für Grafiken. Es wird oft nicht angezeigt, es wird einfach vom System verarbeitet. Um zu veranschaulichen, was in der ersten Phase des Renderns passiert, verwenden wir das Online-Tool Echtzeit-Rendering . Lassen Sie uns das einfachste „Spiel“ erstellen: eine Kiste, die auf dem Boden steht.


Dieses Objekt enthält 8 Eckpunkte, von denen jeder durch eine Liste von Zahlen beschrieben wird. Die Eckpunkte bilden ein Modell, das aus 12 Dreiecken besteht. Jedes Dreieck und sogar das Objekt selbst wird als Primitiv bezeichnet . Während sich die Grundelemente bewegen, drehen und skalieren, durchlaufen die Zahlen Ketten mathematischer Operationen und werden aktualisiert.


Beachten Sie, dass sich die Modellpunktnummern nicht ändern. Diese Zahlen zeigen genau, wo sich das Modell in der virtuellen Welt befindet. Die Berücksichtigung der entsprechenden mathematischen Berechnungen würde den Rahmen des Artikels sprengen. Wir werden nur sagen, dass zuerst alle Objekte dort platziert werden, wo sie sein sollten. Und dann beginnt das Färben.


Nehmen Sie ein anderes Modell, das zehnmal mehr Eckpunkte als das vorherige Feld hat. Im einfachsten Malprozess wird die Farbe jedes Scheitelpunkts genommen und dann werden Farbänderungen von Oberfläche zu Oberfläche berechnet. Dies nennt man Interpolation .


Durch Erhöhen der Anzahl der Scheitelpunkte im Modell können Sie nicht nur realistischere Objekte erstellen, sondern auch das Ergebnis der Farbinterpolation verbessern.


In dieser Phase des Renderns kann der Effekt von Lichtquellen in der Szene detailliert berechnet werden. Zum Beispiel, wie Modellmaterialien Farbe widerspiegeln. Solche Berechnungen sollten die Position und Richtung der Kamera sowie die Position und Richtung der Lichtquellen berücksichtigen.


Zu diesem Zweck gibt es verschiedene mathematische Methoden, von denen einige einfach und andere sehr komplex sind. In der obigen Abbildung sehen wir, dass das Objekt auf der rechten Seite viel schöner und realistischer aussieht, aber mehr Arbeit erforderlich ist, um es zu zeichnen.

Es ist wichtig zu beachten, dass wir jetzt Objekte mit einer kleinen Anzahl von Peaks mit den modernsten Spielen vergleichen. Scrollen Sie nach oben und untersuchen Sie das Bild von Crysis sorgfältig: Diese eine Szene zeigt mehr als eine Million Dreiecke. Am Beispiel des Unigine Valley-Benchmarks können Sie nachvollziehen, wie viele Dreiecke in modernen Spielen verwendet werden.


Jedes Objekt in diesem Bild besteht aus miteinander verbundenen Eckpunkten, die durch die aus Dreiecken bestehenden Grundelemente gebildet werden. Der Benchmark kann im Drahtmodellmodus ausgeführt werden, bei dem die Kanten jedes Dreiecks durch weiße Linien angezeigt werden.


Wie Sie sehen können, besteht jedes Objekt aus Dreiecken, und für jedes Dreieck werden Position, Richtung und Farbe berechnet. Dies berücksichtigt den Standort der Lichtquellen sowie den Standort und die Richtung der Kamera. Alle mit den Scheitelpunkten verbundenen Änderungen müssen auf das Spiel übertragen werden, damit es alle erforderlichen Informationen zum Zeichnen des nächsten Rahmens enthält. Dies erfolgt durch Aktualisieren des Scheitelpunktpuffers.

Überraschenderweise ist dies nicht der schwierigste Teil des Renderns. Mit der richtigen Hardware werden alle Berechnungen in wenigen Tausendstelsekunden durchgeführt! Mach weiter.

Dimension verlieren: Rasterisierung


Nachdem Sie alle Scheitelpunkte verarbeitet und die Platzierung aller Objekte in unserer dreidimensionalen Szene abgeschlossen haben, wird der Rendervorgang in einem sehr wichtigen Stadium fortgesetzt. Bis zu diesem Zeitpunkt war das Spiel wirklich dreidimensional, aber das endgültige Bild ist nicht mehr so: Im Verlauf einer Reihe von Änderungen wird die betrachtete Welt vom 3D-Raum, der aus Tausenden verbundener Punkte besteht, in ein zweidimensionales Bild umgewandelt, das aus farbigen Pixeln besteht. In den meisten Spielen besteht dieses Verfahren aus mindestens zwei Phasen: Projektionsfläche ( Projektion der Leinwand ) und Rasterung .


Zurück zu unserem webbasierten Rendering-Tool wird gezeigt, wie sich das Volumen der virtuellen Welt in ein flaches Bild verwandelt. Die Kamera wird links angezeigt, die von ihr ausgehenden Linien bilden eine abgeschnittene Sichtbarkeitspyramide (Kegelstumpf), und alles, was in sie eindringt, kann im letzten Bild angezeigt werden. Der senkrechte Abschnitt der Pyramide heißt das Ansichtsfenster - das ist , was auf dem Monitor angezeigt wird. Zahlreiche mathematische Berechnungen werden verwendet, um den gesamten Inhalt der Pyramide unter Berücksichtigung der Perspektive der Kamera in den Betrachtungsbereich zu projizieren.

Obwohl die Grafiken im Anzeigebereich zweidimensional sind, sind die Daten immer noch wirklich dreidimensional. Später werden diese Informationen verwendet, um zu berechnen, welche Grundelemente für uns sichtbar und welche verborgen sind. Dies kann überraschend schwierig sein, da Primitive Schatten werfen können, die für uns sichtbar sind, selbst wenn die Primitiven selbst vor uns verborgen sind. Entferne uns verborgen die Grundelemente, die als Fallenlassen (Keulen) bezeichnet werden. Dieser Vorgang kann die Rendergeschwindigkeit des gesamten Frames erheblich beeinflussen. Nachdem die Sortierung in sichtbare und verborgene Grundelemente abgeschlossen und Dreiecke außerhalb der Grenzen der Sichtbarkeitspyramide entfernt wurden, ist die letzte Stufe der Dreidimensionalität abgeschlossen und der Rahmen wird durch Rasterisierung vollständig zweidimensional gemacht.


Die obige Abbildung zeigt ein sehr einfaches Beispiel eines Rahmens, der ein Grundelement enthält. Das Pixelraster wird der geometrischen Form überlagert und die entsprechenden Pixel werden für die nachfolgende Verarbeitung markiert. Das Endergebnis ähnelt nicht zu sehr dem ursprünglichen Dreieck, da wir nicht genügend Pixel verwenden. In dieser Hinsicht tritt das Problem des Aliasing (Aliasing, Schrittlinien) auf, das auf verschiedene Arten gelöst wird. Eine Änderung der Spielauflösung (die Gesamtzahl der Pixel im Frame) wirkt sich daher so stark auf das Endergebnis aus: Mehr Pixel verbessern nicht nur die Anzeige von Formularen, sondern verringern auch den Effekt von unerwünschtem Aliasing.

Nachdem Sie diesen Teil des Renderings abgeschlossen haben, fahren Sie mit dem nächsten großen Schritt fort: der endgültigen Färbung aller Pixel im Rahmen.

Tragen Sie das Licht: Pixel Bühne


Wir sind in der schwierigsten Phase des Renderns angelangt. Früher ging es darum, Kleidungsmodelle (Texturen) mithilfe von Pixelinformationen (ursprünglich aus den Eckpunkten erhalten) anzuziehen. Tatsache ist jedoch, dass die Texturen und der Rahmen selbst zwar zweidimensional sind, die virtuelle Welt in der Vertex-Verarbeitungsphase jedoch verzerrt, verschoben und geändert wurde. Um all dies zu berücksichtigen, werden zusätzliche mathematische Berechnungen verwendet, jedoch können neue Probleme für das Ergebnis charakteristisch sein.


In dieser Abbildung wird eine Schachbrettstruktur auf die Ebene angewendet. Es gibt eine unangenehme visuelle Welligkeit, die durch Aliasing noch verstärkt wird. Um dieses Problem zu lösen, verwenden Sie kleinere Versionen von Textur-Maps ( mehrere Mappings , Mipmaps), die Wiederverwendung von Informationen aus diesen Texturen ( Filtern , Filtern) und zusätzliche mathematische Berechnungen. Der Effekt ist spürbar:


Für jedes Spiel war dies eine wirklich schwierige Phase, aber heute ist dies nicht mehr der Fall, da die Texturverarbeitung aufgrund der weit verbreiteten Verwendung anderer visueller Effekte wie Reflexionen und Schatten zu einer relativ kleinen Phase des Renderprozesses geworden ist. Bei der Wiedergabe mit hohen Auflösungen nimmt die Last in den Phasen der Rasterung und Pixelverarbeitung zu, dies wirkt sich jedoch relativ wenig auf die Verarbeitung von Scheitelpunkten aus. Obwohl die Primärfärbung aufgrund von Lichtquellen im Scheitelpunktstadium durchgeführt wird, können anspruchsvollere Lichteffekte angewendet werden.


In der vorherigen Abbildung sehen wir keine Farbänderungen mehr zwischen verschiedenen Dreiecken, was uns das Gefühl eines glatten, nahtlosen Objekts gibt. Obwohl in diesem Beispiel die Kugel aus der gleichen Anzahl von Dreiecken besteht wie die grüne Kugel in der obigen Abbildung, scheint es uns aufgrund des Pixelfärbeverfahrens viel mehr Dreiecke zu geben.


In vielen Spielen muss die Pixelphase mehrmals ausgeführt werden. Damit beispielsweise ein Spiegel oder eine Wasseroberfläche die umgebende Welt reflektiert, muss diese Welt zuerst gezeichnet werden. Jeder Lauf wird als Pass (Pass) bezeichnet, und um das endgültige Bild für jeden Frame zu erhalten, können problemlos vier oder mehr Durchgänge verwendet werden.

Außerdem müssen Sie manchmal die Scheitelpunktphase erneut ausführen, um die Welt von einem anderen Punkt aus neu zu zeichnen und dieses Bild in einer Szene zu verwenden, die dem Spieler angezeigt wird. Verwenden Sie dazu das Rendern mit einem Puffer (Renderziele). Verwenden Sie Puffer, die als endgültiger Speicher für den Frame dienen, aber auch als Texturen mit einem anderen Durchgang fungieren können.

Um die Komplexität der Pixelstufe zu beurteilen, können Sie lesenRahmenanalyse in Doom 2016 . Sie werden von der Anzahl der Vorgänge, die zum Erstellen eines Frames erforderlich sind, schockiert sein.


Alle zum Erstellen des Frames geleisteten Arbeiten müssen im Puffer gespeichert werden, unabhängig davon, ob es sich um das endgültige oder das Zwischenergebnis handelt. Im Allgemeinen verwendet das Spiel im laufenden Betrieb mindestens zwei Puffer für die endgültige Anzeige: einen für die "aktuelle Arbeit", und der zweite Puffer wartet entweder auf den Zugriff auf einen Monitor oder wird gerade angezeigt. Sie benötigen immer einen Bildschirmpuffer, in dem das Rendering-Ergebnis gespeichert wird. Wenn alle Puffer voll sind, müssen Sie fortfahren und einen neuen Puffer erstellen. Nach Abschluss der Arbeit mit dem Frame wird ein einfacher Befehl gegeben, die endgültigen Frame-Puffer werden ausgetauscht, der Monitor empfängt den zuletzt gerenderten Frame und der Prozess des Renderns des nächsten Frames beginnt.


In diesem Frame aus Assassins Creed Odyssey sehen wir den Inhalt des fertigen Frame-Puffers. Dieser Inhalt kann in einer Tabelle dargestellt werden, die nur Zahlen enthält. Sie werden in Form von elektrischen Signalen an einen Monitor oder Fernseher gesendet, und die Pixel des Bildschirms ändern ihre Werte. Unsere Augen sehen ein flaches, festes Bild, aber unser Gehirn interpretiert es als dreidimensional. Hinter den Kulissen von nur einem Schuss im Spiel verbirgt sich so viel Arbeit, dass es sich lohnt, einen Blick darauf zu werfen, wie Programmierer damit umgehen können.

Prozessmanagement: APIs und Anweisungen


Um herauszufinden, wie das Spiel alle Berechnungen, Eckpunkte, Texturen, Beleuchtung, Puffer usw. ausführen und verwalten kann. - Das ist eine große Aufgabe. Glücklicherweise helfen Sie uns bei diesen Programmierschnittstellen (Anwendungsprogrammierschnittstelle, API).

Rendering-APIs reduzieren die Gesamtkomplexität, indem sie Strukturen, Regeln und Softwarebibliotheken anbieten, die vereinfachte Anweisungen ermöglichen, die hardwareunabhängig sind. Nehmen Sie jedes 3D-Spiel, das in den letzten drei Jahren für den PC veröffentlicht wurde: Es wurde mit einer der drei gängigen APIs erstellt - Direct3D, OpenGL oder Vulkan. Es gibt andere ähnliche Entwicklungen, insbesondere im Mobilsegment, aber in diesem Artikel werden wir über die drei genannten sprechen.


Trotz der Unterschiede in den Namen von Anweisungen und Operationen (z. B. wird ein Codeblock zum Verarbeiten von Pixeln in DirectX als Pixel-Shader und in Vulkan als Fragment-Shader bezeichnet) unterscheidet sich das Endergebnis nicht, genauer gesagt, es sollte sich nicht unterscheiden.

Der Unterschied zeigt sich darin, welche Geräte zum Rendern verwendet werden. Die von der API generierten Anweisungen müssen in hardwarefreundliche Befehle konvertiert werden, die von den Gerätetreibern verarbeitet werden. Und Gerätehersteller müssen viel Zeit und Ressourcen aufwenden, damit ihre Fahrer diese Konvertierung so schnell und korrekt wie möglich durchführen können.


Beispielsweise unterstützte die frühe Beta von The Talos Principle (2014) alle drei genannten APIs. Um zu demonstrieren, wie sich die Ergebnisse verschiedener Kombinationen von Treibern und Schnittstellen unterscheiden können, haben wir den integrierten Standard-Benchmark ausgeführt, indem wir die Auflösung auf 1080p und die Einstellungen für maximale Qualität eingestellt haben. Der Intel Core i7-9700K Prozessor funktionierte ohne Übertakten, die Nvidia Titan X (Pascal) Grafikkarte, RAM - 32 GB DDR4 RAM.

  • DirectX 9 = durchschnittlich 188,4 Bilder / s.
  • DirectX 11 = durchschnittlich 202,3 Bilder / s.
  • OpenGL = durchschnittlich 87,9 Bilder / s.
  • Vulkan = durchschnittlich 189,4 Bilder / s.

Wir werden die Ergebnisse nicht analysieren und sie sagen sicherlich nicht, dass einige APIs "besser" sind als die anderen (vergessen Sie nicht, dass die Beta-Version des Spiels getestet wurde). Wir werden nur sagen, dass die Programmierung für verschiedene APIs mit verschiedenen Schwierigkeiten verbunden ist und zu jedem Zeitpunkt auch die Leistung unterschiedlich sein wird. Im Allgemeinen wählen Spieleentwickler die API, mit der sie mehr Erfahrung haben, und optimieren ihren Code dafür. Manchmal wird der Begriff Engine verwendet, um den Code zu beschreiben, der für das Rendern verantwortlich ist. Genau genommen handelt es sich bei der Engine jedoch um einen vollständigen Satz von Tools, die alle Aspekte des Spiels verarbeiten, nicht nur Grafiken.

Es ist nicht so einfach, ein Programm von Grund auf neu zu erstellen, das ein 3D-Spiel rendert. Daher werden heute in so vielen Spielen lizenzierte Systeme von Drittanbietern verwendet (z. B. Unreal Engine)) Um ihre Komplexität zu bewerten, öffnen Sie die Open Source-Engine für Quake und zeigen Sie die Datei gl_draw.c an: Sie enthält Anweisungen für verschiedene Rendervorgänge und spiegelt nur einen kleinen Teil der gesamten Engine wider. Aber Quake wurde vor über 20 Jahren veröffentlicht und das gesamte Spiel (einschließlich aller visuellen Ressourcen, Sounds, Musik usw.) benötigt 55 MB. Zum Vergleich: In Far Cry 5 belegen nur Shader 62 MB.

Zeit ist am wichtigsten: mit der richtigen Ausrüstung


All dies kann vom Prozessor eines beliebigen Computersystems berechnet und verarbeitet werden. Moderne Prozessoren der x86-64-Familie unterstützen alle notwendigen mathematischen Operationen und enthalten hierfür sogar separate Subsysteme. Die Aufgabe, einen einzelnen Frame zu rendern, erfordert jedoch zahlreiche wiederholte Berechnungen und eine signifikante Parallelisierung der Arbeit. Zentralprozessoren sind dafür nicht geeignet, da sie für die Lösung eines möglichst breiten Aufgabenspektrums geschaffen wurden. Spezialisierte Prozessoren für das Grafik-Computing werden als GPUs (Grafikprozessoren) bezeichnet. Sie werden für DirectX, OpenGL und Vulkan erstellt.

Wir verwenden einen Benchmark, mit dem Sie einen Frame mit einem Zentralprozessor oder einem speziellen Gerät rendern können - V-ray NEXTUnternehmen der Chaos Group. Tatsächlich wird eher Raytracing als Rendern durchgeführt, aber die meisten numerischen Operationen hier sind auch hardwareabhängig.


Lassen Sie uns den Benchmark in drei Modi bestehen: nur den Zentralprozessor, nur den Grafikprozessor und eine Kombination beider Prozessoren:

  • CPU allein = 53 Millionen Strahlen
  • GPU allein = 251 Millionen Strahlen
  • Die Kombination beider Prozessoren = 299 Millionen Strahlen

Die Maßeinheit kann ignoriert werden, die Essenz ist das Fünffache der Differenz. Trotzdem ist dieser Test nicht zu sehr mit Spielen verbunden. Wenden wir uns also dem Old-School-Benchmark Futuremark 3DMark03 zu . Lassen Sie uns einen einfachen Wings of Fury-Test mit einer erzwungenen Berechnung aller Vertex-Shader (dh mit einem vollständigen Satz von Operationen zum Verschieben und Färben von Dreiecken) unter Verwendung des Zentralprozessors durchführen.


Das Ergebnis sollte Sie nicht überraschen:

  • Zentralprozessor = durchschnittlich 77 Bilder / s.
  • GPU = durchschnittlich 1.580 Bilder / s.

Wenn alle Berechnungen mit den Scheitelpunkten vom Zentralprozessor durchgeführt werden, dauert das Rendern und Anzeigen jedes Frames durchschnittlich 13 ms. Bei Verwendung eines Grafikprozessors sinkt diese Zahl auf 0,6 ms - mehr als 20-mal schneller.

Der Unterschied erhöht sich noch mehr, wenn Sie den schwierigsten Benchmark-Test durchführen - Mutter Natur. Der Zentralprozessor produzierte unbedeutende 3,1 Frames / s! Und der Grafikprozessor schoss mit 1388 Bildern / s hoch: Fast 450-mal schneller. Bitte beachten Sie: 3DMark03 kam 16 zurück, und im Test auf dem Zentralprozessor werden nur die Scheitelpunkte verarbeitet, der Grafikprozessor übernimmt weiterhin die Raster- und Pixelstufe. Stellen Sie sich vor, der Benchmark wäre modern und die meisten Operationen würden programmgesteuert durchgeführt?


Versuchen wir nun noch einmal den Unigine Valley- Benchmark . Die von ihm verarbeiteten Grafiken sind denen in Spielen wie Far Cry 5 sehr ähnlich. Neben dem Standard DirectX 11 gibt es auch eine vollständige Software-Rendering-Engine. Bei Ausführung auf einem Videoprozessor erhalten wir ein durchschnittliches Ergebnis von 196 Bildern / s . Was ist mit der Softwareversion? Nach einigen Abstürzen erzeugte ein leistungsstarker Test-PC durchschnittlich 0,1 Bilder / s. - Fast zweitausendmal langsamer.

Der Grund für einen so großen Unterschied liegt in den mathematischen Berechnungen und dem beim 3D-Rendering verwendeten Datenformat. Jeder Kern der CPU ist mit Gleitkommamodulen ausgestattet. Der i7-9700K enthält 8 Kerne mit jeweils zwei solchen Modulen. Obwohl die Architektur der Module in Titan X unterschiedlich ist, können beide Typen dieselben Berechnungen mit Daten desselben Formats durchführen. Diese Grafikkarte verfügt über mehr als 3.500 Module für vergleichbare Berechnungen, und obwohl ihre Taktfrequenz viel niedriger ist als im Zentralprozessor (1,5 GHz und 4,7 GHz), nimmt der Videoprozessor die Anzahl der Module auf.

Obwohl der Titan X keine Massengrafikkarte ist, wird selbst ein Budgetmodell jeden Zentralprozessor überholen. Daher sind alle 3D-Spiele und APIs für spezielle Geräte konzipiert. Sie können V-ray , 3DMark oder einen beliebigen Unigine- Benchmark herunterladen und testen Sie Ihr System - überzeugen Sie sich selbst, wie gut die Videoprozessoren für das Rendern von Grafiken in Spielen geeignet sind.

Letzte Worte


Es war ein kurzer Exkurs in den Prozess der Erstellung eines einzelnen Frames in 3D-Spielen, von einem Punkt im Raum bis zu einem farbenfrohen Bild auf einem Monitor.

Tatsächlich arbeitet der gesamte Prozess nur mit Zahlen. Vieles ist jedoch außerhalb des Geltungsbereichs des Artikels geblieben. Wir haben keine spezifischen mathematischen Berechnungen aus der euklidischen linearen Algebra, Trigonometrie und Differentialrechnung berücksichtigt, die von Vertex- und Pixel-Shadern durchgeführt wurden. Wir haben auch nicht darüber gesprochen, wie Texturen mithilfe statistischer Stichproben verarbeitet werden. Ich habe so coole visuelle Effekte wie das Blockieren des Umgebungslichts im Bildschirmbereich, das Reduzieren von Interferenzen mit der Strahlverfolgung, den erweiterten Dynamikbereich und die zeitliche Glättung weggelassen.

Und wenn Sie das nächste Mal ein modernes 3D-Spiel starten, hoffen wir, dass Sie die Grafiken nicht nur mit anderen Augen betrachten, sondern auch mehr darüber erfahren möchten.

All Articles