Categories: Sonstiges

Wie Sie einen Einstieg in die Arbeit mit Buffers in Direct3D 11 finden.

Eine Buffer Resource ist eine Sammlung von vollständig typisierten Daten, die in Elemente gruppiert sind. Sie können Buffer verwenden, um eine Vielzahl von Daten zu speichern, einschließlich Positionsvektoren, normale Vektoren, Texturkoordinaten in einem Vertex Buffer, Indizes in einem Index Buffer oder Gerätezustand. Ein Buffer-Element besteht aus 1 bis 4 Komponenten. Buffer-Elemente können gepackte Datenwert, einzelne 8-Bit Ganzzahlen oder vier 32-Bit Fließkommazahlen beinhalten.

Ein Buffer wird als unstrukturierte Resource angelegt. Da es unstrukturiert ist, kann ein Buffer keine Mipmap-Ebenen enthalten, beim Lesen nicht gefiltert und nicht mehrfach abgetastet werden.

Buffer-Typen.

Nachfolgend sind die von Direct3D unterstützten Buffer-Resources-Typen aufgeführt. Alle Buffer-Typen werden durch die ID3D11Buffer-Schnittstelle gekapselt.

Vertex Buffer.

Ein Vertex-Buffer enthält die Vertex-Daten, die zur Definition Ihrer Geometrie verwendet werden. Vertex-Daten beinhalten Positionskoordinaten, Farbdaten, Texturkoordinaten, normale Daten und so weiter.

Das einfachste Beispiel für einen Vertex Buffer ist eines, das nur Positionsdaten enthält.

Häufiger enthält ein Vertex-Buffer alle Daten, die benötigt werden, um 3D-Vertices vollständig zu spezifizieren. Ein Beispiel dafür könnte ein Node-Buffer sein, der Pro-Vertex-Positionen, Normal- und Texturkoordinaten enthält. Diese Daten sind in der Regel als Mengen von Per-Vertex-Elementen organisiert.

Dieser Vertex Buffer enthält Per-Vertex-Daten. Jeder Vertex speichert drei Elemente (Positions-, Normal- und Texturkoordinaten). Die Position und der Normalwert werden typischerweise jeweils durch drei 32-Bit-Floats (DXGI_FORMAT_R32G32B32_FLOAT) und die Texturkoordinaten durch zwei 32-Bit-Floats (DXGI_FORMAT_R32G32_FLOAT) angegeben.

Um auf Daten aus einem Vertex Buffer zugreifen zu können, müssen Sie wissen, auf welchen Vertex Sie zugreifen müssen, sowie die folgenden zusätzlichen Buffer-Parameter:

Offset – die Anzahl der Bytes vom Anfang des Buffers bis hin zu den Daten für den ersten Node. Sie können den Offset mit der Methode ID3D11DeviceContext:IASetVertexBuffers angeben.
BaseVertexLocation – die Anzahl der Bytes vom Offset bis zum ersten Node, der vom entsprechenden Draw-Aufruf verwendet wird.

Bevor Sie einen Vertex Buffer erstellen, müssen Sie sein Layout definieren, indem Sie eine ID3D11InputLayout-Schnittstelle erstellen. Dies geschieht durch Aufruf der Methode ID3D11Device::CreateInputLayout. Nachdem das Input-Layout-Objekt erstellt wurde, können Sie es an die Input-Assembler-Phase binden, indem Sie das ID3D11DeviceContext::IASetInputLayout aufrufen.

Um einen Vertex-Buffer zu erstellen, rufen Sie ID3D11Device::CreateBuffer auf.

Index Buffer.

Index Buffer enthalten ganzzahlige Offsets in Vertex-Buffern und werden verwendet, um Primitive effizienter darzustellen. Ein Index-Buffer enthält einen sequentiellen Satz von 16-Bit- oder 32-Bit-Indizes. Jeder Index wird verwendet, um einen Node in einem Node-Buffer zu identifizieren.

Die in einem Index-Buffer gespeicherten sequentiellen Indizes verfügen über die folgenden Parameter:

Offset – die Anzahl der Bytes von der Basisadresse des Index-Buffers. Der Offset wird an die Methode ID3D11DeviceContext::IASetIndexBuffer übergeben.
StartIndexLocation – spezifiziert das erste Index-Buffer-Element von der Basisadresse und dem im IASetIndexBuffer angegebenen Offset. Der Startpunkt wird der Methode ID3D11DeviceContext::DrawIndexed oder ID3D11DeviceContext::DrawIndexedInstanced übergeben und stellt den ersten zu rendernden Index dar.
IndexCount – die Anzahl der zu rendernden Indizes. Die Nummer wird der DrawIndexed-Methode übergeben.

Start des Index-Buffers = Index Buffer Basisadresse + Offset (Bytes) + StartIndexLocation * ElementSize (Bytes).

In dieser Berechnung ist ElementSize die Größe jedes Index-Buffer-Elements, die entweder zwei oder vier Bytes beträgt.

Um einen Index-Buffer zu erstellen, rufen Sie ID3D11Device::CreateBuffer auf.

Constant Buffer.

Ein konstanter Buffer ermöglicht es Ihnen, der Pipeline effizient Shader-Konstantendaten zur Verfügung zu stellen. Sie können einen konstanten Buffer verwenden, um die Ergebnisse der Stream-Ausgangsstufe zu speichern.

Jedes Element speichert eine 1:4-Komponentenkonstante, die durch das Format der gespeicherten Daten bestimmt wird. Um einen Shader-Konstanten-Buffer zu erstellen, rufen Sie ID3D11Device::CreateBuffer auf und geben Sie das Mitglied D3D11_BIND_CONSTANT_BUFFER des Enumeratyps D3D11_BIND_FLAG an.

Ein konstanter Buffer kann nur ein einziges Bind-Flag (D3D11_BIND_CONSTANT_BUFFER) verwenden, das nicht mit einem anderen Bind-Flag kombiniert werden kann. Um einen Shader-konstanten Buffer an die Pipeline zu binden, rufen Sie eine der folgenden Methoden auf: ID3D11DeviceContext::GSSetConstantBuffers, ID3D11DeviceContext::PSSetConstantBuffers, or ID3D11DeviceContext::VSSetConstantBuffers.

Um einen Shader-konstanten Buffer aus einem Shader zu lesen, verwenden Sie eine HLSL-Ladefunktion (z.B. Load). Jede Shaderstufe erlaubt bis zu 15 Shader-Constant-Buffer. Jeder Buffer kann bis zu 4.096 Konstanten aufnehmen.

Damit sind wir heute soweit mit unserem Beitrag zum Thema Buffer-Typen in Direct3D soweit durch. Wenn Sie noch Fragen oder Anregungen haben sollten, hinterlassen Sie uns unten einen Kommentar.

Vielen Dank für Ihren Besuch.

3DMaster