In diesem dritten Kapitel, in dem wir uns eingehender mit der Erstellung von 3D-Spielen befassen, konzentrieren wir uns darauf, was mit der 3D-Welt passieren kann, nachdem die Eckenverarbeitung abgeschlossen und die Szene gerastert wurde. Die Konfiguration ist einer der wichtigsten Schritte beim Rendering, obwohl alles, was passiert, die Farben eines zweidimensionalen Rasters aus farbigen Blöcken berechnet und geändert werden.

Viele der visuellen Effekte, die heute in Spielen zu sehen sind, hängen vom geschickten Einsatz von Texturen ab – ohne sie wären Spiele langweilig und leblos. Lassen Sie uns also den Sprung wagen und sehen, wie diese funktionieren!

Wie immer, wenn Sie nicht bereit sind, tief in Gewebe einzutauchen, keine Panik - Sie können loslegen 3D-Spielerstellung 101. Aber sobald Sie die Grundlagen hinter sich haben, lesen Sie weiter für unseren nächsten Blick auf die Welt der 3D-Grafik.

Fangen wir einfach an

Wählen Sie die meistverkauften 3D-Spiele der letzten 12 Monate und alle haben eines gemeinsam: Texturkarten (oder nur Texturen). Dies ist ein sehr gebräuchlicher Begriff, die meisten Leute werden bei Texturen dasselbe Bild erzeugen: ein einfaches, flaches Quadrat oder Rechteck, das ein Bild einer Oberfläche enthält (Gras, Stein, Metall, Kleidung, Gesicht usw.).

Aber wenn sie in mehreren Ebenen verwendet und mit komplexer Arithmetik zusammengesetzt werden, kann die Verwendung dieser grundlegenden Bilder in einer 3D-Szene erstaunlich realistische Bilder erzeugen. Um zu sehen, wie dies möglich ist, überspringen wir sie ganz und sehen, wie Objekte in der 3D-Welt ohne sie aussehen könnten.




Wie wir in früheren Artikeln gesehen haben, besteht die 3D-Welt aus Scheitelpunkten – einfachen Formen, die bewegt und dann eingefärbt werden. Diese werden dann verwendet, um die Primitive zu erstellen, die wiederum zu einem 2D-Pixelraster komprimiert werden. Da wir keine Texturen verwenden, müssen wir diese Pixel einfärben.



Eine verwendbare Methode heißt flache Beschattungbeinhaltet das Abrufen der Farbe des ersten Scheitelpunkts des Grundelements und die anschließende Verwendung dieser Farbe für alle Pixel im Raster, die unter die Form fallen. Es sieht aus wie das:




Offensichtlich ist dies keine realistische Teekanne, zumindest stimmt die Oberflächenfarbe nicht. Farben springen von einer Ebene zur nächsten, es gibt keinen fließenden Übergang. Eine Lösung für dieses Problem könnte darin bestehen, etwas namens . zu verwenden Gouraud-Beschattung.



Dies ist eine Operation, die die Farben der Scheitelpunkte nimmt und berechnet, wie sich die Farbe über die Oberfläche des Dreiecks ändert. Die verwendete Mathematik lineare InterpolationDas klingt zwar schick, aber in Wirklichkeit bedeutet es, dass die Mitte der Form eine Farbe zwischen 0,2 und 0,8 (d. h. 0,5) hat, wenn eine primitive Seite eine Farbe von 0,2 Rot und die andere Seite eine Farbe von 0,8 Rot hat.

Es ist relativ einfach und der Hauptvorteil ist die Geschwindigkeit. Viele frühe 3D-Spiele verwendeten diese Technik, weil die Hardware, die die Berechnungen durchführte, durch ihre Leistungsfähigkeit begrenzt war.




Aber selbst das hat seine Probleme, denn wenn ein Licht genau in die Mitte eines Dreiecks zeigt, können seine Scheitelpunkte (Scheitelpunkte) es möglicherweise nicht richtig erfassen. Dadurch können lichtbedingte Glanzlichter komplett übersehen werden.




Flat- und Gouraud-Schattierungen sind im Render-Arsenal enthalten, während die obigen Beispiele klare Kandidaten für die Verwendung von Texturen sind, um sie zu verbessern. Und um besser zu verstehen, was passiert, wenn eine Textur auf eine Oberfläche aufgetragen wird, gehen wir in die Vergangenheit zurück... zurück ins Jahr 1996.

