Tipi di risorse (Direct3D 10)

Tutte le risorse usate dalla pipeline Direct3D derivano da due tipi di risorse di base: buffer e trame. Un buffer è una raccolta di dati non elaborati (elementi); una trama è una raccolta di texel (elementi trama).

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

Elemento Descrizione
Digitato
Specificare completamente il tipo quando viene creata la risorsa.
Senza tipi
Specificare completamente il tipo quando la risorsa è associata alla pipeline.

 

Risorse del buffer

Una risorsa buffer è una raccolta di dati completamente tipizzata; internamente, un buffer contiene elementi. Un elemento è costituito da 1 a 4 componenti. Esempi di tipi di dati di elemento includono: un valore di dati compresso (ad esempio R8G8B8A8), un intero a 8 bit singolo, quattro valori float a 32 bit. Questi tipi di dati vengono usati per archiviare dati, ad esempio un vettore di posizione, un vettore normale, una coordinata di trama in un buffer dei vertici, un indice in un buffer di indice o uno stato del dispositivo.

Viene creato un buffer come risorsa non strutturata. Poiché non è strutturata, un buffer non può contenere alcun livello di mipmap, non viene filtrato quando si legge e non può essere multicampionato.

Tipi di buffer

Vertex Buffer

Un buffer è una raccolta di elementi; un buffer dei vertici contiene dati per vertice. L'esempio più semplice è un buffer del vertice che contiene un tipo di dati, ad esempio i dati di posizione. Può essere visualizzato come la figura seguente.

illustrazione di un buffer del vertice che contiene i dati di posizione

Più spesso, un buffer dei vertici contiene tutti i dati necessari per specificare completamente vertici 3D. Un esempio di questo potrebbe essere un buffer del vertice che contiene coordinate di vertice, normali e trama. Questi dati sono in genere organizzati come set di elementi per vertice, come illustrato nella figura seguente.

illustrazione di un buffer del vertice che contiene dati di posizione, normale e trama

Questo buffer dei vertici contiene i dati per vertice per otto vertici; ogni vertice archivia tre elementi (coordinate di posizione, normale e trama). La posizione e la normale sono in genere specificate usando tre float a 32 bit (DXGI_FORMAT_R32G32B32_FLOAT) e le coordinate della trama usando due float a 32 bit (DXGI_FORMAT_R32G32_FLOAT).

Per accedere ai dati da un buffer dei vertici, è necessario conoscere quale vertice accedere e questi altri parametri del buffer:

  • Offset: numero di byte dall'inizio del buffer ai dati per il primo vertice. L'offset viene fornito a IASetVertexBuffers.
  • BaseVertexLocation: numero di byte dall'offset al primo vertice usato dalla chiamata di disegno appropriata (vedere Metodi di disegno).

Prima di creare un buffer del vertice, è necessario definire il layout creando un oggetto layout di input; questa operazione viene eseguita chiamando CreateInputLayout. Dopo aver creato l'oggetto input-layout, associarlo alla fase di input-assembler chiamando IASetInputLayout.

Per creare un buffer dei vertici, chiamare CreateBuffer.

Buffer di indice

Un buffer di indice contiene un set sequenziale di indici a 16 bit o a 32 bit; ogni indice viene usato per identificare un vertice in un buffer vertex. L'uso di un buffer di indice con uno o più buffer di vertice per fornire dati alla fase IA viene chiamato indicizzazione. Un buffer di indice può essere visualizzato come la figura seguente.

illustrazione di un buffer di indice

Gli indici sequenziali archiviati in un buffer di indice si trovano con i parametri seguenti:

  • Offset: numero di byte dall'inizio del buffer al primo indice. L'offset viene fornito a IASetIndexBuffer.
  • StartIndexLocation: numero di byte dall'offset al primo vertice usato dalla chiamata di disegno appropriata (vedere Metodi di disegno).
  • IndexCount: numero di indici da eseguire per il rendering.

