Ressourcentypen (Direct3D 10)

Alle von der Direct3D-Pipeline verwendeten Ressourcen stammen von zwei grundlegenden Ressourcentypen ab: Puffern und Texturen. Ein Puffer ist eine Sammlung von Rohdaten (Elementen); eine Textur ist eine Sammlung von Texels (Texturelementen).

Es gibt zwei Möglichkeiten, das Layout (oder den Arbeitsspeicherbedarf) einer Ressource vollständig anzugeben:

Element BESCHREIBUNG
Typisierte
Geben Sie den Typ vollständig an, wenn die Ressource erstellt wird.
Typenloses
Geben Sie den Typ vollständig an, wenn die Ressource an die Pipeline gebunden ist.

 

Pufferressourcen

Eine Pufferressource ist eine Sammlung vollständig typisierter Daten. intern enthält ein Puffer Elemente. Ein Element besteht aus 1 bis 4 Komponenten. Beispiele für Elementdatentypen sind: ein gepackter Datenwert (wie R8G8B8A8), eine einzelne 8-Bit-Ganzzahl, vier 32-Bit-Floatwerte. Diese Datentypen werden verwendet, um Daten zu speichern, z. B. einen Positionsvektor, einen normalen Vektor, eine Texturkoordinate in einem Vertexpuffer, einen Index in einem Indexpuffer oder den Gerätezustand.

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

Puffertypen

Vertexpuffer

Ein Puffer ist eine Auflistung von Elementen. ein Vertexpuffer enthält Vertexdaten pro Vertex. Das einfachste Beispiel ist ein Vertexpuffer, der einen Datentyp enthält, z. B. Positionsdaten. 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 könnte ein Vertexpuffer sein, der die Position pro Vertex, Normal- und Texturkoordinaten enthält. Diese Daten werden normalerweise als Sätze von Elementen pro Vertex organisiert, wie in der folgenden Abbildung gezeigt.

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

Dieser Vertexpuffer enthält Vertexdaten für acht Scheitelpunkte; Jeder Scheitelpunkt speichert drei Elemente (Positions-, Normal- und Texturkoordinaten). Die Position und normal werden in der Regel mit drei 32-Bit-Floats (DXGI_FORMAT_R32G32B32_FLOAT) und die Texturkoordinaten mit zwei 32-Bit-Floats (DXGI_FORMAT_R32G32_FLOAT) angegeben.

Um auf Daten aus einem Scheitelpunktpuffer zuzugreifen, müssen Sie wissen, auf welchen Scheitelpunkt zugegriffen werden soll, und diese anderen Pufferparameter:

  • Offset: Die Anzahl der Bytes vom Start des Puffers bis zu den Daten für den ersten Scheitelpunkt. Der Offset wird für IASetVertexBuffers bereitgestellt.
  • BaseVertexLocation: Die Anzahl der Bytes vom Offset bis zum ersten Scheitelpunkt, der vom entsprechenden Draw-Aufruf verwendet wird (siehe Draw-Methoden).

Bevor Sie einen Vertexpuffer erstellen, müssen Sie dessen Layout definieren, indem Sie ein Eingabelayoutobjekt erstellen. Dies geschieht durch Aufrufen von CreateInputLayout. Nachdem das Eingabelayoutobjekt erstellt wurde, binden Sie es an die Input-Assembler-Phase, indem Sie IASetInputLayout aufrufen.

Rufen Sie CreateBuffer auf, um einen Vertexpuffer zu erstellen.

Indexpuffer

Ein Indexpuffer enthält einen sequenziellen Satz von 16- oder 32-Bit-Indizes. Jeder Index wird verwendet, um einen Scheitelpunkt in einem Scheitelpunktpuffer zu identifizieren. Die Verwendung eines Indexpuffers mit mindestens einem Scheitelpunktpuffer zum Bereitstellen von Daten an die IA-Phase wird als Indizierung bezeichnet. 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:

  • Offset: Die Anzahl der Bytes vom Anfang des Puffers bis zum ersten Index. Der Offset wird an IASetIndexBuffer bereitgestellt.
  • StartIndexLocation : Die Anzahl der Bytes vom Offset bis zum ersten Scheitelpunkt, der vom entsprechenden Draw-Aufruf verwendet wird (siehe Draw-Methoden).
  • IndexCount: Die Anzahl der zu rendernden Indizes.