Eine kurze Geschichte von Spielen und GPUs

Quake ist ein bahnbrechendes Spiel, das vor 23 Jahren veröffentlicht wurde id-Software. Es war zwar nicht das erste Spiel, das 3D-Polygone und -Texturen verwendet, um die Umgebung zu erstellen, aber es war eines der ersten, das sie alle so effektiv einsetzte.

Eine andere Sache, die er tat, war zu zeigen, was mit OpenGL gemacht werden kann (die Grafik-API war noch in der ersten Überarbeitung), und es trug auch viel dazu bei, das erste Grafikkartenprodukt zu verkaufen. Kommentar ve 3Dfx Vudu.

Im Vergleich zu heutigen Standards war Voodoo extrem einfach: keine Unterstützung für 2D-Grafiken, kein Vertex-Rendering und nur die Grundlagen des Pixel-Rendering. Es war immer noch eine Schönheit:

Es hatte einen ganzen Chip (TMU), um ein Pixel aus einer Textur zu erhalten und dann einen weiteren Chip (FBI), um es mit einem Pixel aus dem Raster zu mischen. Es könnte ein paar Extras wie Nebel- oder Transparenzeffekte machen, aber das war es fast.

Wenn wir einen Überblick über die Architektur hinter Design und Betrieb der Grafikkarte werfen, können wir sehen, wie diese Prozesse funktionieren.

Der FBI-Chip nimmt zwei Farbwerte und kombiniert sie; einer von ihnen kann ein Wert aus einer Textur sein. Der Sortierprozess ist mathematisch recht einfach, unterscheidet sich jedoch geringfügig zwischen dem, was genau gemischt wird, und der API, die zum Ausführen der Anweisungen verwendet wird.

was auch immer wir anschauen Direct3D-Angebote In Bezug auf Mischfunktionen und Mischoperationen können wir sehen, dass jedes Pixel zuerst mit einer Zahl zwischen 0,0 und 1,0 multipliziert wird. Dies bestimmt, wie viel von der Farbe des Pixels das endgültige Erscheinungsbild beeinflusst. Dann werden die beiden angepassten Pixelfarben addiert, subtrahiert oder dupliziert; In einigen Funktionen ist die Operation ein logischer Ausdruck, bei dem immer so etwas wie das hellste Pixel ausgewählt wird.

Das obige Bild ist ein Beispiel dafür, wie dies in der Praxis funktioniert; der für das linke Pixel verwendete Faktor Alpha Wert. Diese Nummer transparent Pixel.

Die restlichen Schritte beinhalten das Anwenden eines Nebelwertes (aus einer vom Programmierer erstellten Zahlentabelle, dann die gleiche Mischmathematik); einige Sichtbarkeits- und Transparenzprüfungen und Anpassungen durchführen; bevor die Farbe des Pixels endgültig in den Speicher der Grafikkarte geschrieben wird.

Warum Geschichtsunterricht? Trotz der relativen Einfachheit des Designs (insbesondere im Vergleich zu modernen Entwicklern) erklärt der Prozess die grundlegenden Grundlagen der Texturierung: Holen Sie sich einige Farbwerte und mischen Sie sie, damit die Modelle und Umgebungen so aussehen, wie sie in einer bestimmten Situation aussehen sollten.

Die heutigen Spiele tun all dies immer noch, der einzige Unterschied besteht in der Menge der verwendeten Texturen und der Komplexität der Mischberechnungen. Zusammen simulieren sie visuelle Effekte aus Filmen oder wie Licht mit verschiedenen Materialien und Oberflächen interagiert.

Die Grundlagen der Texturierung

Für uns ist eine Textur ein flaches 2D-Bild, das auf die Polygone angewendet wird, aus denen die 3D-Strukturen im angezeigten Rahmen bestehen. Für einen Computer ist es nichts anderes als ein kleiner Speicherblock in Form eines 2D-Arrays. Jeder Eintrag im Array repräsentiert einen Farbwert für eines der Pixel im Texturbild (besser bekannt) Textfüller - Texturpixel).