Per creare un buffer di indice, chiamare CreateBuffer.

Un buffer di indice può unire più strisce di riga o triangolo separando ognuno con un indice di taglio a striscia. Un indice di taglio a striscia consente di disegnare più strisce di linee o triangoli con una singola chiamata di disegno. Un indice di taglio a strip è semplicemente il valore massimo possibile per l'indice (0xffff per un indice a 16 bit, 0xffffffff per un indice a 32 bit). L'indice strip-cut reimposta l'ordine di avvolgimento nelle primitive indicizzate e può essere usato per rimuovere la necessità di degenerare triangoli che potrebbero essere altrimenti necessari per mantenere l'ordine di avvolgimento appropriato in una striscia di triangoli. La figura seguente mostra un esempio di indice di taglio a striscia.

illustrazione di un indice di taglio a strip

Buffer costante

Direct3D 10 ha introdotto un nuovo buffer per fornire costanti shader denominate buffer costante shader o semplicemente un buffer costante. Concettualmente, è simile a un buffer di vertice a singolo elemento, come illustrato nella figura seguente.

illustrazione di un buffer costante shader

Ogni elemento archivia una costante componente da 1 a 4, determinata dal formato dei dati archiviati.

I buffer costanti riducono la larghezza di banda necessaria per aggiornare le costanti shader consentendo l'raggruppamento di costanti shader e il commit contemporaneamente anziché effettuare singole chiamate per eseguire il commit di ogni costante separatamente.

Per creare un buffer costante shader, chiamare CreateBuffer e specificare il flag di associazione del buffer costante D3D10_BIND_CONSTANT_BUFFER (vedere D3D10_BIND_FLAG).

Per associare un buffer costante shader alla pipeline, chiamare uno di questi metodi: GSSetConstantBuffers, PSSetConstantBuffers o VSSetConstantBuffers.

Si noti che quando si usa l'interfaccia ID3D10Effect il processo di creazione, associazione e comittente di un buffer costante viene gestito dall'istanza dell'interfaccia ID3D10Effect . In questo caso è solo nescesary per ottenere la variabile dall'effetto con uno dei metodi GetVariable, ad esempio GetVariableByName e aggiornare la variabile con uno dei metodi SetVariable, ad esempio SetMatrix. Per un esempio di uso dell'interfaccia ID3D10Effect per gestire un buffer costante, vedere esercitazione 07.

Un shader continua a leggere le variabili in un buffer costante direttamente in base al nome della variabile nello stesso modo in cui le variabili che non fanno parte di un buffer costante vengono letti.

Ogni fase shader consente fino a 15 buffer costanti shader; ogni buffer può contenere fino a 4096 costanti.

Usare un buffer costante per archiviare i risultati della fase di output del flusso.

Vedere Costanti shader (DirectX HLSL) per un esempio di dichiarazione di un buffer costante in uno shader.

Risorse trama

Una risorsa trama è una raccolta strutturata di dati progettata per archiviare texel. A differenza dei buffer, le trame possono essere filtrate dai campioni di trama mentre sono letti da unità shader. Il tipo di trama influisce sulla modalità di filtro della trama. Un texel rappresenta l'unità più piccola di una trama che può essere letto o scritto dalla pipeline. Ogni texel contiene 1 a 4 componenti, disposti in uno dei formati DXGI (vedere DXGI_FORMAT).

Le trame vengono create come risorsa strutturata in modo che le dimensioni siano note. Tuttavia, ogni trama può essere digitata o digitata meno in fase di creazione delle risorse, purché il tipo sia completamente specificato usando una visualizzazione quando la trama è associata alla pipeline.

Tipi di trama

Esistono diversi tipi di trame: 1D, 2D, 3D, ognuno dei quali può essere creato con o senza mipmap. Direct3D 10 supporta anche matrici di trame e trame multicampionato.

Trama 1D