Um einen Indexpuffer zu erstellen, rufen Sie CreateBuffer auf.

Ein Indexpuffer kann mehrere Linien- oder Dreiecksstreifen zusammenfügen, indem jeder durch einen Streifenschnittindex getrennt wird. Mit einem Streifenschnittindex können mehrere Linien- oder Dreiecksstreifen mit einem einzelnen Zeichnungsaufruf gezeichnet werden. Ein Strip-Cut-Index ist einfach der maximal mögliche Wert für den Index (0xffff für einen 16-Bit-Index, 0xffffffff für einen 32-Bit-Index). Der Strip-Cut-Index setzt die Wickelreihenfolge in indizierten Grundtypen zurück und kann verwendet werden, um die Notwendigkeit für entartete Dreiecke zu entfernen, die andernfalls erforderlich sind, um eine ordnungsgemäße Wicklungsreihenfolge in einem Dreiecksstreifen aufrechtzuerhalten. Die folgende Abbildung zeigt ein Beispiel für einen Strip-Cut-Index.

Abbildung eines Strip-Cut-Index

Konstantpuffer

Direct3D 10 führte einen neuen Puffer zum Bereitstellen von Shaderkonstanten ein, der als Shaderkonstantenpuffer oder einfach als Konstantenpuffer bezeichnet wird. Konzeptionell sieht es wie ein Vertexpuffer mit einem einzelnen Element aus, wie in der folgenden Abbildung gezeigt.

Abbildung eines Shaderkonstantenpuffers

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

Konstantenpuffer reduzieren die bandbreite, die zum Aktualisieren von Shaderkonstanten erforderlich ist, indem Shaderkonstanten gruppiert und gleichzeitig committet werden können, anstatt einzelne Aufrufe auszuführen, um jede Konstante separat zu commiten.

Um einen Shaderkonstantenpuffer zu erstellen, rufen Sie CreateBuffer auf, und geben Sie das D3D10_BIND_CONSTANT_BUFFER -Bindungsflag für Konstantenpuffer an (siehe D3D10_BIND_FLAG).

Um einen Shaderkonstantenpuffer an die Pipeline zu binden, rufen Sie eine der folgenden Methoden auf: GSSetConstantBuffers, PSSetConstantBuffers oder VSSetConstantBuffers.

Beachten Sie, dass bei Verwendung der ID3D10Effect-Schnittstelle der Prozess zum Erstellen, Binden und Comitieren eines Konstantenpuffers von der ID3D10Effect-Schnittstelle instance verarbeitet wird. In diesem Fall ist es nur neszenär, die Variable aus dem Effekt mit einer der GetVariable-Methoden wie GetVariableByName abzurufen und die Variable mit einer der SetVariable-Methoden wie SetMatrix zu aktualisieren. Ein Beispiel für die Verwendung der ID3D10Effect-Schnittstelle zum Verwalten eines Konstantenpuffers finden Sie in Tutorial 07.

Ein Shader liest Variablen in einem Konstantenpuffer weiterhin direkt nach Variablennamen auf die gleiche Weise, wie Variablen gelesen werden, die nicht Teil eines Konstantenpuffers sind.

Jede Shaderstufe ermöglicht bis zu 15 Shaderkonstantenpuffer; Jeder Puffer kann bis zu 4096 Konstanten aufnehmen.

Verwenden Sie einen konstanten Puffer, um die Ergebnisse der Streamausgabephase zu speichern.

Ein Beispiel zum Deklarieren eines Konstantenpuffers in einem Shader finden Sie unter Shaderkonstanten (DirectX HLSL).

Texturressourcen