Jeder Scheitelpunkt in einem Polygon hat 2 Koordinaten (normalerweise sen, v) sagt Ihnen, welches Pixel in der Textur damit verbunden ist. Der Scheitelpunkt selbst hat 3 Koordinatensätze (X und Z) und der Prozess des Verbindens von Texten mit Scheitelpunkten wird aufgerufen. Textur-Mapping.

Um dies in Aktion zu sehen, kehren wir zu einem Tool zurück, das wir in dieser Artikelserie mehrmals verwendet haben: Echtzeit-Rendering WebGL Werkzeug. Zur Zeit, z Koordiniere von den Ecken und halte alles in einer flachen Ebene.

Von links nach rechts haben wir die Textur sen, v Koordinaten direkt auf Eckpunkte abgebildet x, y Koordinaten. Dann die oberen Ecken y Koordinaten haben zugenommen, aber die Textur wird nach oben gestreckt, da die Textur immer noch direkt auf sie abgebildet wird. Im Bild ganz rechts hat sich diesmal die Textur geändert: u Werte werden erhöht, dies führt jedoch dazu, dass das Gewebe gequetscht und dann rückfällig wird.

Denn das Gewebe ist jetzt effektiv länger, wenn auch höher u Der Wert muss in das Primitiv passen - im Wesentlichen wird die Textur teilweise wiederholt. Dies ist eine Möglichkeit, etwas zu tun, das in vielen 3D-Spielen zu sehen ist :twiederholen. Häufige Beispiele dafür finden sich in Szenen mit felsigen oder grasbewachsenen Landschaften oder Backsteinmauern.

Lassen Sie uns nun die Szene primitiver gestalten und die Tiefe wieder ins Spiel bringen. Was wir unten haben, ist eine klassische Landschaftsansicht, aber die Brusttextur wird kopiert und zwischen den Primitiven wiederholt.

Jetzt ist diese Brusttextur im Original-Gif-Format 66 Kilo schwer und hat eine Auflösung von 256 x 256 Pixel. Die ursprüngliche Auflösung des Teils des Frames, der von Crate-Texturen eingenommen wird, beträgt 1900 x 680, so dass in Bezug auf die Pixel-„Fläche“ dieser Bereich nur in der Lage sein sollte, 20 Crate-Texturen anzuzeigen.

Wir bekommen offensichtlich mehr als 20 Pfade, so viele Brusttexturen im Hintergrund sehr Kleiner als 256 x 256 Pixel. Tatsächlich sind sie es und sie haben einen Prozess durchlaufen Texturreduktion (Ja, das ist ein Wort!). Jetzt versuchen wir es noch einmal, aber diesmal ist es einer der Truhen nahe gekommen.

Beachten Sie, dass die Textur nur 256 x 256 Pixel groß ist, aber hier können wir sehen, dass eine Textur mehr als die Hälfte der Breite des 1900 Pixel breiten Bildes hat. Es ging durch etwas namens Textur Gewebevergrößerung.

Diese beiden Texturprozesse treten in 3D-Spielen ständig auf, da alle Texturen, die auf Primitive angewendet werden, zusammen mit den Polygonen skaliert werden müssen, wenn sich die Kamera in der Szene bewegt oder Modelle ein- und auszoomen. Mathematisch ist das keine große Sache, tatsächlich flashen selbst die einfachsten integrierten Grafikchips in einem solchen Geschäft. Die Gewebereduktion und -vergrößerung bringt jedoch neue Probleme mit sich, die irgendwie gelöst werden müssen.

Geben Sie Minitexturen ein

Das erste zu behebende Problem betrifft entfernte Texturen. Wenn wir uns das erste Kistenlandschaftsbild noch einmal ansehen, sind die zum Horizont hin nur wenige Pixel groß. Der Versuch, ein 256 x 256 Pixel großes Bild auf so kleinem Raum zu quetschen, ist aus zwei Gründen sinnlos.

Zum einen benötigt eine kleinere Textur weniger Speicherplatz auf der Grafikkarte, was nützlich ist, um eine kleine Menge Cache unterzubringen. Dies bedeutet, dass es weniger wahrscheinlich ist, dass sie aus dem Cache entfernt wird und die wiederholte Verwendung dieser Textur den vollen Leistungsvorteil der Daten nutzt, die sich im nahegelegenen Speicher befinden. Der zweite Grund, warum wir für einen Moment hier sind, ist mit dem gleichen Problem für gezoomte Texturen verbunden.

