Condividi tramite


Creazione di un vertex buffer (Direct3D 9)

Per creare un oggetto vertex buffer, chiamare il metodo IDirect3DDevice9::CreateVertexBuffer, che accetta cinque parametri. Il primo parametro specifica la lunghezza del buffer dei vertici, espressa in byte. Usare l'operatore sizeof per determinare le dimensioni di un formato di vertice, in byte. Si consideri il formato di vertice personalizzato seguente.

struct CUSTOMVERTEX {
        FLOAT x, y, z;
        FLOAT rhw;
        DWORD color;
        FLOAT tu, tv;   // Texture coordinates
};

// Custom flexible vertex format (FVF) describing the custom vertex structure
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1)

Per creare un buffer dei vertici per contenere quattro strutture CUSTOMVERTEX, specificare [4*sizeof(CUSTOMVERTEX)] per il parametro Length.

Il secondo parametro è un set di controlli di utilizzo. Tra le altre cose, il valore determina se il buffer dei vertici è in grado di contenere informazioni di ritaglio, sotto forma di flag di ritaglio, per i vertici presenti all'esterno dell'area di visualizzazione. Per creare un buffer dei vertici che non può contenere flag di ritaglio, includere il flag D3DUSAGE_DONOTCLIP per il parametro utilizzo. Il flag D3DUSAGE_DONOTCLIP viene applicato solo se si indica anche che il buffer dei vertici conterrà vertici trasformati. Il flag D3DFVF_XYZRHW è incluso nel parametro FVF. Il metodo IDirect3DDevice9::CreateVertexBuffer ignora il flag D3DUSAGE_DONOTCLIP se si indica che il buffer conterrà vertici non tradotti (flag D3DFVF_XYZ). I flag di ritaglio occupano memoria aggiuntiva, rendendo un buffer di vertici capace di gestire i flag di ritaglio leggermente più grande di un buffer di vertici incapace di gestirli. Poiché queste risorse vengono allocate quando viene creato il buffer dei vertici, è necessario richiedere con anticipo un buffer dei vertici ritagliabile.

Il terzo parametro, FVF, è una combinazione di D3DFVF che descrive il formato del buffer dei vertici. Se si specifica 0 per questo parametro, il buffer dei vertici è un buffer dei vertici non FVF. Per altre informazioni, vedere FVF Vertex Buffers (Direct3D 9). Il quarto parametro descrive la classe di memoria in cui posizionare il vertex buffer.

Il parametro finale che IDirect3DDevice9::CreateVertexBuffer accetta è l'indirizzo di una variabile che verrà riempita con un puntatore al nuovo IDirect3DVertexBuffer9'interfaccia dell'oggetto vertex buffer, se la chiamata ha esito positivo.

Non è possibile produrre flag di clip per un buffer dei vertici creato senza il supporto per tali buffer.

L'esempio di codice C++ seguente illustra l'aspetto della creazione di un buffer dei vertici nel codice.

   
// d3dDevice contains the address of an IDirect3DDevice9 interface
// g_pVB is a variable of type LPDIRECT3DVERTEXBUFFER9 

// The custom vertex type
struct CUSTOMVERTEX {
    FLOAT x, y, z;
    FLOAT rhw;
    DWORD color;
    FLOAT tu, tv;   // The texture coordinates
};

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1)

// Create a clipping-capable vertex buffer. Allocate enough memory 
// in the default memory pool to hold three CUSTOMVERTEX 
// structures

    if( FAILED( d3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),
            0 /*Usage*/, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
        return E_FAIL;

Buffer di vertici