Delen via


Subresources (Direct3D 12 Graphics)

Hierin wordt beschreven hoe een resource is onderverdeeld in subresources en hoe u verwijst naar één, meerdere of segment van subresources.

Voorbeeldsubresources

Als een resource een buffer bevat, bevat deze gewoon één subresource met een index van 0. Als de resource een bitmappatroon (of bitmapmatrix) bevat, is het complexer om te verwijzen naar de subresources.

Sommige API's hebben toegang tot een hele resource (zoals de methode ID3D12GraphicsCommandList::CopyResource), anderen hebben toegang tot een gedeelte van een resource (bijvoorbeeld de methode ID3D12Resource::ReadFromSubresource). De methoden die toegang hebben tot een deel van een resource, gebruiken over het algemeen een weergavebeschrijving (zoals de D3D12_TEX2D_ARRAY_SRV-structuur) om de subresources op te geven voor toegang. Raadpleeg de sectie Subresource-API's voor een volledige lijst.

Indexering van subresources

Als u een bepaalde subresource wilt indexeren, worden de mip-niveaus eerst geïndexeerd omdat elke matrixvermelding wordt geïndexeerd.

indexering van subresources

Mip-segment

Een mip-segment bevat één mipmapniveau voor elk patroon in een matrix, zoals wordt weergegeven in de volgende afbeelding.

mip-segmenten van subresources

Matrixsegment

Op basis van een matrix met patronen bevat elke textuur met mipmaps een matrixsegment één patroon en alle mipniveaus, zoals wordt weergegeven in de volgende afbeelding.

subresourcematrixsegmenten

Vlaksegment

Normaal gesproken worden planaire indelingen niet gebruikt voor het opslaan van RGBA-gegevens, maar in de gevallen waarin dit het geval is (misschien 24bpp RGB-gegevens), kan één vlak de rode afbeelding, een de groene en een de blauwe afbeelding vertegenwoordigen. Eén vlak is echter niet noodzakelijkerwijs één kleur, twee of meer kleuren kunnen in één vlak worden gecombineerd. Doorgaans worden planaire gegevens gebruikt voor subvoorbeelden YCbCr en Depth-Stencil gegevens. Depth-Stencil is de enige indeling die mipmaps, matrices en meerdere vlakken volledig ondersteunt (vaak vlak 0 voor diepte en vlak 1 voor stencil).

De subresourceindexering voor een matrix van twee Depth-Stencil-afbeeldingen, elk met drie mip-niveaus, wordt hieronder weergegeven.

dieptestencils indexeren

Sub-sampled YCbCr ondersteunt matrices en heeft vlakken, maar biedt geen ondersteuning voor mipmaps. YCbCr beelden hebben twee vlakken, één voor de luminantie (Y) waar het menselijk oog het gevoeligst voor is, en één voor de chrominantie (zowel Cb als Cr, interleaved) waar het menselijk oog minder gevoelig voor is. Met deze indeling kunt u de chrominantiewaarden comprimeren om een afbeelding te comprimeren zonder dat dit van invloed is op de luminantie, en is daarom een veelgebruikte videocompressie-indeling, hoewel het wordt gebruikt om nog steeds afbeeldingen te comprimeren. In de onderstaande afbeelding ziet u de NV12-indeling, waarbij de chrominantie is gecomprimeerd tot een kwart van de resolutie van de luminantie, wat betekent dat de breedte van elk vlak identiek is en het chrominantievlak de helft van de hoogte van het luminantievlak is. De vliegtuigen worden geïndexeerd als subresources op een identieke manier als het bovenstaande Depth-Stencil voorbeeld.

de nv12-indeling

Planar-indelingen bestonden in Direct3D 11, maar afzonderlijke vlakken konden niet afzonderlijk worden aangepakt, bijvoorbeeld voor kopieer- of toewijzingsbewerkingen. Dit is gewijzigd in Direct3D 12, zodat elk vliegtuig een eigen subresource-id heeft ontvangen. Vergelijk de volgende twee methoden voor het berekenen van de subresource-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); 
}

Bij de meeste hardware wordt ervan uitgegaan dat het geheugen voor vliegtuig N altijd onmiddellijk wordt toegewezen na vliegtuig N-1.

Een alternatief voor het gebruik van subresources is dat een app per vlak een volledig afzonderlijke resource kan toewijzen. In dit geval begrijpt de toepassing dat de gegevens zijn gepland en worden er meerdere resources gebruikt om deze weer te geven.

Meerdere subresources

Met een shader-resourceweergave kunt u een rechthoekig gebied van subresources selecteren met behulp van een van de hierboven beschreven segmenten en het gebruik van velden in de weergavestructuren (zoals D3D12_TEX2D_ARRAY_SRV), zoals weergegeven in de afbeelding.

selectie van meerdere subresources

Een render-doelweergave kan slechts één subresource- of mipsegment gebruiken en mag geen subresources uit meer dan één mip-segment bevatten. Dat wil gezegd dat elk patroon in een weergave met een render-doel dezelfde grootte moet hebben. Een shader-resourceweergave kan een rechthoekig gebied van subresources selecteren, zoals wordt weergegeven in de afbeelding.

Subresource-API's

De volgende API's verwijzen en werken met subresources:

Opsommingen:

De volgende structuren bevatten PlaneSlice-indexen, de meeste bevatten MipSlice-indexen.

De volgende structuren bevatten ArraySlice-indexen, de meeste bevatten MipSlice-indexen.

De volgende structuren bevatten MipSlice indexen, maar niet ArraySlice en PlaneSlice indexen.

De volgende structuren verwijzen ook naar subresources:

Methoden:

Patronen moeten de status D3D12_RESOURCE_STATE_COMMON hebben voor CPU-toegang via WriteToSubresource- en ReadFromSubresource- om legaal te zijn; maar buffers niet. CPU-toegang tot een resource wordt doorgaans uitgevoerd via Toewijzing/Toewijzing ongedaan maken.

resourcebinding