Eine gängige Lösung für die Verwendung großer Texturen, die in kleine Primitive zerkleinert werden, Passende. Dies sind verkleinerte Versionen der Originaltextur; Die Spiel-Engine selbst kann erstellt werden (mit dem entsprechenden API-Befehl) oder von Spieldesignern vorgefertigt werden. Jede Mipmap-Texturebene hat die Hälfte der linearen Dimensionen der vorherigen.

Für die Brusttextur wäre es etwa: 256 x 256 → 128 x 128 → 64 x 64 → 32 x 32 → 16 x 16 → 8 x 8 → 4 x 4 → 2 x 2 → 1 x 1.

Die Mipmaps sind alle gebündelt, sodass die Textur immer noch den gleichen Dateinamen hat, aber jetzt größer. Das Gewebe ist so verpackt, dass sen, v Seine Koordinaten bestimmen nicht nur, welches Texel auf ein Pixel im Frame angewendet wird, sondern auch von welcher Mipmap. Programmierer codieren dann den Renderer, um die zu verwendende Mipmap basierend auf dem Tiefenwert des quadratischen Pixels zu bestimmen. Wenn er also zu hoch ist, ist das Pixel weit entfernt, sodass eine kleine Mipmap verwendet werden kann.

Leser mit scharfen Augen haben vielleicht die Kehrseite von Mipmaps gesehen, und dies geht auf Kosten größerer Texturen. Die ursprüngliche Brusttextur war 256 x 256 Pixel, aber wie Sie im Bild oben sehen können, ist die Mipmap-Textur jetzt 384 x 256 Pixel groß. Ja, es gibt viel freien Speicherplatz, aber die Gesamterhöhung auf mindestens eine der Texturgrößen beträgt 50 %, unabhängig davon, wie Sie kleinere Texturen packen.

Dies gilt jedoch nur für vorgefertigte Mipmaps; Wenn die Spiel-Engine so programmiert wurde, dass sie richtig generiert wird, kann die Vergrößerung nie mehr als 33% der ursprünglichen Texturgröße betragen. So erhalten Sie Leistungsvorteile und visuelle Verbesserungen für einen relativ geringen Speicherzuwachs bei Textur-Mipmaps.

Unten ist der Aus/Ein-Vergleich von Textur-Mipmaps:

Auf der linken Seite des Bildes werden Kistentexturen 'wie besehen' verwendet, was zu einem körnigen Erscheinungsbild führt und angeblich Moiré-Muster Weg. Auf der rechten Seite führt die Verwendung von Mipmaps jedoch zu einem viel sanfteren Übergang über die Landschaft, wo die Textur der Kiste am Horizont in eine einheitliche Farbe wechselt.

Aber wer will schon verschwommene Texturen, die den Hintergrund seines Lieblingsspiels verderben?

Bilinear, trilinear, anisotrop - für mich alles griechisch

Das Auswählen von Pixeln aus einer Textur, die auf ein Pixel in einem Frame angewendet werden sollen, wird als . bezeichnet Textur-Samplingund in einer perfekten Welt ihre Größe, Lage, Richtung usw. Unabhängig davon wäre es eine Textur, die genau zum Primitiv passt. Mit anderen Worten, Textur-Sampling ist nichts anderes als ein flaches 1-zu-1-Pixel-zu-Pixel-Mapping.

Da dies nicht der Fall ist, müssen beim Textur-Sampling eine Reihe von Faktoren berücksichtigt werden:

  • Ist die Textur vergrößert oder verkleinert?
  • Ist die Textur original oder eine Mipmap?
  • In welchem ​​Winkel wird die Textur angezeigt?

Lassen Sie uns sie einzeln analysieren. Das erste ist klar genug: Wenn die Textur vergrößert wird, wird mehr Text das Pixel im Primitiv überlagern; beim Verkleinern ist es umgekehrt, jedes Texel muss sich nun über mehr als ein Pixel erstrecken. Dies ist ein kleines Problem.

