Unterressourcen (Direct3D 12-Grafiken)

Beschreibt, wie eine Ressource in Unterressourcen unterteilt wird und wie auf eine einzelne, mehrere oder mehrere Unterressourcen verwiesen wird.

Beispielunterressourcen

Wenn eine Ressource einen Puffer enthält, enthält sie einfach eine Unterressource mit dem Index 0. Wenn die Ressource eine Textur (oder ein Texturarray) enthält, ist der Verweis auf die Unterressourcen komplexer.

Einige APIs greifen auf eine gesamte Ressource zu (z. B. die ID3D12GraphicsCommandList::CopyResource-Methode ), 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 Subresource-APIs .

Subressourcenindizierung

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

Subresource-Indizierung

Mip-Slice

Ein mip-Slice enthält eine Mipmap-Ebene für jede Textur in einem Array, wie in der folgenden Abbildung gezeigt.

Subresource-mip-Slices

Arrayslice

Bei einem Array von Texturen, jede Textur mit Mipmaps, enthält ein Arrayslice eine Textur und alle seine Mip-Ebenen, wie in der folgenden Abbildung gezeigt.

Subresource-Arrayslices

Ebenensegment

In der Regel werden planare Formate nicht verwendet, um RGBA-Daten zu speichern, aber in den Fällen, in denen dies der Fall ist (vielleicht 24bpp RGB-Daten), könnte eine Ebene das rote Bild, eine die grüne und eine das blaue Bild darstellen. Eine Ebene ist jedoch nicht unbedingt eine Farbe, zwei oder mehr Farben können zu einer Ebene kombiniert werden. In der Regel werden planare Daten für untergeordnete YCbCr- und Depth-Stencil-Daten verwendet. Depth-Stencil ist das einzige Format, das Mipmaps, Arrays und mehrere Ebenen (häufig Ebene 0 für Tiefe und Ebene 1 für Schablone) vollständig unterstützt.

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

Tiefenschablonenindizierung

YCbCr unter Stichproben 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, überlappend), auf die das menschliche Auge weniger empfindlich ist. Dieses Format ermöglicht die Komprimierung der Chrominanzwerte, um ein Bild ohne Beeinträchtigung der Luminanz zu komprimieren, und ist aus diesem Grund ein gängiges Videokomprimierungsformat, obwohl es zum Komprimieren von Standbildern verwendet wird. Die folgende Abbildung zeigt das NV12-Format, wobei festgestellt wird, dass die Chrominanz auf ein Viertel der Auflösung der Luminanz komprimiert wurde, d. h. die Breite jeder Ebene ist identisch, und die Chrominanzebene hat die Hälfte der Höhe der Leuchtdichteebene. Die Ebenen würden als Unterressourcen auf die gleiche Weise wie im obigen beispiel Depth-Stencil indiziert.

nv12-Format

Planare Formate gab es in Direct3D 11, 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 erhielt. 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); 
}

Bei der meisten Hardware wird davon ausgegangen, dass der Arbeitsspeicher für Ebene N immer sofort nach Ebene N-1 zugeordnet wird.

Eine Alternative zur Verwendung von Unterressourcen besteht darin, dass eine App eine vollständig separate Ressource pro Ebene zuordnen könnte. In diesem Fall versteht die Anwendung, dass die Daten planar sind, und verwendet mehrere Ressourcen, um sie darzustellen.

Mehrere Unterressourcen

Eine Shader-Ressourcenansicht kann einen beliebigen rechteckigen Bereich von Unterressourcen auswählen, indem eines der oben beschriebenen Slices und eine vernünftige Verwendung von Feldern in den Ansichtsstrukturen (z. B. D3D12_TEX2D_ARRAY_SRV) verwendet wird, wie in der Abbildung dargestellt.

Auswahl mehrerer Unterressourcen

Eine Renderzielansicht kann nur eine einzelne Unterressource oder einen Mip-Slice verwenden und darf keine Unterressourcen aus mehr als einem MIP-Slice 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 auf 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:

Methoden:

Texturen müssen sich im D3D12_RESOURCE_STATE_COMMON Zustand befinden, damit der CPU-Zugriff über WriteToSubresource und ReadFromSubresource zulässig ist. Puffer jedoch nicht. Der CPU-Zugriff auf eine Ressource erfolgt in der Regel überZuordnungs-Unmap/.

Ressourcenbindung