Una trama 1D nella sua forma più semplice contiene dati di trama che possono essere indirizzati con una singola coordinata di trama; può essere visualizzato come una matrice di texel, come illustrato nella figura seguente.

illustrazione di una trama 1d

Ogni texel contiene un numero di componenti di colore a seconda del formato dei dati archiviati. Aggiungendo una maggiore complessità, è possibile creare una trama 1D con livelli mipmap, come illustrato nella figura seguente.

illustrazione di una trama 1d con livelli mipmap

Un livello mipmap è una trama che è una potenza di due più piccolo del livello superiore. Il livello più alto contiene il maggior dettaglio, ogni livello successivo è più piccolo; per un mipmap 1D, il livello più piccolo contiene un texel. I livelli diversi sono identificati da un indice denominato LOD (livello di dettaglio); è possibile usare il LOD per accedere a una trama più piccola quando si esegue il rendering della geometria che non è così vicina alla fotocamera.

Matrice di trame 1D

Direct3D 10 ha anche una nuova struttura di dati per una matrice di trame. Una matrice di trame 1D è concettualmente simile alla figura seguente.

illustrazione di una matrice di trame 1d

Questa matrice di trame contiene tre trame. Ognuna delle tre trame ha una larghezza di trama pari a 5 (ovvero il numero di elementi nel primo livello). Ogni trama contiene anche un mipmap a 3 livelli.

Tutte le matrici di trame in Direct3D sono una matrice omogenea di trame; Ciò significa che ogni trama in una matrice di trame deve avere lo stesso formato di dati e dimensioni (inclusi la larghezza della trama e il numero di livelli mipmap). È possibile creare matrici di trame di dimensioni diverse, purché tutte le trame in ogni matrice corrispondano a dimensioni.

Trama 2D e matrice di trame 2D

Una risorsa Texture2D contiene una griglia 2D di texel. Ogni texel è indirizzabile da un vettore u, v. Poiché si tratta di una risorsa trama, può contenere livelli mipmap e sottorisorse. Una risorsa trama 2D completamente popolata è simile alla figura seguente.

illustrazione di una risorsa trama 2d

Questa risorsa trama contiene una singola trama 3x5 con tre livelli mipmap.

Una risorsa Texture2DArray è una matrice omogenea di trame 2D; ovvero, ogni trama ha lo stesso formato di dati e dimensioni (inclusi i livelli mipmap). Ha un layout simile a quello della matrice di trame 1D, ad eccezione del fatto che le trame ora contengono dati 2D e pertanto è simile alla figura seguente.

illustrazione di una matrice di risorse trama 2d

Questa matrice di trame contiene tre trame; ogni trama è 3x5 con due livelli mipmap.

Uso di texture2DArray come cubo trama

Un cubo trama è una matrice di trame 2D che contiene 6 trame, una per ogni viso del cubo. Un cubo di trama completamente popolato è simile alla figura seguente.

illustrazione di una matrice di risorse trama 2d che rappresentano un cubo di trama

Una matrice di trame 2D che contiene 6 trame può essere letta dall'interno degli shader con le funzioni intrinseche della mappa cubo, dopo che sono associate alla pipeline con una visualizzazione a trama cubo. I cubi trama vengono indirizzati dallo shader con un vettore 3D che punta dal centro del cubo di trama.

Trama 3D

Una risorsa Texture3D (nota anche come trama del volume) contiene un volume 3D di texel. Poiché si tratta di una risorsa trama, può contenere livelli mipmap. Una trama 3D completamente popolata è simile alla figura seguente.

illustrazione di una risorsa trama 3d

Quando una sezione mipmap trama 3D è associata come output di destinazione di rendering (con una visualizzazione di destinazione di rendering), la trama 3D si comporta in modo identico a una matrice di trame 2D con n sezioni. La sezione di rendering specifica viene scelta dalla fase geometry-shader dichiarando un componente scalare dei dati di output come valore di sistema SV_RenderTargetArrayIndex.