Zweitens, da Mipmaps verwendet werden, um das Problem des Textursamplings mit entfernten Primitiven zu umgehen, werden die Texturen in einem Winkel belassen. Und ja, das ist auch ein Problem. Warum das? Da alle Texturen für eine Ansicht „geöffnet“ gerendert werden oder alle mathematisch sind: Die Normale der Texturoberfläche ist dieselbe wie die Oberflächennormale, die über der Textur angezeigt wird.

Um daher zu wenig oder zu viel Textur und Textur in einem Winkel zu haben, Texturfilterung. Wenn Sie diese Aktion nicht verwenden, erhalten Sie Folgendes:

Hier haben wir die Brusttextur durch eine R-Buchstabentextur ersetzt, um deutlicher zu zeigen, wie viel Durcheinander es ohne Texturfilterung geben wird!

Grafik-APIs wie Direct3D, OpenGL und Vulkan bieten alle die gleichen Arten der Bereichsfilterung, verwenden jedoch unterschiedliche Namen dafür. Eigentlich geht das alles so:

  • Abtastung am nächsten Punkt
  • Lineare Texturfilterung
  • Anisotrope Texturfilterung

Im Grunde, Probenahme am nächsten Punkt Wenn es nicht filtert, liegt es daran, dass es das dem Pixel am nächsten liegende Pixel ist, das erfordert, dass die Texturen abgetastet (d. h. aus dem Speicher kopiert) und dann mit der Originalfarbe des Pixels gemischt werden.

Hier hilft die lineare Filterung. Erforderlich sen, v Texel-Koordinaten werden zum Sampling an die Hardware gesendet, aber anstatt das Texel zu erhalten, das diesen Koordinaten am nächsten kommt, wird der Sampler vier Texel Diese befinden sich direkt über, unter, links und rechts von dem, der unter Verwendung der nächstgelegenen Punktabtastung ausgewählt wurde.

Diese 4 Textilien werden dann nach einer gewichteten Formel gemischt. In Vulkan lautet die Formel beispielsweise:

T "Farbe", f Für die entwässerten und von 1 bis 4 werden vier Textilien bemustert. Werte Alpha ve Beta wie weit von dem durch . definierten Punkt entfernt sen, v Koordinaten kommen aus der Mitte des Gewebes.

Glücklicherweise passiert jeder, der an 3D-Spielen beteiligt ist, egal ob er Spiele spielt oder macht, automatisch auf diesem Grafikprozessor. Tatsächlich hat der TMU-Chip in 3dfx Voodoo dies getan: Er tastete 4 Singletons ab und mischte sie dann. Direct3D nennt das seltsam bilineare Filterung, aber seit der Zeit von Quake und Voodoos TMU-Chip können Grafikkarten nur in einem Taktzyklus bilineare Filterung durchführen (wenn die Textur natürlich bequem im Nahspeicher sitzt).

Lineares Filtern kann neben Mipmaps verwendet werden und wenn Sie mit Ihrer Filterung wirklich ausgefallen sein möchten, können Sie 4 Texte aus einer Textur nehmen, dann weitere 4 aus der nächsten Mipmap-Ebene und diese dann zusammenführen. Und der Name Direct3D dafür? trilinear Filterung. Was tri über diesen Prozess? Ihre Vermutung ist so gut wie unsere...

Die zuletzt erwähnte Filtermethode heißt anizotrop. Dies ist eigentlich eine Anpassung an den Prozess, der bei der bilinearen oder trilinearen Filterung durchgeführt wird. Anfänglich Grad der Anisotropie primitive Oberfläche (und überraschend komplex) - dieser Wert ändert das Seitenverhältnis des Primitivs aufgrund seiner Ausrichtung:

Das obige Bild zeigt dasselbe quadratische Grundelement mit gleich langen Seiten; aber wenn wir uns von unserer Perspektive entfernen, sieht es aus wie ein quadratisches Rechteck und seine Breite nimmt über seine Höhe zu. Das rechte Primitiv hat also eine größere Anisotropie als das linke (und beim Quadrat ist der Grad genau null).

Bei den meisten heutigen 3D-Spielen können Sie die anisotrope Filterung aktivieren und dann die Stufe (1x bis 16x) anpassen, aber was ändert das tatsächlich? Die Einstellung steuert die maximale Anzahl zusätzlicher Texel-Abtastwerte, die pro ursprünglichem linearen Abtastwert genommen werden. Nehmen wir zum Beispiel an, das Spiel ist so eingestellt, dass es 8x anisotrope bilineare Filterung verwendet. Dies bedeutet, dass 32 Werte zurückgegeben werden, anstatt nur 4 Textwerte zu verwenden.

