Freigeben über


Ressourcentypen

Verschiedene Ressourcentypen weisen ein eigenes Layout (oder Speicherbedarf) auf. Alle von der Direct3D-Pipeline verwendeten Ressourcen werden von zwei grundlegenden Ressourcentypen abgeleitet: Puffer und Texturen. Ein Puffer ist eine Sammlung von Rohdaten (Elementen); eine Textur ist eine Sammlung von Texeln (Texturelemente).

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

Artikel Beschreibung

Getippt

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 typierter 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-Float-Werte. 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ätestatus.

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 multisampelt werden.

Puffertypen

Vertexpuffer

Ein Puffer ist eine Sammlung von Elementen; Ein Vertexpuffer enthält Daten pro Scheitelpunkt. Das einfachste Beispiel ist ein Vertexpuffer, der einen Datentyp enthält, z. B. Positionsdaten. 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 für acht Scheitelpunkte; 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, und diese anderen 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 sein Layout definieren, indem Sie ein Eingabelayoutobjekt erstellen. Nachdem das Eingabelayoutobjekt erstellt wurde, binden Sie es an die Eingabeassemblerphase (Input Assembler, IA).

Indexpuffer

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. Die Verwendung eines Indexpuffers mit einem oder mehreren Vertexpuffern zum Bereitstellen von Daten an die IA-Phase wird als Indizierung bezeichnet. 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 vom Anfang des Puffers bis zum ersten Index.
  • StartIndexLocation – die Anzahl der Bytes vom Offset bis zum ersten Scheitelpunkt, der vom entsprechenden Draw-Aufruf verwendet wird.
  • IndexCount - die Anzahl der zu rendernden Indizes.

Ein Indexpuffer kann mehrere Linien- oder Dreiecksstreifen (primitive Topologien) zusammenfügen, indem jeder durch einen Streifenschnittindex getrennt wird. Mit einem Streifenschnittindex können mehrere Linien- oder Dreiecksstreifen mit einem einzelnen Draw-Aufruf gezeichnet werden. Ein Streifenschnittindex ist der maximal mögliche Wert für den Index (0xffff für einen 16-Bit-Index 0xffffffff für einen 32-Bit-Index). Der Streifenschnittindex setzt die Wicklungsreihenfolge in indizierten Grundtypen zurück und kann verwendet werden, um die Notwendigkeit für entgenerierte Dreiecke zu entfernen, die andernfalls erforderlich sein können, um die richtige Wicklungsreihenfolge in einem Dreiecksstreifen beizubehalten. Die folgende Abbildung zeigt ein Beispiel für einen Streifenschnittindex.

Abbildung eines Streifenschnittindexes

Konstantenpuffer

Direct3D verfügt über einen Puffer zum Bereitstellen von Shaderkonstanten, die als Shaderkonstantenpuffer oder einfach als Konstantenpuffer bezeichnet werden. Konzeptionell sieht er wie ein Einelement-Vertexpuffer 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.

Konstantenpuffer reduzieren die zum Aktualisieren von Shaderkonstanten erforderliche Bandbreite, indem Shaderkonstanten gruppiert und gleichzeitig committet werden können, anstatt jede Konstante über einzelne Aufrufe separat zu committen.

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

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

Verwenden Sie einen Konstantenpuffer, um die Ergebnisse der Datenstromausgabestufe 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 Texeln. Im Gegensatz zu Puffern können Texturen nach Textursamplern gefiltert werden, während sie nach Shadereinheiten gelesen werden. Der Texturtyp 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 zur Ressourcenerstellungszeit typisiert oder typlos sein, solange der Typ vollständig mithilfe einer Ansicht angegeben wird, wenn die Textur an die Pipeline gebunden ist.

Texturtypen

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

1D-Textur

Eine 1D-Textur in ihrer einfachsten Form enthält Texturdaten, die mit einer einzigen Texturkoordinate adressiert werden können. sie kann als Array von Texeln dargestellt werden, wie in der folgenden Abbildung dargestellt.

Abbildung einer 1D-Textur

Jedes 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 dargestellt.

Abbildung einer 1d-Textur mit Mipmap-Ebenen

Eine Mipmap-Ebene ist eine Textur, die eine Potenz von zwei kleiner ist als die ebene darüber. Die oberste Ebene enthält die meisten Details, jede nachfolgende Ebene ist kleiner; für eine 1D-Mipmap enthält die kleinste Ebene ein Texel. Die unterschiedlichen Ebenen werden durch einen Index namens LOD (Level-of-Detail) identifiziert; Sie können die LOD verwenden, um auf eine kleinere Textur zuzugreifen, wenn Geometrie gerendert wird, die nicht so nah an der Kamera ist.

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 in der folgenden Abbildung aus.

