Freigeben über


2D-Grafiken für DirectX-Spiele

Wir besprechen die Verwendung von 2D-Bitmapgrafiken und -effekten sowie deren Verwendung in Ihrem Spiel.

2D-Grafiken sind eine Teilmenge von 3D-Grafiken, die mit 2D-Grundtypen oder Bitmaps umgehen. Im Allgemeinen verwenden sie keine Z-Koordinate in der Art und Weise, wie ein 3D-Spiel könnte, da das Spiel normalerweise auf die X-Y-Ebene beschränkt ist. Sie verwenden manchmal 3D-Grafiktechniken, um ihre visuellen Komponenten zu erstellen, und sie sind im Allgemeinen einfacher zu entwickeln. Wenn Sie noch nicht mit Spielen vertraut sind, ist ein 2D-Spiel ein guter Ausgangspunkt, und die Entwicklung von 2D-Grafiken ist ein guter Ort für Sie, um sich mit DirectX vertraut zu machen.

Sie können 2D-Spielegrafiken in DirectX entweder mit Direct2D oder Direct3D oder einer Kombination entwickeln. Viele der nützlicheren Klassen für die 2D-Spieleentwicklung befinden sich in Direct3D, z. B. der Sprite-Klasse. Direct2D ist ein Satz von APIs, die in erster Linie auf Benutzeroberflächen und Apps abzielen, die Unterstützung für das Zeichnen von Grundtypen erfordern (z. B. Kreise, Linien und flache Polygonformen). Im Hinblick darauf bietet es immer noch einen leistungsstarken und leistungsfähigen Satz von Klassen und Methoden zum Erstellen von Spielgrafiken, insbesondere beim Erstellen von Spielüberlagerungen, Schnittstellen und Heads-up-Displays (HUDs) – oder zum Erstellen einer Vielzahl von 2D-Spielen, von einfach bis relativ detailliert. Der effektivste Ansatz beim Erstellen von 2D-Spielen ist jedoch die Verwendung von Elementen aus beiden Bibliotheken, und das ist die Art und Weise, wie wir die Entwicklung von 2D-Grafiken in diesem Thema nähern werden.

Konzepte auf einen Blick

Vor dem Aufkommen moderner 3D-Grafiken und der Hardware, die es unterstützt, waren Spiele in erster Linie 2D, und viele ihrer Grafiktechniken haben das Verschieben von Speicherblöcken um sich herum beteiligt - in der Regel Arrays von Farbdaten, die in Pixel auf dem Bildschirm übersetzt oder auf dem Bildschirm in eine 1:1-Art transformiert würden.

In DirectX sind 2D-Grafiken Teil der 3D-Pipeline. Es gibt eine viel größere Vielfalt an Bildschirmauflösungen und Grafikhardware, und Ihre 2D-Grafikmodul muss diese ohne erhebliche Genauigkeitsänderung unterstützen können.

