Introduzione a una risorsa in Direct3D 11

Le risorse sono i blocchi predefiniti della scena. Contengono la maggior parte dei dati usati da Direct3D per interpretare e eseguire il rendering della scena. Le risorse sono aree in memoria a cui è possibile accedere dalla pipeline Direct3D. Le risorse contengono i tipi di dati seguenti: geometria, trame, dati shader. Questo argomento introduce risorse Direct3D, ad esempio buffer e trame.

È possibile creare risorse fortemente tipizzata o senza tipo; è possibile controllare se le risorse dispongono sia di accesso in lettura che in scrittura; è possibile rendere accessibili le risorse 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 viene eseguito l'accesso ai 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 i seguenti argomenti:

Digitazione forte e debole

Esistono due modi per specificare completamente il layout (o il footprint di memoria) di una risorsa:

  • Digitato: specificare completamente il tipo quando viene creata la risorsa.
  • Senza tipi: specificare completamente il tipo quando la risorsa è associata alla pipeline.

La creazione di una risorsa completamente tipizzata limita la risorsa al formato creato con. 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 di D3D10_DDI_BIND_PRESENT. Se D3D10_DDI_BIND_PRESENT è impostato, è possibile creare viste delle risorse di destinazione di rendering o shader in queste risorse usando uno dei membri completamente tipizzato della famiglia appropriata, anche se la risorsa originale è stata creata come completamente tipizzata.

In una risorsa meno tipo, il tipo di dati è sconosciuto quando la risorsa viene prima creata. L'applicazione deve scegliere tra i formati meno di tipo disponibili (vedere DXGI_FORMAT). È necessario specificare le dimensioni della memoria da allocare e se il runtime dovrà generare le sottotexture in una mappa mipmap. Tuttavia, il formato di dati esatto (se la memoria verrà interpretata come interi, valori a virgola mobile, interi senza segno e così via) non viene determinata fino a quando la risorsa non è associata alla pipeline con una vista risorsa. Poiché il formato della trama rimane flessibile fino a quando la trama non è associata alla pipeline, la risorsa viene definita 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 della pipeline.

Visualizzazioni 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 visualizzazione. Una vista risorsa è concettualmente simile al cast dei dati delle risorse in modo che possa essere usata in un determinato contesto.

Una visualizzazione può essere usata con una risorsa senza tipi. Vale a dire, è possibile creare una risorsa in fase di compilazione e dichiarare il tipo di dati quando la risorsa è associata alla pipeline. Una visualizzazione 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 essere dalla stessa famiglia del formato senza tipo usato durante la creazione della risorsa. Ad esempio, non è possibile visualizzare una risorsa creata con il formato R8G8B8A8_TYPELESS come risorsa R32_FLOAT anche se entrambi i formati possono essere le stesse dimensioni in memoria.

Una vista espone anche altre funzionalità, ad esempio la possibilità di leggere le superfici di profondità/stencil indietro in uno shader, generando una mappa cubo dinamica in un singolo passaggio e eseguendo il rendering simultaneamente in più sezioni di un volume.

Interfaccia risorsa Descrizione
ID3D11DepthStencilView Accedere a una risorsa trama durante i test di profondità-stencil.
ID3D11RenderTargetView Accedere a una risorsa trama usata come destinazione di rendering.
ID3D11ShaderResourceView Accedere a una risorsa shader, ad esempio un buffer costante, un buffer di trama, una trama o un sampler.
ID3D11UnorderedAccessView Accedere a una risorsa non ordinata usando un pixel shader o uno shader di calcolo.

 

Visualizzazioni non elaborate dei buffer

È possibile pensare a un buffer non elaborato, che può essere chiamato anche un buffer di indirizzi byte, come un contenitore di bit a cui si vuole l'accesso non elaborato, ovvero un buffer che è possibile accedere facilmente tramite blocchi di uno a quattro valori di indirizzi senza tipo a 32 bit. Si indica che si vuole 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:

È possibile usare i tipi di oggetto HLSL ByteAddressBuffer e RWByteAddressBuffer quando si utilizzano buffer non elaborati.

Per creare una visualizzazione non elaborata in un buffer, è necessario chiamare prima ID3D11Device::CreateBuffer con il flag D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS per creare la risorsa buffer sottostante. Specificare questo flag nel membro MiscFlags della struttura D3D11_BUFFER_DESC a cui il parametro pDesc dei punti ID3D11Device::CreateBuffer . Non è possibile combinare il flag di 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 è anche possibile specificare D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS in MiscFlags. Non si tratta di una limitazione delle visualizzazioni non elaborate perché i buffer costanti hanno già un vincolo che non possono essere combinati con alcuna altra visualizzazione.

Oltre ai casi non validi precedenti, quando si crea un buffer con D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS, non si è limitati alle funzionalità e non si imposta D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS. Vale a dire, è possibile usare tale buffer per l'accesso non non elaborato in qualsiasi numero di modi possibili con Direct3D. Se si specifica il flag di D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS , si aumenta solo la funzionalità disponibile.

Risorse

Nuovi tipi di risorse