Eine Texturressource ist eine strukturierte Sammlung von Daten zum Speichern von Texels. Im Gegensatz zu Puffern können Texturen nach Textur-Samplern gefiltert werden, da sie von Shadereinheiten gelesen werden. Die Art der Textur wirkt sich auf die Filterung der Textur aus. Ein Texel stellt die kleinste Einheit einer Textur dar, die von der Pipeline gelesen oder geschrieben werden kann. Jedes Texel enthält 1 bis 4 Komponenten, die in einem der DXGI-Formate angeordnet sind (siehe DXGI_FORMAT).

Texturen werden als strukturierte Ressource erstellt, sodass ihre Größe bekannt ist. Jede Textur kann jedoch zum Zeitpunkt der Ressourcenerstellung eingegeben oder weniger eingegeben werden, solange der Typ vollständig mithilfe einer Ansicht angegeben wird, wenn die Textur an die Pipeline gebunden ist.

Texturtypen

Es gibt verschiedene Arten von Texturen: 1D, 2D, 3D, die jeweils mit oder ohne Mipmaps erstellt werden können. Direct3D 10 unterstützt auch Texturarrays und mehrstufige Texturen.

1D-Textur

Eine 1D-Textur in ihrer einfachsten Form enthält Texturdaten, die mit einer einzelnen Texturkoordinate adressiert werden können. es kann als Array von Texels visualisiert werden, wie in der folgenden Abbildung gezeigt.

Abbildung einer 1d-Textur

Jeder Texel enthält je nach Format der gespeicherten Daten eine Reihe von Farbkomponenten. Wenn Sie mehr Komplexität hinzufügen, können Sie eine 1D-Textur mit Mipmap-Ebenen erstellen, wie in der folgenden Abbildung gezeigt.

Abbildung einer 1d-Textur mit MIPMAP-Ebenen

Eine Mipmap-Ebene ist eine Textur, die kleiner ist als die Darüberebene. Die oberste Ebene enthält die meisten Details, jede nachfolgende Ebene ist kleiner; für eine 1D-Mipmap enthält die kleinste Ebene einen Texel. Die unterschiedlichen Ebenen werden durch einen Index namens LOD (Detailebene) identifiziert. Sie können die LOD verwenden, um auf eine kleinere Textur zuzugreifen, wenn Geometrie gerendert wird, die sich nicht so nahe an der Kamera befindet.

1D-Texturarray

Direct3D 10 verfügt auch über eine neue Datenstruktur für ein Array von Texturen. Ein Array von 1D-Texturen sieht konzeptionell wie die folgende Abbildung aus.

Abbildung eines 1D-Texturarrays

Dieses Texturarray enthält drei Texturen. Jede der drei Texturen hat eine Texturbreite von 5 (die Anzahl der Elemente in der ersten Ebene). Jede Textur enthält auch eine Mipmap mit 3 Ebenen.

Alle Texturarrays in Direct3D sind ein homogenes Array von Texturen. Dies bedeutet, dass jede Textur in einem Texturarray das gleiche Datenformat und die gleiche Größe aufweisen muss (einschließlich Texturbreite und Anzahl von Mipmap-Ebenen). Sie können Texturarrays unterschiedlicher Größe erstellen, sofern alle Texturen in jedem Array mit der Größe übereinstimmen.

2D-Textur und 2D-Texturarray

Eine Texture2D-Ressource enthält ein 2D-Raster aus Texels. Jeder Texel ist durch einen u-, v-Vektor adressierbar. Da es sich um eine Texturressource handelt, kann sie Mipmapebenen und Unterressourcen enthalten. Eine vollständig aufgefüllte 2D-Texturressource sieht wie die folgende Abbildung aus.

Abbildung einer 2D-Texturressource

Diese Texturressource enthält eine einzelne 3x5-Textur mit drei Mipmap-Ebenen.

Eine Texture2DArray-Ressource ist ein homogenes Array von 2D-Texturen. Das heißt, jede Textur hat das gleiche Datenformat und die gleichen Dimensionen (einschließlich Mipmap-Ebenen). Es hat ein ähnliches Layout wie das 1D-Texturarray, mit dem Unterschied, dass die Texturen jetzt 2D-Daten enthalten und daher wie die folgende Abbildung aussehen.

