Accesso al contenuto di un vertex buffer (Direct3D 9)

Gli oggetti vertex buffer consentono alle applicazioni di accedere direttamente alla memoria allocata per i dati dei vertici. È possibile recuperare un puntatore alla memoria del vertex buffer chiamando il metodo IDirect3DVertexBuffer9::Lock e quindi accedendo alla memoria in base alle esigenze per riempire il buffer con nuovi dati dei vertici o per leggere i dati già contenuti. Il metodo IDirect3DVertexBuffer9::Lock accetta quattro parametri. Il primo, OffsetToLock, è l'offset nei dati dei vertici. Il secondo parametro è la dimensione, misurata in byte, dei dati dei vertici. Il terzo parametro accettato è l'indirizzo di un puntatore che punta ai dati dei vertici, se la chiamata ha esito positivo.

L'ultimo parametro , Flags, indica al sistema come deve essere bloccata la memoria. Specificare le costanti per il parametro Flags in base alla modalità di accesso ai dati dei vertici. Assicurarsi che il valore scelto per D3DUSAGE corrisponda al valore scelto per D3DLOCK. Ad esempio, se si crea un buffer dei vertici solo con accesso in scrittura, non è opportuno provare a leggere i dati specificando D3DLOCK_READONLY. L'uso saggio di questi flag consente al driver di bloccare la memoria e fornire le migliori prestazioni, in base al tipo di accesso richiesto.

Dopo aver completato la compilazione o la lettura dei dati dei vertici, chiamare il metodo IDirect3DVertexBuffer9::Unlock , come illustrato nell'esempio di codice seguente.

// This code example assumes the g_pVB is a variable of type 
//   LPDIRECT3DVERTEXBUFFER9 and that g_Vertices has been  
//   properly initialized with vertices

// Lock the buffer to gain access to the vertices 
VOID* pVertices;

if(FAILED(g_pVB->Lock(0, sizeof(g_Vertices), 
        (BYTE**)&pVertices, 0 ) ) ) 
    return E_FAIL;

memcpy(pVertices, g_Vertices, sizeof(g_Vertices));
g_pVB->Unlock();

Se si crea un buffer dei vertici con il flag D3DUSAGE_WRITEONLY, non usare il flag di blocco D3DLOCK_READONLY. Usare il flag D3DLOCK_READONLY se l'applicazione leggerà solo dalla memoria del buffer dei vertici. L'inclusione di questo flag consente a Direct3D di ottimizzare le procedure interne per migliorare l'efficienza, dato che l'accesso alla memoria sarà di sola lettura.

Per informazioni sull'uso di D3DLOCK_DISCARD o D3DLOCK_NOOVERWRITE per il parametro Flags di IDirect3DVertexBuffer9::Lock, vedere Uso di vertex e buffer di indice dinamici.

In C++, poiché si accede direttamente alla memoria allocata per il vertex buffer, assicurarsi che l'applicazione accesa correttamente alla memoria allocata. In caso contrario, si rischia di eseguire il rendering della memoria non valida. Usare lo stride del formato vertice usato dall'applicazione per passare da un vertice nel buffer allocato a un altro. La memoria del buffer dei vertici è una matrice semplice di vertici specificati in FVF. Usare lo stride della struttura del formato dei vertici definita. È possibile calcolare lo stride di ogni vertice in fase di esecuzione esaminando la D3DFVF contenuta nella descrizione del buffer dei vertici. La tabella seguente illustra le dimensioni per ogni componente vertice.

Flag di formato vertice Dimensione
D3DFVF_DIFFUSE sizeof(DWORD)
D3DFVF_NORMAL sizeof(float) x 3
D3DFVF_SPECULAR sizeof(DWORD)
D3DFVF_TEXn sizeof(float) x n
D3DFVF_XYZ sizeof(float) x 3
D3DFVF_XYZRHW sizeof(float) x 4

 

Il numero di coordinate di trama presenti nel formato dei vertici è descritto dai flag D3DFVF_TEX n (dove n è un valore compreso tra 0 e 8). Moltiplicare il numero di set di coordinate della trama in base alle dimensioni di un set di coordinate di trama, che possono variare da uno a quattro valori float, per calcolare la memoria necessaria per tale numero di coordinate di trama.

Usare il vertex stride totale per incrementare e decrementare il puntatore di memoria in base alle esigenze per accedere a vertici specifici.

Recupero delle descrizioni del buffer dei vertici

È possibile recuperare informazioni su un vertex buffer chiamando il metodo IDirect3DVertexBuffer9::GetDesc . Questo metodo riempie i membri della struttura D3DVERTEXBUFFER_DESC con informazioni sul vertex buffer.

Vertex Buffers