Freigeben über


Einführung in Puffer

Eine Pufferressource ist eine Sammlung vollständig typierter Daten, gruppiert in Elemente. Puffer speichern Daten, z. B. Texturkoordinaten in einem Vertexpuffer, Indizes in einem Indexpuffer, Shaderkonstantendaten in einem Konstantenpuffer, Positionsvektoren, Normalvektoren 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 mit Positionsdaten

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

Abbildung eines Vertex-Puffers mit Positions-, Normal- und Texturdaten

Dieser Vertexpuffer enthält Daten pro Vertex; jeder speichert drei Elemente (Position, Normalen 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 welches Vertex 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 Vertex.
  • 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, ordnen Sie es der Input-Assembler-Stufe (IA) zu.

Indexpuffer

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

Illustration eines Indexpuffers

Die in einem Indexpuffer gespeicherten sequenziellen Indizes werden mit den folgenden Parametern angegeben.

  • 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 = Indexpuffer-Basisadresse + 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 Daten für Shaderkonstanten effizient an die Pipeline übermitteln. Sie können einen konstanten Puffer verwenden, um die Ergebnisse der Stream-Output-Stufe zu speichern. Konzeptionell sieht ein Konstanten-Puffer wie ein Ein-Element-Vertexpuffer aus, wie dies in der folgenden Abbildung dargestellt ist.

Abbildung eines Shader-Konstantenpuffers

Jedes Element speichert eine Konstante mit ein bis vier Komponenten, die durch das Format der gespeicherten Daten bestimmt wird.

Ein Konstantenpuffer kann nur eine einzelne Bindeflagge verwenden, die nicht mit einer anderen Bindeflagge 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