Abbildung eines Arrays von 2D-Texturressourcen

Dieses Texturarray enthält drei Texturen: jede Textur ist 3x5 mit zwei Mipmap-Ebenen.

Verwenden eines Texture2DArray-Würfels

Ein Texturwürfel ist ein 2D-Texturarray, das 6 Texturen enthält, eine für jedes Gesicht des Würfels. Ein vollständig aufgefüllter Texturwürfel sieht wie in der folgenden Abbildung aus.

Abbildung eines Arrays von 2D-Texturressourcen, die einen Texturwürfel darstellen

Ein 2D-Texturarray, das 6 Texturen enthält, kann in Shadern mit den systeminternen Funktionen der Cubezuordnung gelesen werden, nachdem sie mit einer Cubetexturansicht an die Pipeline gebunden sind. Texturwürfel werden vom Shader mit einem 3D-Vektor adressiert, der aus der Mitte des Texturwürfels zeigt.

3D-Textur

Eine Texture3D-Ressource (auch als Volumetextur bezeichnet) enthält ein 3D-Volume von Texels. Da es sich um eine Texturressource handelt, kann sie Mipmap-Ebenen enthalten. Eine vollständig aufgefüllte 3D-Textur sieht wie die folgende Abbildung aus.

Abbildung einer 3D-Texturressource

Wenn ein 3D-Textur-Mipmap-Slice als Renderzielausgabe (mit einer Renderzielansicht) gebunden ist, verhält sich die 3D-Textur identisch mit einem 2D-Texturarray mit n Slices. Der bestimmte Renderslice wird aus der Geometry-Shader-Phase ausgewählt, indem eine skalare Komponente der Ausgabedaten als SV_RenderTargetArrayIndex Systemwert deklariert wird.

Es gibt kein Konzept eines 3D-Texturarrays. daher ist eine 3D-Texturunterquelle eine einzelne MIPMAP-Ebene.

Unterressourcen

Die Direct3D 10-API verweist auf ganze Ressourcen oder Teilmengen von Ressourcen. Um einen Teil der Ressourcen anzugeben, hat Direct3D den Begriff Unterressourcen geprägt, was eine Teilmenge einer Ressource bedeutet.

Ein Puffer ist als einzelne Unterquelle definiert. Texturen sind etwas komplizierter, da es mehrere verschiedene Texturtypen (1D, 2D usw.) gibt, von denen einige Mipmap-Ebenen und/oder Texturarrays unterstützen. Ab dem einfachsten Fall wird eine 1D-Textur als einzelne Unterquelle definiert, wie in der folgenden Abbildung dargestellt.

Abbildung einer 1d-Textur

Dies bedeutet, dass das Array von Texels, aus denen eine 1D-Textur besteht, in einer einzelnen Unterressource enthalten ist.

Wenn Sie eine 1D-Textur um drei mipmap-Ebenen erweitern, kann sie wie folgt visualisiert werden.

Abbildung einer 1d-Textur mit MIPMAP-Ebenen

Stellen Sie sich dies als eine einzelne Textur vor, die aus drei Untertexturen besteht. Jede Untertextur wird als Unterquelle gezählt, sodass diese 1D-Textur 3 Unterressourcen enthält. Eine Untertextur (oder Unterquelle) kann mithilfe der Detailebene (LOD) für eine einzelne Textur indiziert werden. Bei Verwendung eines Arrays von Texturen erfordert der Zugriff auf eine bestimmte Untertextur sowohl die LOD als auch die bestimmte Textur. Alternativ kombiniert die API diese beiden Informationen in einem einzelnen nullbasierten Unterressourcenindex, wie hier gezeigt.

Abbildung eines nullbasierten Unterressourcenindex

Auswählen von Unterressourcen