Im Folgenden finden Sie einige der grundlegenden Konzepte, mit denen Sie vertraut sein sollten, wenn Sie mit der Entwicklung von 2D-Grafiken beginnen.

  • Pixel und Rasterkoordinaten. Ein Pixel ist ein einzelner Punkt auf einer Rasteranzeige und verfügt über ein eigenes Koordinatenpaar (x, y), das seine Position auf der Anzeige angibt. (Der Begriff "Pixel" wird häufig austauschbar zwischen den physischen Pixeln verwendet, die die Anzeige und die adressierbaren Speicherelemente umfassen, die zum Speichern der Farb- und Alphawerte der Pixel verwendet werden, bevor sie an die Anzeige gesendet werden.) Das Raster wird von APIs als rechteckiges Raster von Pixelelementen behandelt, das häufig eine Übereinstimmung mit dem physischen Pixelraster einer Anzeige aufweist. Rasterkoordinatensysteme beginnen von oben links mit dem Pixel (0, 0) in der oberen linken Ecke des Rasters.
  • Bitmapgrafiken (manchmal als Rastergrafiken bezeichnet) sind Grafikelemente, die als rechteckiges Raster mit Pixelwerten dargestellt werden. Sprites - berechnete Pixelarrays, die unabhängig vom Raster verwaltet werden - sind eine Art von Bitmapgrafik, die häufig für die aktiven Zeichen oder hintergrundunabhängigen animierten Objekte in einem Spiel verwendet wird. Die verschiedenen Animationsframes für ein Sprite werden als Sammlungen von Bitmaps dargestellt, die als "Blätter" oder "Batches" bezeichnet werden. Hintergründe sind größere Bitmapobjekte, die die gleiche Auflösung oder größer als die des Bildschirmrasters sind und häufig als Hintergrund(n) für das Spielfeld eines Spiels dienen.
  • Vektorgrafiken sind Grafiken, die geometrische Grundtypen verwenden, z. B. Punkte, Linien, Kreise und Polygone zum Definieren von 2D-Objekten. Sie werden nicht als Arrays von Pixeln dargestellt, sondern als mathematische Formeln, die sie in einem 2D-Raum definieren. Sie haben nicht unbedingt eine 1:1-Übereinstimmung mit dem Pixelraster der Anzeige und müssen aus dem Koordinatensystem transformiert werden, in das Rasterkoordinatensystem der Anzeige gerendert werden.
  • Die Übersetzung erfolgt, wenn Sie einen Punkt oder Scheitelpunkt nehmen und seine neue Position im selben Koordinatensystem berechnen.
  • Die Skalierung erfolgt, wenn Sie ein Objekt um einen angegebenen Skalierungsfaktor vergrößern oder verkleinern. Mit einem Vektorbild verkleinern und vergrößern Sie dessen Komponentenvertices; mit einer Bitmap vergrößern Sie die Pixelelemente oder verringern sie. Bei Bitmapbildern verlieren Sie Pixeldaten, wenn das Bild verkleinern wird, und Sie vergrößern die einzelnen Pixel, wenn das Bild näher skaliert wird. Für letzteres können Sie Pixelfarbinterpolationsvorgänge wie bilineare Filterung verwenden, um die rauen Farbgrenzen zwischen den vergrößerten Pixeln zu glätten.
  • Drehung erfolgt, wenn Sie ein Objekt um eine angegebene Achse oder Achse drehen. Bei einem Vektorbild werden die Scheitelpunkte der Geometrie mit einer Drehungsmatrix multipliziert, um den gedrehten Scheitelpunkt zu erhalten; mit einem Bitmapbild können verschiedene Algorithmen verwendet werden, die jeweils mit einem geringeren oder größeren Genauigkeitsgrad in den Ergebnissen verwendet werden. Wie bei der Skalierung und Übersetzung gibt es APIs speziell für Drehvorgänge.
  • Die Transformation erfolgt, wenn Sie einen Punkt oder Scheitelpunkt in einem Koordinatensystem nehmen und den entsprechenden Punkt oder Scheitelpunkt in einem anderen Koordinatensystem berechnen. Dazu gehören Übersetzungen, Skalierung und Drehung sowie andere Koordinatenberechnungsvorgänge.
  • Wenn Sie Teile von Bitmaps oder Geometrien entfernen, die sich nicht im sichtbaren Bereich der Anzeige befinden oder von Objekten mit höherer Ansichtspriorität ausgeblendet werden.
  • Der Framepuffer ist ein Bereich im Arbeitsspeicher - häufig im Arbeitsspeicher der Grafikhardware selbst - die die endgültige Rasterkarte enthält, die Sie auf den Bildschirm zeichnen. Bei der Swapchain handelt es sich um eine Sammlung von Puffern, in denen Sie in einem Hintergrundpuffer zeichnen, und wenn das Bild fertig ist, "tauschen" Sie sie an der Vorderseite aus, und zeigen Sie es an.

Überlegungen zum Entwurf

Die Entwicklung von 2D-Grafiken ist eine hervorragende Möglichkeit, sich mit direct3D zu entwickeln, und ermöglicht Es Ihnen, mehr Zeit für andere wichtige Aspekte der Spieleentwicklung zu verbringen: Audio, Steuerelemente und die Spielmechanik.

Zeichnen Sie immer auf einen Hintergrundpuffer. Das direkte Zeichnen in den Framepuffer bedeutet, dass das Bild angezeigt wird, wenn das Signal für die Anzeige empfangen wird (in der Regel alle 1/60 Sekunden), auch wenn der Zeichnungsvorgang nicht abgeschlossen ist!

Entwerfen Sie Ihr Grafikmodul so, dass eine gute Auswahl an Auflösungen unterstützt wird, von 1024x600 bis 1920x1080 (oder höher). Ihr Publikum wird Ihnen danken, wenn Sie die native Auflösung ihres LCD-Monitors unterstützen, insbesondere bei 2D-Grafiken.

Großartige Grafiken sind Ihre größte Ressource, wenn es um visuelle Elemente geht. Ihre Bitmapgrafiken fehlen zwar möglicherweise an der 3D-fotorealistischen Visuellen mit den neuesten Shadermodellfeatures, aber große hochauflösende Grafiken können oft so viel oder mehr Stil und Persönlichkeit vermitteln – und mit weit weniger Leistungseinbußen.

Verweis