Condividi tramite


Sottoresources (Grafica Direct3D 12)

Viene descritto come una risorsa è suddivisa in sottorisorse e come fare riferimento a una singola sezione o a una singola sezione di sottorisorse.

Sottorisorse di esempio

Se una risorsa contiene un buffer, contiene semplicemente una sottoresource con un indice pari a 0. Se la risorsa contiene una trama (o matrice di trama), fare riferimento alle sottoresource è più complesso.

Alcune API accedono a un'intera risorsa, ad esempio il metodo ID3D12GraphicsCommandList::CopyResource , altri accedono a una parte di una risorsa, ad esempio il metodo ID3D12Resource::ReadFromSubresource . I metodi che accedono a una parte di una risorsa in genere usano una descrizione della visualizzazione (ad esempio la struttura D3D12_TEX2D_ARRAY_SRV ) per specificare le sottoresource da accedere. Per un elenco completo, vedere la sezione API subresource .

Indicizzazione di sottorisorse

Per indicizzare una determinata sottoresource, i livelli mip vengono indicizzati prima quando ogni voce di matrice viene indicizzata.

indicizzazione di subresource

Sezione Mip

Una sezione mip include un livello mipmap per ogni trama in una matrice, come illustrato nell'immagine seguente.

sezioni mip di subresource

Sezione matrice

Dato una matrice di trame, ogni trama con mipmaps, una sezione di matrice include una trama e tutti i relativi livelli mip, come illustrato nell'immagine seguente.

sezioni della matrice subresource

Sezione piano

In genere i formati planari non vengono usati per archiviare i dati RGBA, ma nei casi in cui è (forse 24bpp dati RGB), un piano potrebbe rappresentare l'immagine rossa, una verde e un'immagine blu. Un piano però non è necessariamente un colore, due o più colori possono essere combinati in un piano. Più in genere i dati planari vengono usati per i dati di YCbCr e di Depth-Stencil. Depth-Stencil è l'unico formato che supporta completamente mipmap, matrici e più piani (spesso piano 0 per Profondità e piano 1 per Stencil).

L'indicizzazione di sottoresource per una matrice di due immagini Depth-Stencil, ognuna con tre livelli mip, è illustrata di seguito.

indicizzazione dello stencil di profondità

YCbCr sub-sampled supporta matrici e ha piani, ma non supporta mipmaps. Le immagini YCbCr hanno due piani, uno per la luminanza (Y) che l'occhio umano è più sensibile a, e uno per la dominanza (sia Cb, che Cr, interleaved) che l'occhio umano è meno sensibile a. Questo formato consente la compressione dei valori di dominanza per comprimere un'immagine senza influire sulla luminanza ed è un formato di compressione video comune per tale motivo, anche se viene usato per comprimere immagini ancora. L'immagine seguente mostra il formato NV12, notando che la dominanza è stata compressa in un quarto della risoluzione della luminanza, il che significa che la larghezza di ogni piano è identica e il piano di dominanza è la metà dell'altezza del piano di luminanza. I piani verranno indicizzati come sottoresource in modo identico all'esempio Depth-Stencil precedente.

formato nv12

I formati planari esistono in Direct3D 11, ma i singoli piani non possono essere risolti singolarmente, ad esempio per le operazioni di copia o mapping. Questa modifica è stata modificata in Direct3D 12 in modo che ogni piano abbia ricevuto il proprio ID di sottoresource. Confrontare i due metodi seguenti per calcolare l'ID di sottoresource.

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); 
}

La maggior parte dell'hardware presuppone che la memoria per il piano N sia sempre allocata immediatamente dopo il piano N-1.

Un'alternativa all'uso di sottoresource è che un'app potrebbe allocare una risorsa completamente separata per piano. In questo caso, l'applicazione riconosce che i dati sono planari e utilizza più risorse per rappresentarlo.

Più sottorisorse

Una visualizzazione delle risorse shader può selezionare qualsiasi area rettangolare di sottoresource, usando una delle sezioni descritte in precedenza e l'uso insodibile dei campi nelle strutture di visualizzazione (ad esempio D3D12_TEX2D_ARRAY_SRV), come illustrato nell'immagine.

selezione di più sottorisorse

Una visualizzazione di destinazione di rendering può usare solo una singola sezione subresource o mip e non può includere sottorisorse da più sezioni mip. Ovvero, ogni trama in una visualizzazione di destinazione di rendering deve essere la stessa dimensione. Una visualizzazione shader-resource può selezionare qualsiasi area rettangolare di sottoresource, come illustrato nell'immagine.

API subresource

Le API seguenti fanno riferimento e funzionano con le sottoresource:

Enumerazioni:

Le strutture seguenti contengono indici PlaneSlice , la maggior parte contiene indici MipSlice .

Le strutture seguenti contengono indici ArraySlice , la maggior parte contiene indici MipSlice .

Le strutture seguenti contengono indici MipSlice , ma né Gli indici ArraySlicePlaneSlice .

Le strutture seguenti fanno riferimento anche alle sottoresource:

Metodi:

Le trame devono trovarsi nello stato D3D12_RESOURCE_STATE_COMMON per l'accesso alla CPU tramite WriteToSubresource e ReadFromSubresource per essere legali; ma i buffer non sono. L'accesso alla CPU a una risorsa viene in genere eseguito tramite Map/Unmap.

Associazione di risorse