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.
Mip-Segment
Ein Mip-Segment enthält eine Mipmap-Ebene für jede Textur in einem Array, wie in der folgenden Abbildung dargestellt.
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.
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.
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.
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.
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.
- 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 Verworfen einer Ressource verwendet wird.
- D3D12_PLACED_SUBRESOURCE_FOOTPRINT: Fügt einen Offset zu einer Ressource zum grundlegenden Fußabdruck hinzu.
- D3D12_RESOURCE_TRANSITION_BARRIER: Beschreibt den Übergang von Unterressourcen zwischen verschiedenen Verwendungen (Shaderressource, Renderziel usw.).
- D3D12_SUBRESOURCE_DATA: Unterressourcendaten enthalten die Daten selbst sowie die Zeilen- und Segmenthöhe.
- D3D12_SUBRESOURCE_FOOTPRINT: Ein Fußabdruck umfasst das Format, die Breite, die Höhe, die Tiefe und den Zeilenabstand der Unterressource.
- D3D12_SUBRESOURCE_INFO: enthält den Offset, die Zeilenabstand und den Tiefenabstand der Unterressource.
- D3D12_SUBRESOURCE_TILING: Beschreibt ein unterteiltes Unterressourcenvolume (siehe Volume Tiled Resources).
- D3D12_TEXTURE_COPY_LOCATION: beschreibt einen Teil einer Textur zum Kopieren.
- D3D12_TILED_RESOURCE_COORDINATE: Beschreibt die Koordinaten einer nebeneinander angeordneten Ressource.
Methodik:
- ID3D12Device::GetCopyableFootprints: ruft Informationen zu einer Ressource ab, um eine Kopie zu ermöglichen.
- ID3D12Device::GetResourceTiling : Ruft Informationen dazu ab, wie eine nebeneinander angeordnete Ressource in Kacheln unterteilt wird.
- ID3D12GraphicsCommandList::ResolveSubresource: kopiert eine mehrsampige Unterressource in eine Nicht-Multi-Sampled-Unterressource.
- 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 einen rechteckigen Bereich einer Unterressource.
- ID3D12Resource::Unmap: Hebt die Zuordnung des angegebenen Speicherbereichs auf und hebt den Zeiger auf die Ressource auf. Gibt den GPU-Zugriff auf die Unterressource erneut an.
- ID3D12Resource::WriteToSubresource: kopiert Daten in eine Unterressource oder einen rechteckigen Bereich einer Unterressource.
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.
Verwandte Themen