Es ist klar, dass die Verwendung von anisotroper Filterung Folgendes realisieren kann:

Scrollen Sie einfach ein wenig nach oben und vergleichen Sie die Abtastung am nächsten Punkt für maximal 16-fache anisotrope trilineare Filterung. So glatt, fast lecker!

Aber es muss einen Preis für all diesen schönen butterartigen Texturgeschmack geben, und es ist definitiv die Leistung: Alle maximalen, anisotropen trilinearen Filterungen geben 128 Samples einer Textur für jedes gerenderte Pixel zurück. Selbst bei den besten der neuesten GPUs ist dies nicht in einem einzigen Taktzyklus möglich.

Wenn wir so etwas wie AMD bekommen Radeon RX 5700 XTDie Textureinheiten innerhalb des Prozessors können jeweils 32 Texeladressen in einem Taktzyklus ausschalten, dann 32 Texel aus dem Speicher (je 32 Bits groß) in einem anderen Taktzyklus laden und dann 4 davon zum Markieren zusammenfügen. Aus diesem Grund wird es für 128 Texel-Instanzen gemischt, die mindestens 16 Taktzyklen benötigen.

Der Basistakt der 5700 XT beträgt jetzt 1605 MHz, sechzehn Zyklen dauern also nur 10 Nanosaniye. Tun Sie dies einfach für jedes Pixel im 4K-Frame. einer Gewebeeinheit würde immer noch nur 70 Millisekunden dauern. Ok, vielleicht ist die Leistung nicht so wichtig!

Schon 1996 waren 3Dfx Voodoo ziemlich geschickt, wenn es um den Umgang mit Texturen ging. Es konnte maximal 1 bilinear gefiltertes Texel pro Taktzyklus erreichen und bedeutete, dass jede Sekunde 50 Millionen Tex geschnitten werden konnten, während der TMU-Chip mit 50 MHz schwingte. Ein Spiel mit 800 x 600 und 30 Bildern pro Sekunde benötigt nur 14 Millionen bilinear gefilterten Text pro Sekunde.

All dies setzt jedoch voraus, dass sich die Texturen im nahegelegenen Speicher befinden und jedem Pixel nur ein Tex zugeordnet ist. Vor zwanzig Jahren war die Idee, mehrere Texturen auf eine Richtlinie anwenden zu müssen, fast völlig fremd, aber jetzt ist es alltäglich. Sehen wir uns an, warum diese Änderung aufgetreten ist.

Den Weg zu atemberaubenden Bildern erhellen

Um zu verstehen, wie wichtig das Weben wurde, sehen Sie sich diese Szene aus Quake an:

Es ist ein dunkles Bild, das war die Natur dieses Spiels, aber Sie können sehen, dass die Dunkelheit nicht überall gleich ist - Teile von Wänden und Böden sind heller als andere, um in diesem Bereich ein Gefühl der Allgemeinbeleuchtung zu vermitteln.

Die Grundelemente, aus denen die Seiten und der Boden bestehen, haben dieselbe Textur, aber es gibt eine zweite Textur namens Lichtkartewird mit Texelwerten gemischt, bevor er mit quadratischen Pixeln abgeglichen wird. In den Tagen von Quake wurden Lightmaps vorberechnet und von der Spiel-Engine erstellt und verwendet, um statische und dynamische Lichtpegel zu erzeugen.

Der Vorteil ihrer Verwendung bestand darin, dass komplexe Beleuchtungsberechnungen auf Texturen statt auf Ecken durchgeführt wurden, was insbesondere das Aussehen einer Szene verbesserte und sehr geringe Leistungskosten verursachte. Es ist offensichtlich nicht perfekt: Wie man am Boden sehen kann, ist die Grenze zwischen den beleuchteten Bereichen und denen im Schatten sehr klar.

