Einführung in Puffer in Direct3D 11

Eine Pufferressource ist eine Sammlung vollständig typisierter Daten, die in Elemente gruppiert sind. Sie können Puffer verwenden, um eine Vielzahl von Daten zu speichern, einschließlich Positionsvektoren, normaler Vektoren, Texturkoordinaten in einem Scheitelpunktpuffer, Indizes in einem Indexpuffer 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, darf ein Puffer keine Mipmapebenen enthalten, er kann beim Lesen nicht gefiltert werden und kann nicht mehrfach sampelt werden.

Puffertypen

Die folgenden Pufferressourcentypen werden von Direct3D 11 unterstützt. Alle Puffertypen werden von der ID3D11Buffer-Schnittstelle gekapselt.

Vertexpuffer

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

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

Abbildung eines Scheitelpunktpuffers, der Positionsdaten enthält

Häufiger enthält ein Scheitelpunktpuffer alle Daten, die zum vollständigen Angeben von 3D-Scheitelpunkten erforderlich sind. Ein Beispiel hierfür ist ein Scheitelpunktpuffer, der die Position pro Scheitelpunkt, normale Koordinaten und Texturkoordinaten enthält. Diese Daten sind in der Regel wie in der folgenden Abbildung dargestellt als Sätze von Pro-Scheitelpunkt-Elementen organisiert.

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

Dieser Scheitelpunktpuffer enthält Daten pro Scheitelpunkt. Jeder Scheitelpunkt speichert drei Elemente (Position, Normal und Texturkoordinaten). Die Position und die Normalität werden in der Regel mit drei 32-Bit-Gleitkomma (DXGI _ FORMAT _ R32G32B32 _ FLOAT) und den Texturkoordinaten mit zwei 32-Bit-Gleitkomma (DXGI _ FORMAT _ R32G32 _ FLOAT) angegeben.

Für den Zugriff auf Daten aus einem Scheitelpunktpuffer 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. Sie können den Offset mithilfe der ID3D11DeviceContext::IASetVertexBuffers-Methode angeben.
  • BaseVertexLocation: Die Anzahl der Bytes vom Offset bis zum ersten Scheitelpunkt, der vom entsprechenden Draw-Aufruf verwendet wird.

Bevor Sie einen Scheitelpunktpuffer erstellen, müssen Sie dessen Layout definieren, indem Sie eine ID3D11InputLayout-Schnittstelle erstellen. Dies erfolgt durch Aufrufen der ID3D11Device::CreateInputLayout-Methode. Nachdem das Eingabelayoutobjekt erstellt wurde, können Sie es an die Eingabeassembliererphase binden, indem Sie id3D11DeviceContext::IASetInputLayoutaufrufen.

Um einen Scheitelpunktpuffer zu erstellen, rufen Sie ID3D11Device::CreateBuffer auf.

Indexpuffer

Indexpuffer enthalten ganzzahlige Offsets in Scheitelpunktpuffer und werden verwendet, um Primitive 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 Scheitelpunktpuffer zu identifizieren. Ein Indexpuffer kann wie in der folgenden Abbildung visualisiert werden.

Abbildung eines Indexpuffers

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

Start des Indexpuffers = Basisadresse des Indexpuffers + Offset (Bytes) + StartIndexLocation * ElementSize (Bytes);

In dieser Berechnung ist ElementSize die Größe jedes Indexpufferelements, das entweder zwei oder vier Bytes beträgt.

Um einen Indexpuffer zu erstellen, rufen Sie ID3D11Device::CreateBuffer auf.

Konstantenpuffer

Mit einem Konstantenpuffer können Sie Shaderkonstantendaten effizient für die Pipeline bereitstellen. Sie können einen konstanten Puffer verwenden, um die Ergebnisse der Streamausgabephase zu speichern. Konzeptionell sieht ein konstanter Puffer wie ein Vertexpuffer mit einem einzelnen Element 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. Um einen Shaderkonstantenpuffer zu erstellen, rufen Sie ID3D11Device::CreateBuffer auf, und geben Sie den D3D11 _ BIND CONSTANT _ _ BUFFER-Member des D3D11 _ BIND FLAG-Enumerationstyps _ an.

Ein Konstantenpuffer kann nur ein einzelnes Bindungsflag (D3D11 _ BIND _ CONSTANT _ BUFFER) verwenden, das nicht mit einem anderen Bindungsflag kombiniert werden kann. Um einen Shaderkonstantenpuffer an die Pipeline zu binden, rufen Sie eine der folgenden Methoden auf: ID3D11DeviceContext::GSSetConstantBuffers, ID3D11DeviceContext::P SSetConstantBuffersoder ID3D11DeviceContext::VSSetConstantBuffers.

Um einen Shaderkonstantenpuffer aus einem Shader zu lesen, verwenden Sie eine HLSL-Ladefunktion (z.B. Laden). Jede Shaderstufe lässt bis zu 15 Shaderkonstantenpuffer zu. jeder Puffer kann bis zu 4.096 Konstanten enthalten.

Puffer