Non esiste alcun concetto di matrice di trame 3D; pertanto una sottorisorsa trama 3D è un singolo livello mipmap.

Sottorisorse

L'API Direct3D 10 fa riferimento a intere risorse o subset di risorse. Per specificare una parte delle risorse, Direct3D ha coniato il termine sottorisorse, il che significa un subset di una risorsa.

Un buffer viene definito come una singola sottorisorsa. Le trame sono un po' più complesse perché esistono diversi tipi di trama (1D, 2D e così via) alcuni dei quali supportano livelli mipmap e/o matrici di trame. A partire dal caso più semplice, una trama 1D viene definita come una singola sottorisorsa, come illustrato nella figura seguente.

illustrazione di una trama 1d

Ciò significa che la matrice di texel che costituiscono una trama 1D è contenuta in una singola sottorisorsa.

Se si espande una trama 1D con tre livelli mipmap, può essere visualizzato come segue.

illustrazione di una trama 1d con livelli mipmap

Si consideri questa come una singola trama costituita da tre sottotexture. Ogni sottotextura viene conteggiata come sottorisorsa, quindi questa trama 1D contiene 3 sottorisorse. Una sottotextura (o sottorisorsa) può essere indicizzata usando il livello di dettaglio (LOD) per una singola trama. Quando si usa una matrice di trame, l'accesso a una determinata sottotextura richiede sia il LOD che la trama specifica. In alternativa, l'API combina queste due informazioni in un singolo indice di sottorisorsa in base zero, come illustrato di seguito.

illustrazione di un indice di sottorisorsa in base zero

Selezione di sottorisorse

Alcune API accedono a un'intera risorsa (ad esempio CopyResource), altre accedono a una parte di una risorsa, ad esempio UpdateSubresource o CopySubresourceRegion. L'API che accede a una parte di una risorsa usa in genere una descrizione di visualizzazione (ad esempio D3D10_TEX2D_ARRAY_DSV) per specificare le sottorisorse a cui accedere.

Queste figure illustrano i termini usati da una descrizione di visualizzazione quando si accede a una matrice di trame.

Sezione matrice

Data una matrice di trame, ogni trama con mipmap, una sezione di matrice (rappresentata dal rettangolo bianco) include una trama e tutte le relative sottotexture, come illustrato nella figura seguente.

illustrazione di una matrice splice

Sezione Mip

Una sezione mip (rappresentata dal rettangolo bianco) include un livello mipmap per ogni trama in una matrice, come illustrato nella figura seguente.

illustrazione di una mip splice

Selezione di una singola sottorisorsa

È possibile usare questi due tipi di sezioni per scegliere una singola sottorisorsa, come illustrato nella figura seguente.

illustrazione della scelta di una sottorisorsa usando una sezione di matrice e una mip splice

Selezione di più sottorisorse

In alternativa, è possibile usare questi due tipi di sezioni con il numero di livelli mipmap e/o il numero di trame, per scegliere più sottorisorse.

illustrazione della scelta di più sottorisorse

Indipendentemente dal tipo di trama in uso, con o senza mipmap, con o senza una matrice di trame, è possibile usare la funzione helper D3D10CalcSubresource per calcolare l'indice di una determinata sottorisorsa.

Tipizzazione forte e debole

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 è possibile eseguire il mapping dall'applicazione. Le risorse create con un tipo specifico non possono essere reinterpretate usando il meccanismo di visualizzazione.

In un tipo meno risorsa, il tipo di dati è sconosciuto al momento della creazione della risorsa. L'applicazione deve scegliere tra il tipo disponibile meno formati (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 di dati esatto (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 visualizzazione. 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 offre il vantaggio che può essere riutilizzata o reinterpretata (in un altro formato) purché il bit componente del nuovo formato corrisponda al numero di bit del formato precedente.

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 un DXGI_FORMAT_R32G32B32A32_UINT in posizioni diverse nella pipeline contemporaneamente.

Risorse (Direct3D 10)