In vielerlei Hinsicht ist eine leichtgewichtige Karte nur eine weitere Textur (denken Sie daran, dass sie alle nichts anderes als 2D-Datenarrays sind), also betrachten wir hier eine frühe Verwendung dessen, was als bekannt ist Multitextur. Wie der Name schon sagt, handelt es sich um einen Prozess, bei dem zwei oder mehr Texturen auf ein Prinzip angewendet werden. Die Verwendung von leichtgewichtigen Karten in Quake war eine Lösung, um die Einschränkungen von Gouraud-Shading zu überwinden, aber mit den Möglichkeiten der Grafikkarten wuchsen auch Multithread-Anwendungen.

3Dfx Voodoo war, wie andere Karten seiner Zeit, in seiner Leistung in einem Render begrenzt bestehen. Dies ist im Wesentlichen eine vollständige Rendersequenz: vom Rendern der Ecken über das Rastern des Frames bis hin zum Ändern der Pixel in einen endgültigen Framebuffer. Vor zwanzig Jahren führten Spiele fast immer einen Durchgang aus.

Dies lag daran, dass das zweimalige Rendern der Scheitelpunkte in Bezug auf die Leistung sehr kostspielig war, da Sie nur mehr Textur anwenden wollten. Einige Jahre nach Voodoo mussten wir warten, bis es verfügbar war, bevor wir Multi-Thread-Grafikkarten von ATI Radeon und Nvidia GeForce 2 in einem einzigen Renderdurchgang herstellen konnten.

Diese GPUs hatten mehrere Textureinheiten pro Pixel-Rendering-Abschnitt (d. h. Rohrleitung), so dass ein bilineares gefiltertes Texel aus zwei getrennten Geweben ein Kinderspiel war. Dies machte das Licht-Mapping noch beliebter, sodass Spiele vollständig dynamisch sind und die Lichtwerte basierend auf Änderungen in der Spielumgebung geändert werden.

Aber es gibt noch so viel mehr, was mit mehreren Texturen gemacht werden kann, also lasst uns einen Blick darauf werfen.

Es ist normal, die Höhe zu multiplizieren

In dieser Artikelserie zum Thema 3D-Rendering haben wir noch nicht darauf eingegangen, wie die Rolle der GPU wirklich auf den Punkt passt (das werden wir noch nicht!). Aber wenn du zurückkommst Episode 1Wenn Sie sich all die komplexen Arbeiten rund um das Vertex-Rendering ansehen, denken Sie vielleicht, dass dies der schwierigste Teil des gesamten Arrays für die GPU ist.

Es ist schon lange her, und Spieleprogrammierer haben ihr Bestes getan, um diesen Arbeitsaufwand zu reduzieren. Dies bedeutete, dass man an die Tasche der visuellen Tricks gelangte und so viele Verknüpfungen und Cheats wie möglich herauszog, um das gleiche visuelle Erscheinungsbild zu erhalten, in dem viele Scheitelpunkte überall verwendet wurden, aber nicht so viele davon zum Starten verwendet wurden.

Und die meisten dieser Tricks, Höhenkarten ve normale Karten. Die beiden hängen damit zusammen, dass die zweite aus der ersten erstellt werden kann, aber jetzt schauen wir uns nur eine Technik namens an: Bump-Mapping.

Beim Bump-Mapping wird ein 2D-Array namens Heightmap verwendet, das wie eine einzelne Version der Originaltextur aussieht. Das obige Bild hat beispielsweise eine realistische Ziegelstruktur, die auf 2 ebene Oberflächen angewendet wurde. Die Textur und Heightmap sieht so aus:

Die Farben der Heightmap stellen die Normalen der Ziegeloberfläche dar (wir haben behandelt, was die Normale ist Episode 1 dieser Artikelserie). Wenn die Rendersequenz den Punkt erreicht, an dem die Ziegelsteintextur auf die Oberfläche aufgetragen wird, wird eine Reihe von Berechnungen durchgeführt, um die Farbe der Ziegelsteintextur auf Normal anzupassen.

Als Ergebnis sehen die Steine ​​mehr 3D aus, obwohl sie immer noch perfekt flach sind. Vor allem wenn man sich die Kanten der Steine ​​genau anschaut, erkennt man die Grenzen der Technik: Die Textur wirkt etwas verzogen. Aber für einen schnellen Trick, um einer Oberfläche mehr Details hinzuzufügen, ist das Bump-Mapping sehr beliebt.

