Freigeben über


Einführung zu Puffern

Eine Pufferressource ist eine Sammlung vollständig typisierter Daten, die in Elementen gruppiert sind. Puffer speichern Daten wie Texturkoordinaten in einem Vertexpuffer, Indizes in einem Indexpuffer, Shaderkonstantendaten in einem Konstantenpuffer, Positionsvektoren, normale Vektoren oder Gerätezustand.

Ein Pufferelement besteht aus 1 bis 4 Komponenten. Pufferelemente können gepackte Datenwerte (z. B. R8G8B8A8 Oberflächenwerte), einzelne 8-Bit-Ganzzahlen oder vier 32-Bit-Gleitkommawerte enthalten.

Ein Puffer wird als unstrukturierte Ressource erstellt. Da er unstrukturiert ist, kann ein Puffer keine Mipmap-Ebenen enthalten, er kann beim Lesen nicht gefiltert werden und kann nicht multisampelt werden.

Puffertypen

Nachfolgend sind die pufferressourcentypen aufgeführt, die von Direct3D 11 unterstützt werden.

Vertexpuffer

Ein Vertexpuffer enthält die Vertexdaten, die zum Definieren der Geometrie verwendet werden. Vertexdaten umfassen Positionskoordinaten, Farbdaten, Texturkoordinatendaten, normale Daten usw.

Das einfachste Beispiel für einen Vertexpuffer ist ein Puffer, der nur Positionsdaten enthält. Sie kann wie in der folgenden Abbildung dargestellt werden.

Abbildung eines Vertexpuffers, der Positionsdaten enthält

Häufiger enthält ein Vertexpuffer alle Daten, die zum vollständigen Angeben von 3D-Scheitelpunkten erforderlich sind. Ein Beispiel hierfür könnte ein Vertexpuffer sein, der pro Vertexposition, normale und Texturkoordinaten enthält. Diese Daten sind in der Regel als Gruppen von Vertexelementen angeordnet, wie in der folgenden Abbildung dargestellt.

Abbildung eines Scheitelpunktpuffers, der Positions-, Normal- und Texturdaten enthält

Dieser Vertexpuffer enthält Daten pro Scheitelpunkt; Jeder Vertex speichert drei Elemente (Position, Normal- und Texturkoordinaten). Die Position und die Normalität werden in der Regel mit drei 32-Bit-Floats und den Texturkoordinaten mit zwei 32-Bit-Floats angegeben.

Um auf Daten aus einem Vertexpuffer zuzugreifen, müssen Sie wissen, auf welchen Scheitelpunkt zugegriffen werden soll, sowie die folgenden zusätzlichen Pufferparameter:

  • Offset - die Anzahl der Bytes vom Anfang des Puffers bis zu den Daten für den ersten Scheitelpunkt.
  • BaseVertexLocation – die Anzahl der Bytes vom Offset bis zum ersten Scheitelpunkt, der vom entsprechenden Draw-Aufruf verwendet wird.

Bevor Sie einen Vertexpuffer erstellen, müssen Sie dessen Layout definieren. Nachdem das Eingabelayoutobjekt erstellt wurde, binden Sie es an die Eingabeassemblerphase (Input Assembler, IA).

Indexpuffer

Indexpuffer enthalten ganzzahlige Offsets in Vertexpuffer und werden verwendet, um Grundtypen effizienter zu rendern. Ein Indexpuffer enthält einen sequenziellen Satz von 16-Bit- oder 32-Bit-Indizes; Jeder Index wird verwendet, um einen Scheitelpunkt in einem Vertexpuffer zu identifizieren. Ein Indexpuffer kann wie die folgende Abbildung dargestellt werden.

Abbildung eines Indexpuffers

Die in einem Indexpuffer gespeicherten sequenziellen Indizes befinden sich mit den folgenden Parametern:

  • Offset - die Anzahl der Bytes aus der Basisadresse des Indexpuffers.
  • StartIndexLocation : Gibt das erste Indexpufferelement aus der Basisadresse und dem Offset an. Die Startposition stellt den ersten zu renderden Index dar.
  • IndexCount - die Anzahl der zu rendernden Indizes.

Anfang des Indexpuffers = Indexpufferbasisadresse + Offset (Bytes) + StartIndexLocation * ElementSize (Bytes);

In dieser Berechnung ist ElementSize die Größe jedes Indexpufferelements, das entweder zwei oder vier Byte ist.

Konstantenpuffer

Mit einem Konstantenpuffer können Sie die Daten von Shaderkonstanten effizient an die Pipeline übermitteln. Sie können einen Konstantenpuffer verwenden, um die Ergebnisse der Datenstromausgabestufe zu speichern. Konzeptionell sieht ein Konstantenpuffer wie ein Einelementvertexpuffer aus, wie in der folgenden Abbildung dargestellt.

Abbildung eines Shaderkonstantenpuffers

Jedes Element speichert eine 1:4-Komponentenkonstante, die durch das Format der gespeicherten Daten bestimmt wird.

Ein Konstantenpuffer kann nur ein einzelnes Bindungsflags verwenden, das nicht mit einem anderen Bindungsflaggen kombiniert werden kann.

Verwenden Sie eine HLSL-Ladefunktion, um einen Shaderkonstantenpuffer aus einem Shader zu lesen. Jede Shaderstufe ermöglicht bis zu 15 Shaderkonstantenpuffer; Jeder Puffer kann bis zu 4096 Konstanten enthalten.

Vertex- und Indexpuffer