Freigeben über


Unterressourcen (Direct3D 12-Grafiken)

Beschreibt, wie eine Ressource in Unterressourcen unterteilt wird und wie auf ein einzelnes, mehrere oder Segmente von Unterressourcen verwiesen wird.

Beispielunterressourcen

Wenn eine Ressource einen Puffer enthält, enthält sie einfach eine Unterressource mit einem Index von 0. Wenn die Ressource eine Textur (oder ein Texturarray) enthält, ist das Verweisen auf die Unterressourcen komplexer.

Einige APIs greifen auf eine gesamte Ressource (z. B. die ID3D12GraphicsCommandList::CopyResource-Methode) zu, andere greifen auf einen Teil einer Ressource zu (z. B. die ID3D12Resource::ReadFromSubresource Methode). Die Methoden, die auf einen Teil einer Ressource zugreifen, verwenden in der Regel eine Ansichtsbeschreibung (z. B. die D3D12_TEX2D_ARRAY_SRV-Struktur), um die unterressourcen anzugeben, auf die zugegriffen werden soll. Eine vollständige Liste finden Sie im Abschnitt Unterressourcen-APIs.

Unterressourcenindizierung

Zum Indizieren einer bestimmten Unterressource werden die Mip-Ebenen zuerst indiziert, da jeder Arrayeintrag indiziert wird.

Unterressourcenindizierung

Mip-Segment

Ein Mip-Segment enthält eine Mipmap-Ebene für jede Textur in einem Array, wie in der folgenden Abbildung dargestellt.

Unterressourcen-Mip-Segmente

Arraysegment

Angesichts eines Arrays von Texturen umfasst jede Textur mit Mipmaps ein Arraysegment eine Textur und alle zugehörigen Mip-Ebenen, wie in der folgenden Abbildung dargestellt.

Unterressourcenarraysegmente

Ebenensegment

In der Regel werden planare Formate nicht verwendet, um RGBA-Daten zu speichern, aber in den Fällen, in denen es sich um (vielleicht 24bpp RGB-Daten) handelt, könnte eine Ebene das rote Bild, eines der grünen und eines des blauen Bilds darstellen. Eine Ebene ist jedoch nicht notwendigerweise eine Farbe, zwei oder mehr Farben könnten in einer Ebene kombiniert werden. In der Regel werden planare Daten für subsampierte YCbCr- und Depth-Stencil-Daten verwendet. Depth-Stencil ist das einzige Format, das Mipmaps, Arrays und mehrere Ebenen vollständig unterstützt (häufig Ebene 0 für Tiefe und Ebene 1 für Schablone).

Die Unterressourcenindizierung für ein Array von zwei Depth-Stencil Bildern mit jeweils drei Mip-Ebenen wird unten gezeigt.

Tiefenschablonenindizierung

Unterbeispieliertes YCbCr unterstützt Arrays und verfügt über Ebenen, unterstützt jedoch keine Mipmaps. YCbCr-Bilder haben zwei Ebenen, eine für die Leuchtdichte (Y), für die das menschliche Auge am empfindlichsten ist, und eine für die Chrominanz (sowohl Cb als auch Cr, interleaved), für die das menschliche Auge weniger empfindlich ist. Dieses Format ermöglicht die Komprimierung der Chrominanzwerte, um ein Bild zu komprimieren, ohne die Leuchtdichte zu beeinträchtigen, und ist aus diesem Grund ein gängiges Videokomprimierungsformat, obwohl es verwendet wird, stille Bilder zu komprimieren. Die folgende Abbildung zeigt das NV12-Format, wobei die Chrominanz auf ein Viertel der Auflösung der Leuchtdichte komprimiert wurde, was bedeutet, dass die Breite jeder Ebene identisch ist und die Chrominanzebene die Hälfte der Höhe der Leuchtdichteebene ist. Die Ebenen würden als Unterressourcen auf identische Weise wie im obigen Depth-Stencil Beispiel indiziert werden.

das nv12-Format

Planarformate sind in Direct3D 11 vorhanden, aber einzelne Ebenen konnten nicht einzeln adressiert werden, z. B. für Kopier- oder Zuordnungsvorgänge. Dies wurde in Direct3D 12 geändert, sodass jede Ebene eine eigene Unterressourcen-ID erhalten hat. Vergleichen Sie die folgenden beiden Methoden zum Berechnen der Unterressourcen-ID.

Direct3D 11

inline UINT D3D11CalcSubresource( UINT MipSlice, UINT ArraySlice, UINT MipLevels )
{
    return MipSlice + (ArraySlice * MipLevels); 
}

Direct3D 12

inline UINT D3D12CalcSubresource( UINT MipSlice, UINT ArraySlice, UINT PlaneSlice, UINT MipLevels, UINT ArraySize )
{ 
    return MipSlice + (ArraySlice * MipLevels) + (PlaneSlice * MipLevels * ArraySize); 
}

Die meisten Hardware geht davon aus, dass der Speicher für Ebene N immer unmittelbar nach der Ebene N-1 zugeordnet wird.

Eine Alternative zur Verwendung von Unterressourcen besteht darin, dass eine App eine völlig separate Ressource pro Ebene zuordnen kann. In diesem Fall versteht die Anwendung die Daten planar und verwendet mehrere Ressourcen, um sie darzustellen.

Mehrere Unterressourcen

Eine Shaderressourcenansicht kann einen beliebigen rechteckigen Bereich von Unterressourcen auswählen, wobei eines der oben beschriebenen Segmente verwendet wird, und die Verwendung von Feldern in den Ansichtsstrukturen (z. B. D3D12_TEX2D_ARRAY_SRV), wie in der Abbildung dargestellt.

mehrere Unterressourcenauswahl

Eine Renderzielansicht kann nur eine einzelne Unterressource oder ein Mip-Segment verwenden und keine Unterressourcen aus mehreren Mip-Segmenten enthalten. Das heißt, jede Textur in einer Renderzielansicht muss dieselbe Größe aufweisen. Eine Shaderressourcenansicht kann einen beliebigen rechteckigen Bereich von Unterressourcen auswählen, wie in der Abbildung dargestellt.

Unterressourcen-APIs

Die folgenden APIs verweisen und arbeiten mit Unterressourcen:

Aufzählungen:

Die folgenden Strukturen enthalten PlaneSlice Indizes, die meisten enthalten MipSlice Indizes.

Die folgenden Strukturen enthalten ArraySlice Indizes, die meisten enthalten MipSlice Indizes.

Die folgenden Strukturen enthalten MipSlice Indizes, aber weder ArraySlice noch PlaneSlice Indizes.

Die folgenden Strukturen verweisen auch auf Unterressourcen:

Methodik:

Texturen müssen sich im D3D12_RESOURCE_STATE_COMMON Zustand für den CPU-Zugriff über WriteToSubresource befinden und ReadFromSubresource legal sein; Puffer sind jedoch nicht vorhanden. Der CPU-Zugriff auf eine Ressource erfolgt in der Regel über Zuordnung/Aufheben der Zuordnung.

Ressourcenbindungs-