Condividi tramite


Introduzione ai buffer

Una risorsa buffer è una raccolta di dati completamente tipizzati, raggruppati in elementi. I buffer archiviano i dati, ad esempio le coordinate delle trame in un buffer vertici , gli indici in un buffer indice, le costanti shader in un buffer costante , vettori di posizione, vettori normali o stato del dispositivo.

Un elemento buffer è costituito da 1 a 4 componenti. Gli elementi del buffer possono includere valori di dati compressi (ad esempio R8G8B8A8 valori di superficie), interi a 8 bit singoli o quattro valori a virgola mobile a 32 bit.

Un buffer viene creato come risorsa non strutturata. Poiché non è strutturato, un buffer non può contenere alcun livello mipmap, non può essere filtrato durante la lettura e non può essere multicampionato.

Tipi di buffer

Di seguito sono riportati i tipi di risorse buffer supportati da Direct3D 11.

Buffer dei vertici

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

L'esempio più semplice di un buffer dei vertici è uno che contiene solo i dati di posizione. Può essere visualizzato come illustrato di seguito.

illustration of a vertex buffer that contains position data

Più spesso, un buffer di vertice contiene tutti i dati necessari per specificare completamente i vertici 3D. Un esempio di questo potrebbe essere un buffer dei vertici che contiene coordinate normali e di texture per ogni posizione vertice. 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 contiene dati per vertice; ciascun vertice archivia tre elementi (coordinate di posizione, normale e texture). La posizione e la normale vengono in genere specificate usando tre float a 32 bit e le coordinate della texture usando due float a 32 bit.

Per accedere ai dati da un buffer di vertice è necessario conoscere il vertice a cui accedere, oltre ai seguenti parametri di buffer aggiuntivi:

  • Offset : il numero di byte dall'inizio del buffer ai dati per il primo vertice.
  • BaseVertexLocation : numero di byte dall'offset al primo vertice utilizzato dalla chiamata di disegno appropriata.

Prima di creare un buffer del vertice, è necessario definirne il layout. Dopo aver creato l'oggetto input-layout, associarlo alla fase Input Assembler (IA).

Buffer indice

I buffer indice contengono offset di numeri interi nei buffer dei vertici e vengono utilizzati 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 dei vertici. Un buffer di indice può essere visualizzato come illustrato di seguito.

illustration of an index buffer

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

  • Offset: numero di byte dall'indirizzo base del buffer di indice.
  • StartIndexLocation: specifica il primo elemento del buffer di indice dall'indirizzo di base e dall'offset. La posizione iniziale rappresenta il primo indice di cui eseguire il rendering.
  • IndexCount : numero di indici di cui eseguire il rendering.

Inizio di Buffer Indice = Indirizzo base del 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.

Buffer costante

Un buffer costante consente di fornire in modo efficiente i dati delle costanti shader alla pipeline. È possibile utilizzare un buffer costante per archiviare i risultati della fase di output del flusso. Concettualmente, un buffer costante è simile a un buffer di vertici a 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.

Un buffer costante può usare solo un singolo flag di associazione, che non può essere combinato con qualsiasi altro flag di associazione.

Per leggere un buffer costante shader da uno shader, usare una funzione di caricamento HLSL. Ogni fase dello shader consente fino a 15 buffer costanti shader; ogni buffer può contenere fino a 4096 costanti.

Buffer dei vertici e index buffer