Introduzione a una risorsa in Direct3D 11
Le risorse sono i blocchi costitutivi della tua scena. Contengono la maggior parte dei dati usati da Direct3D per interpretare ed eseguire il rendering della scena. Le risorse sono aree in memoria a cui è possibile accedere tramite la pipeline Direct3D. Le risorse contengono i tipi di dati seguenti: geometria, trame, dati shader. Questo argomento presenta risorse Direct3D, ad esempio buffer e trame.
È possibile creare risorse fortemente tipate o senza tipi; è possibile controllare se le risorse hanno accesso in lettura e scrittura; è possibile rendere le risorse accessibili solo alla CPU, alla GPU o a entrambi. Per ogni fase della pipeline possono essere attive fino a 128 risorse.
Direct3D garantisce di restituire zero per qualsiasi risorsa a cui si accede fuori dai limiti.
Il ciclo di vita di una risorsa Direct3D è:
- Creare una risorsa usando uno dei metodi di creazione dell'interfaccia ID3D11Device.
- Associare una risorsa alla pipeline usando un contesto e uno dei metodi set dell'interfaccia ID3D11DeviceContext.
- Deallocare una risorsa chiamando il metodo Release dell'interfaccia della risorsa.
Questa sezione contiene gli argomenti seguenti:
Tipizzazione forte e debole
Esistono due modi per specificare completamente il layout (o il footprint di memoria) di una risorsa:
- Tipizzato: specificare completamente il tipo quando viene creata la risorsa.
- Non tipizzato: specificare completamente il tipo quando la risorsa è collegata alla pipeline.
La creazione di una risorsa completamente tipizzata limita la risorsa al formato con cui è stata creata. Ciò consente al runtime di ottimizzare l'accesso, soprattutto se la risorsa viene creata con flag che indicano che non può essere mappata dall'applicazione. Le risorse create con un tipo specifico non possono essere reinterpretate usando il meccanismo di visualizzazione a meno che la risorsa non sia stata creata con il flag D3D10_DDI_BIND_PRESENT. Se è impostata D3D10_DDI_BIND_PRESENT, è possibile creare viste di destinazione di rendering o risorse shader su queste risorse usando uno qualsiasi dei membri con tipo completo della famiglia appropriata, anche se la risorsa originale è stata creata con tipo completo.
In una risorsa priva di tipo, il tipo di dati è sconosciuto quando la risorsa viene inizialmente creata. L'applicazione deve scegliere tra i formati di tipo meno disponibili (vedere DXGI_FORMAT). È necessario specificare le dimensioni della memoria da allocare e se il runtime dovrà generare le sottotexture in un mipmap. Tuttavia, il formato esatto dei dati (se la memoria verrà interpretata come numeri interi, valori a virgola mobile, interi senza segno e così via) non viene determinato fino a quando la risorsa non viene associata alla pipeline con una vista risorse . Poiché il formato della trama rimane flessibile fino a quando la trama non viene associata alla pipeline, la risorsa viene definita risorsa di archiviazione tipizzata in modo debole. L'archiviazione tipizzata in modo debole ha il vantaggio che può essere riutilizzata o reinterpretata in un altro formato, purché il numero di componenti e il numero di bit di ogni componente siano uguali in entrambi i formati.
Una singola risorsa può essere associata a più fasi della pipeline, purché ognuna abbia una visualizzazione univoca, che qualifica completamente i formati in ogni posizione. Ad esempio, una risorsa creata con il formato DXGI_FORMAT_R32G32B32A32_TYPELESS può essere usata come DXGI_FORMAT_R32G32B32A32_FLOAT e una DXGI_FORMAT_R32G32B32A32_UINT in posizioni diverse nella pipeline contemporaneamente.
Visualizzazioni delle risorse
Le risorse possono essere archiviate in formati di memoria per utilizzo generico in modo che possano essere condivise da più fasi della pipeline. Una fase della pipeline interpreta i dati delle risorse usando una vista. Una visualizzazione delle risorse è concettualmente simile a una configurazione dei dati delle risorse in modo che possano essere utilizzati in un contesto specifico.
Una vista può essere usata con una risorsa priva di tipo. Ovvero, è possibile creare una risorsa in fase di compilazione e dichiarare il tipo di dati quando la risorsa è associata alla pipeline. Una vista creata per una risorsa senza tipi ha sempre lo stesso numero di bit per componente; il modo in cui i dati sono interpretati dipende dal formato specificato. Il formato specificato deve appartenere alla stessa famiglia del formato senza tipi utilizzato durante la creazione della risorsa. Ad esempio, una risorsa creata con il formato R8G8B8A8_TYPELESS non può essere visualizzata come risorsa R32_FLOAT anche se entrambi i formati possono avere le stesse dimensioni in memoria.
Una visualizzazione espone anche altre funzionalità, ad esempio la possibilità di leggere le superfici di profondità/stencil in uno shader, generare una cubemap dinamica in un singolo passaggio ed eseguire il rendering simultaneamente su più sezioni di un volume.
Interfaccia delle risorse | Descrizione |
---|---|
ID3D11DepthStencilView | Accedere a una risorsa texture durante il test di depth-stencil. |
ID3D11RenderTargetView | Accedere a una risorsa di texture usata come destinazione di rendering. |
ID3D11ShaderResourceView | Accedere a una risorsa shader, ad esempio un buffer costante, un buffer di texture, una texture o un campionatore. |
ID3D11UnorderedAccessView | Accedere a una risorsa non ordinata usando un pixel shader o uno shader di calcolo. |
Visualizzazioni non elaborate dei buffer
Si può pensare a un buffer non elaborato, che può anche essere chiamato un buffer di indirizzi byte, come un contenitore di bit a cui si vuole l'accesso non elaborato, ovvero un buffer a cui è possibile accedere comodamente tramite blocchi di uno a quattro valori di indirizzi senza tipi a 32 bit. Si indica che si desidera l'accesso non elaborato a un buffer (o una visualizzazione non elaborata di un buffer) quando si chiama uno dei metodi seguenti per creare una visualizzazione nel buffer:
- Per creare una visualizzazione risorse shader (SRV) nel buffer, chiamare ID3D11Device::CreateShaderResourceView con il flag D3D11_BUFFEREX_SRV_FLAG_RAW. Questo flag viene specificato nel membro Flags della struttura D3D11_BUFFEREX_SRV. Si imposta D3D11_BUFFEREX_SRV nel membro BufferEx della struttura D3D11_SHADER_RESOURCE_VIEW_DESC a cui il parametro pDesc di ID3D11Device::CreateShaderResourceView punta. Imposti anche il valore D3D11_SRV_DIMENSION_BUFFEREX nel membro ViewDimension di D3D11_SHADER_RESOURCE_VIEW_DESC per indicare che lo SRV è una vista grezza.
- Per creare una vista di accesso non ordinata (UAV) al buffer, chiamare ID3D11Device::CreateUnorderedAccessView con il flag D3D11_BUFFER_UAV_FLAG_RAW. Questo flag viene specificato nella member Flags della struttura D3D11_BUFFER_UAV. Imposti D3D11_BUFFER_UAV nel membro Buffer della struttura D3D11_UNORDERED_ACCESS_VIEW_DESC a cui il parametro pDesc di ID3D11Device::CreateUnorderedAccessView punta. Imposti anche il valore D3D11_UAV_DIMENSION_BUFFER nel membro ViewDimension di D3D11_UNORDERED_ACCESS_VIEW_DESC per indicare che l'UAV è una vista grezza.
È possibile utilizzare i tipi di oggetto HLSL ByteAddressBuffer e RWByteAddressBuffer quando si lavora con buffer grezzi.
Per creare una vista grezza di un buffer, è necessario prima chiamare ID3D11Device::CreateBuffer con il flag D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS per creare la risorsa di buffer sottostante. Questo flag viene specificato nel membro MiscFlags della struttura D3D11_BUFFER_DESC a cui punta il parametro pDesc di ID3D11Device::CreateBuffer. Non puoi combinare il flag D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS con D3D11_RESOURCE_MISC_BUFFER_STRUCTURED. Inoltre, se si specifica D3D11_BIND_CONSTANT_BUFFER in BindFlags di D3D11_BUFFER_DESC, non è possibile specificare contemporaneamente D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS in MiscFlags. Questa non è una limitazione delle visualizzazioni non elaborate perché i buffer costanti hanno già un vincolo che non possono essere combinati con altre visualizzazioni.
Oltre ai casi non validi precedenti, quando si crea un buffer con D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS, non si è limitati nelle funzionalità rispetto a non impostare D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS. Ciò significa che è possibile usare tale buffer per l'accesso non elaborato in molti modi possibili con Direct3D. Se si specifica il flag D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS, si incrementa solo la funzionalità disponibile.
Argomenti correlati