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.
Mip-Slice
Ein mip-Slice enthält eine Mipmap-Ebene für jede Textur in einem Array, wie in der folgenden Abbildung gezeigt.
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.
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.
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.
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.
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 .
- D3D12_TEX2D_RTV
- D3D12_TEX2D_ARRAY_RTV
- D3D12_TEX2D_SRV
- D3D12_TEX2D_ARRAY_SRV
- D3D12_TEX2D_UAV
- D3D12_TEX2D_ARRAY_UAV
Die folgenden Strukturen enthalten ArraySlice-Indizes , die meisten enthalten MipSlice-Indizes .
- D3D12_TEX1D_ARRAY_DSV
- D3D12_TEX2D_ARRAY_DSV
- D3D12_TEX2DMS_ARRAY_DSV
- D3D12_TEX1D_ARRAY_RTV
- D3D12_TEX2D_ARRAY_RTV
- D3D12_TEX2DMS_ARRAY_RTV
- D3D12_TEX1D_ARRAY_SRV
- D3D12_TEX2D_ARRAY_SRV
- D3D12_TEX2DMS_ARRAY_SRV
- D3D12_TEX1D_ARRAY_UAV
- D3D12_TEX2D_ARRAY_UAV
Die folgenden Strukturen enthalten MipSlice-Indizes , aber weder ArraySlice - noch PlaneSlice-Indizes .
Die folgenden Strukturen verweisen auch auf Unterressourcen:
- D3D12_DISCARD_REGION : Eine Struktur, die zur Vorbereitung des Verwerfens einer Ressource verwendet wird.
- D3D12_PLACED_SUBRESOURCE_FOOTPRINT : Fügt einer Ressource einen Offset zum grundlegenden Speicherbedarf hinzu.
- D3D12_RESOURCE_TRANSITION_BARRIER : beschreibt den Übergang von Unterressourcen zwischen verschiedenen Verwendungen (Shaderressource, Renderziel usw.).
- D3D12_SUBRESOURCE_DATA : Unterressourcendaten umfassen die Daten selbst sowie die Zeilen- und Sliceabstand.
- D3D12_SUBRESOURCE_FOOTPRINT : Ein Fußabdruck umfasst das Format, die Breite, die Höhe, die Tiefe und die Zeilenabstandsbreite der Unterressource.
- D3D12_SUBRESOURCE_INFO : enthält den Offset, den Zeilenabstand und den Tiefenabstand der Unterressource.
- D3D12_SUBRESOURCE_TILING : Beschreibt ein gruppiertes Unterressourcenvolume (siehe Gruppierte Ressourcen).
- D3D12_TEXTURE_COPY_LOCATION : Beschreibt einen Teil einer Textur zum Zwecke des Kopierens.
- D3D12_TILED_RESOURCE_COORDINATE : Beschreibt die Koordinaten einer kachelten Ressource.
Methoden:
- ID3D12Device::GetCopyableFootprints : ruft Informationen zu einer Ressource ab, um eine Kopie zu ermöglichen.
- ID3D12Device::GetResourceTiling : ruft Informationen darüber ab, wie eine kachelnde Ressource in Kacheln unterteilt wird.
- ID3D12GraphicsCommandList::ResolveSubresource : Kopiert eine Unterressource mit mehreren Stichproben in eine Unterressource, die nicht mit mehreren Stichproben enthalten ist.
- ID3D12Resource::Map : Gibt einen Zeiger auf die angegebenen Daten in der Ressource zurück und verweigert den GPU-Zugriff auf die Unterressource.
- ID3D12Resource::ReadFromSubresource : Kopiert Daten aus einer Unterressource oder einem rechteckigen Bereich einer Unterressource.
- ID3D12Resource::Unmap : Hebt die Zuordnung des angegebenen Speicherbereichs auf und ungültig den Zeiger auf die Ressource. Stellt den GPU-Zugriff auf die Unterressource wieder her.
- ID3D12Resource::WriteToSubresource : Kopiert Daten in eine Unterressource oder einen rechteckigen Bereich einer Unterressource.
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/.
Zugehörige Themen