Introduzione ai buffer in Direct3D 11

Una risorsa buffer è una raccolta di dati completamente tipizzata raggruppata in elementi. È possibile usare i buffer per archiviare un'ampia gamma di dati, tra cui vettori di posizione, vettori normali, coordinate di trama in un buffer vertex, indici in un buffer di indice o uno stato del dispositivo. Un elemento buffer è costituito da 1 a 4 componenti. Gli elementi del buffer possono includere valori di dati compressi (ad esempio I valori di superficie R8G8B8A8), interi a 8 bit o quattro valori a virgola mobile a 32 bit.

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

Tipi di buffer

Di seguito sono riportati i tipi di risorse buffer supportati da Direct3D 11. Tutti i tipi di buffer vengono incapsulati dall'interfaccia ID3D11Buffer .

Vertex Buffer

Un buffer dei vertici contiene i dati dei vertici usati per definire la geometria. I dati dei vertici includono coordinate di posizione, dati di colore, dati delle coordinate della trama, dati normali e così via.

L'esempio più semplice di un buffer del vertice è uno che contiene solo i dati di posizione. Può essere visualizzato come la figura seguente.

illustration of a vertex buffer that contains position data

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.

illustration of a vertex buffer that contains position, normal, and texture data

Questo buffer dei vertici contiene dati per vertice; 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, oltre ai seguenti parametri di buffer aggiuntivi:

  • Offset: numero di byte dall'inizio del buffer ai dati per il primo vertice. È possibile specificare l'offset usando il metodo ID3D11DeviceContext::IASetVertexBuffers .
  • BaseVertexLocation: numero di byte dall'offset al primo vertice usato dalla chiamata di disegno appropriata.

Prima di creare un buffer vertex, è necessario definire il layout creando un'interfaccia ID3D11InputLayout ; questa operazione viene eseguita chiamando il metodo ID3D11Device::CreateInputLayout . Dopo aver creato l'oggetto input-layout, è possibile associarlo alla fase di input-assembler chiamando ID3D11DeviceContext::IASetInputLayout.

Per creare un buffer dei vertici, chiamare ID3D11Device::CreateBuffer.

Buffer di indice

I buffer di indice contengono offset integer nei buffer dei vertici e vengono usati per eseguire il rendering delle primitive in modo più efficiente. 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. Un buffer di indice può essere visualizzato come la figura seguente.

illustration of an index buffer

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

Inizio del buffer di indice = Indirizzo base buffer di indice + Offset (byte) + StartIndexLocation * ElementSize (byte);

In questo calcolo ElementSize è la dimensione di ogni elemento del buffer di indice, ovvero due o quattro byte.

Per creare un buffer di indice, chiamare ID3D11Device::CreateBuffer.

Buffer costante

Un buffer costante consente di fornire in modo efficiente i dati delle costanti shader alla pipeline. È possibile usare un buffer costante per archiviare i risultati della fase di output del flusso. Concettualmente, un buffer costante è simile a un buffer di vertice a un singolo elemento, come illustrato nella figura seguente.

illustration of a shader-constant buffer

Ogni elemento archivia una costante componente da 1 a 4, determinata dal formato dei dati archiviati. Per creare un buffer costante shader, chiamare ID3D11Device::CreateBuffer e specificare il membro D3D11_BIND_CONSTANT_BUFFERdel tipo enumerato D3D11_BIND_FLAG.

Un buffer costante può usare solo un singolo flag di associazione (D3D11_BIND_CONSTANT_BUFFER), che non può essere combinato con qualsiasi altro flag di associazione. Per associare un buffer costante shader alla pipeline, chiamare uno dei metodi seguenti: ID3D11DeviceContext::GSSetConstantBuffers, ID3D11DeviceContext::P SSetConstantBuffers o ID3D11DeviceContext::VSSetConstantBuffers.

Per leggere un buffer costante shader da uno shader, usare una funzione di carico HLSL (ad esempio Load). Ogni fase shader consente fino a 15 buffer costanti shader; ogni buffer può contenere fino a 4096 costanti.

Buffer