Abbildung eines 1D-Texturarrays

Dieses Texturarray enthält drei Texturen. Jede der drei Texturen weist eine Texturbreite von 5 auf (die Anzahl der Elemente in der ersten Ebene). Jede Textur enthält auch eine 3-Layer-Mipmap.

Alle Texturarrays in Direct3D sind ein homogenes Array von Texturen; Dies bedeutet, dass jede Textur in einem Texturarray dasselbe Datenformat und dieselbe Größe aufweisen muss (einschließlich Texturbreite und Anzahl der Mipmap-Ebenen). Sie können Texturarrays unterschiedlicher Größe erstellen, solange alle Texturen in jeder Arraygröße übereinstimmen.

2D-Textur- und 2D-Texturarray

Eine Texture2D-Ressource enthält ein 2D-Raster von Texeln. Jedes Texel ist durch einen U-, v-Vektor adressierbar. Da es sich um eine Texturressource handelt, kann sie Mipmap-Ebenen und Unterressourcen enthalten. Eine vollständig ausgefü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; d. h., jede Textur hat das gleiche Datenformat und dieselben Dimensionen (einschließlich Mipmap-Ebenen). Es weist ein ähnliches Layout wie das 1D-Texturarray auf, mit der Ausnahme, dass die Texturen jetzt 2D-Daten enthalten, und sieht daher wie die folgende Abbildung aus.

Abbildung eines Arrays von 2d-Texturressourcen

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

Verwenden eines Texture2DArray als Texturwürfel

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

Abbildung eines Arrays mit 2d-Texturressourcen, die einen Texturwürfel darstellen

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

3D-Textur

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

Abbildung einer 3D-Texturressource

Wenn ein 3D-Texturmipmap-Segment als Renderzielausgabe (mit einer Renderzielansicht) gebunden ist, verhält sich die 3D-Textur identisch mit einem 2D-Texturarray mit n Segmenten. Das bestimmte Rendersegment wird aus der Geometrie-Shader-Phase ausgewählt.

Es gibt kein Konzept eines 3D-Texturarrays; daher ist eine 3D-Texturunterressource eine einzelne Mipmap-Ebene.

Unterressourcen

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

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

Abbildung einer 1D-Textur

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

Wenn Sie eine 1D-Textur mit drei Mipmap-Ebenen erweitern, kann sie wie folgt dargestellt 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 Unterressource gezählt, sodass diese 1D-Textur drei Unterressourcen enthält. Eine Untertextur (oder Unterressource) kann mithilfe der LOD (Level-of-Detail) 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 Informationselemente in einem einzigen nullbasierten Unterressourcenindex, wie hier gezeigt.

Abbildung eines nullbasierten Unterressourcenindexes

Auswählen von Unterressourcen

Einige APIs greifen auf eine gesamte Ressource zu, andere greifen auf einen Teil einer Ressource zu. Die APIs, die auf einen Teil einer Ressource zugreifen, verwenden in der Regel eine Ansichtsbeschreibung, 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.

Arraysegment

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

Abbildung eines Array-Komplizens

Mip-Segment

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

Abbildung eines Mip-Komplizens

Auswählen einer einzelnen Unterressource

Sie können diese beiden Arten von Segmenten verwenden, um eine einzelne Unterressource auszuwählen, wie in der folgenden Abbildung dargestellt.

Abbildung der Auswahl einer Unterressource mithilfe eines Arraysegments und eines Mip-Komplizens

Auswählen mehrerer Unterressourcen

Alternativ können Sie diese beiden Arten von Segmenten 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, werden häufig Hilfsfunktionen bereitgestellt, um den Index einer bestimmten Unterressource zu berechnen.

Stark im Vergleich zu schwacher Eingabe

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

In einer typlosen Ressource ist der Datentyp unbekannt, wenn die Ressource zum ersten Mal erstellt wird. Die Anwendung muss aus den verfügbaren typlosen Formaten wählen. Sie müssen die Größe des zuzuordnenden Speichers angeben und angeben, ob die Laufzeit die Untertexture in einer Mipmap generieren muss.

Das genaue Datenformat (ob der Speicher als ganze Zahlen, Gleitkommawerte, nicht signierte ganze Zahlen 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 typierter 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 über eine eindeutige Ansicht verfügt, die die Formate an jedem Speicherort vollständig qualifiziert. Beispielsweise könnte eine ressource, die mit einem typlosen Format erstellt wurde, als FLOAT-Format und als UINT-Format an verschiedenen Positionen in der Pipeline gleichzeitig verwendet werden.

Ressourcen