Einige API greifen auf eine gesamte Ressource zu (z . B. CopyResource), andere auf einen Teil einer Ressource (z. B . UpdateSubresource oder CopySubresourceRegion). Die API, die auf einen Teil einer Ressource zugreifen, verwenden in der Regel eine Ansichtsbeschreibung (z. B. D3D10_TEX2D_ARRAY_DSV), um die Unterressourcen anzugeben, auf die zugegriffen werden soll.

Diese Abbildungen veranschaulichen die Begriffe, die von einer Ansichtsbeschreibung beim Zugriff auf ein Array von Texturen verwendet werden.

Array-Slice

Bei einem Array von Texturen enthält jede Textur mit Mipmaps ein Array-Slice (dargestellt durch das weiße Rechteck) eine Textur und alle ihre Untertexturen, wie in der folgenden Abbildung gezeigt.

Abbildung einer Arrayspleißung

Mip Slice

Ein mip-Slice (dargestellt durch das weiße Rechteck) enthält eine mipmap-Ebene für jede Textur in einem Array, wie in der folgenden Abbildung gezeigt.

Abbildung eines MIP-Spleißes

Auswählen einer einzelnen Unterressource

Sie können diese beiden Arten von Slices verwenden, um eine einzelne Unterquelle auszuwählen, wie in der folgenden Abbildung gezeigt.

Abbildung der Auswahl einer Unterressource mithilfe eines Array-Slices und eines mip-Splices

Auswählen mehrerer Unterressourcen

Alternativ können Sie diese beiden Arten von Slices mit der Anzahl der mipmap-Ebenen und/oder der Anzahl der Texturen verwenden, um mehrere Unterressourcen auszuwählen.

Abbildung der Auswahl mehrerer Unterressourcen

Unabhängig davon, welchen Texturtyp Sie verwenden, mit oder ohne Mipmaps, mit oder ohne Texturarray, können Sie die Hilfsfunktion D3D10CalcSubresource verwenden, um den Index einer bestimmten Unterquelle zu berechnen.

Starke und schwache Typisierung

Beim Erstellen einer vollständig typisierten Ressource wird die Ressource auf das Format beschränkt, mit dem sie erstellt wurde. Dadurch kann die Runtime den Zugriff optimieren, insbesondere wenn die Ressource mit Flags erstellt wird, die angeben, dass sie von der Anwendung nicht zugeordnet werden kann. Ressourcen, die mit einem bestimmten Typ erstellt wurden, können nicht mithilfe des Ansichtsmechanismus neu interpretiert werden.

Bei einer Ressource vom Typ "weniger" ist der Datentyp unbekannt, wenn die Ressource zum ersten Mal erstellt wird. Die Anwendung muss aus den verfügbaren Typen mit weniger Formaten wählen (siehe DXGI_FORMAT). Sie müssen die Größe des zu zuweisenden Arbeitsspeichers angeben und angeben, ob die Runtime die Untertexturen in einer mipmap generieren muss. Das genaue Datenformat (ob der Arbeitsspeicher als ganze Zahlen, Gleitkommawerte, ganze Zahlen ohne Vorzeichen usw.) interpretiert wird, wird jedoch erst bestimmt, wenn die Ressource mit einer Ansicht an die Pipeline gebunden ist. Da das Texturformat flexibel bleibt, bis die Textur an die Pipeline gebunden ist, wird die Ressource als schwach typisierter Speicher bezeichnet. Schwach typisierter Speicher hat den Vorteil, dass er wiederverwendet oder neu interpretiert werden kann (in einem anderen Format), solange das Komponentenbit des neuen Formats der Bitanzahl des alten Formats entspricht.

Eine einzelne Ressource kann an mehrere Pipelinephasen gebunden werden, solange jede eine eindeutige Ansicht hat, die die Formate an jedem Standort vollständig qualifiziert. Beispielsweise kann eine Ressource, die mit dem Format DXGI_FORMAT_R32G32B32A32_TYPELESS erstellt wurde, gleichzeitig als DXGI_FORMAT_R32G32B32A32_FLOAT und DXGI_FORMAT_R32G32B32A32_UINT an verschiedenen Stellen in der Pipeline verwendet werden.

Ressourcen (Direct3D 10)