Eine Normalkarte ist wie eine Höhenkarte, aber die Farben dieser Textur sind die Normalen selbst. Mit anderen Worten, es ist keine Berechnung erforderlich, um die Höhenkarte in die Normale umzuwandeln. Sie fragen sich vielleicht, wie Farben verwendet werden können, um einen Pfeil im Raum darzustellen. Die Antwort ist einfach: Jedes Texel hat ein spezifisches R, G, B Werte (rot, grün, blau) und diese Zahlen sind direkt X und Z Werte für den Normalenvektor.

Im obigen Beispiel zeigt das linke Diagramm, wie sich die Richtung der Normalen auf einer rauen Oberfläche ändert. Um die gleichen Normalen in einer flachen Textur darzustellen (mittleres Diagramm), weisen wir ihnen eine Farbe zu. In unserem Fall, R, G, B Erhöhen der Werte (0,255,0) für gerade und dann die Rotanteile für links und Blau für rechts.

Beachten Sie, dass diese Farbe nicht mit dem Originalpixel gemischt wird - sie teilt dem Prozessor mit, in welche Richtung die Normale zeigt, damit die Kamera die Winkel zwischen den Lichtern und der strukturierten Oberfläche korrekt berechnen kann.

Die Vorteile von Bump- und Normal-Mapping kommen wirklich zum Tragen, wenn dynamische Beleuchtung in einer Szene verwendet wird und der Rendering-Prozess die Auswirkungen von Lichtänderungen pro Pixel und nicht pro Ecke berechnet. Moderne Spiele verwenden jetzt eine Reihe von Texturen, um die Qualität der ausgeführten Magie zu verbessern.

Diese realistisch aussehende Wand ist unglaublich einfach nur eine ebene Fläche - die Details über die Ziegel und Mörtel wurden nicht mit Millionen von Polygonen erstellt. Stattdessen macht es nur 5 Texturen und viel clevere Mathematikarbeit.

Die Höhenkarte wurde verwendet, um die Normalkarte zu erstellen, um zu simulieren, wie die Ziegel Schatten auf sich selbst werfen und kleinere Änderungen an der Oberfläche. Die Rauheitstextur wurde verwendet, um zu ändern, wie Licht verschiedene Elemente der Wand reflektiert (z. B. ein abgeflachter Ziegelstein reflektiert gleichmäßiger als rauer Mörtel).

Die letzte Karte, im obigen Bild mit AO bezeichnet, ist Teil eines Prozesses namens Ambient Occlusion: eine Technik, die wir in einem späteren Artikel genauer betrachten werden, aber vorerst nur Schatten.

Textur-Mapping ist entscheidend

Texturen sind für das Spieldesign absolut unerlässlich. Holen Sie sich die 2019-Version von Warhorse Studio Das Königreich kommt: Erlösung - Ein First-Person-Rollenspiel im Böhmen des 15. Jahrhunderts, einem alten Land in Mittelosteuropa. Den Designern ging es darum, eine möglichst realistische Welt für den jeweiligen Zeitraum zu schaffen. Und der beste Weg, um den Spieler in ein Leben vor Hunderten von Jahren einzutauchen, jede Landschaftsansicht, jedes Gebäude, jedes Kleidungsset, jedes Haar, alltägliche Gegenstände usw. Es ging um das richtige Aussehen.

Jede einzigartige Textur in diesem einzelnen Bild im Spiel wird von den Künstlern erstellt und von der von den Programmierern gesteuerten Render-Engine verwendet. Einige sind klein, haben grundlegende Details und nehmen wenig an Filtern oder Bearbeiten anderer Texturen (zB Hühnerflügel).

Andere sind hochauflösend und zeigen viele feine Details; anisotrop gefiltert und mit Normal Maps und anderen Texturen vermischt - schauen Sie sich nur das Gesicht des Mannes im Vordergrund an. Die unterschiedlichen Anforderungen an die Texturierung jedes Elements in der Szene werden von den Programmierern erklärt.

All dies geschieht jetzt in vielen Spielen, da die Spieler mehr Details und Realismus erwarten. Texturen werden wachsen und mehr auf einer Oberfläche verwendet werden, aber der Prozess des Sampling von Text und dessen Anwendung auf Pixel wird im Wesentlichen der gleiche sein wie in den Tagen von Quake. Die beste Technologie, egal wie alt, stirbt nie!