Partilhar via


Criando um buffer de vértice (Direct3D 9)

Você cria um objeto de buffer de vértice chamando o IDirect3DDevice9::CreateVertexBuffer método, que aceita cinco parâmetros. O primeiro parâmetro especifica o comprimento do buffer de vértice, em bytes. Use o operador sizeof para determinar o tamanho de um formato de vértice, em bytes. Considere o seguinte formato de vértice personalizado.

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)

Para criar um buffer de vértice para armazenar quatro estruturas CUSTOMVERTEX, especifique [4*sizeof(CUSTOMVERTEX)] para o parâmetro Length.

O segundo parâmetro é um conjunto de controles de uso. Entre outras coisas, o seu valor determina se o buffer de vértice é capaz de conter informações de recorte - na forma de marcadores de recorte - para vértices que existem fora dos limites da área de visualização. Para criar um buffer de vértice que não possa conter sinalizadores de clipe, inclua o sinalizador D3DUSAGE_DONOTCLIP para o parâmetro Usage. O sinalizador D3DUSAGE_DONOTCLIP é aplicado apenas se o utilizador também indicar que o buffer de vértices conterá vértices transformados - o sinalizador D3DFVF_XYZRHW está incluído no parâmetro FVF. O método IDirect3DDevice9::CreateVertexBuffer ignora o sinalizador D3DUSAGE_DONOTCLIP se você indicar que o buffer conterá vértices não transformados (o sinalizador D3DFVF_XYZ). Os sinalizadores de recorte ocupam memória adicional, tornando um buffer de vértices com capacidade de recorte ligeiramente maior do que um buffer de vértices incapaz de conter sinalizadores de recorte. Como esses recursos são alocados quando o buffer de vértice é criado, é necessário solicitar antecipadamente um buffer de vértice com capacidade de recorte.

O terceiro parâmetro, FVF, é uma combinação de D3DFVF que descreve o formato de vértice do buffer de vértice. Se você especificar 0 para esse parâmetro, o buffer de vértice será um buffer de vértice não FVF. Para obter mais informações, consulte FVF Vertex Buffers (Direct3D 9). O quarto parâmetro descreve a classe de memória na qual colocar o buffer de vértice.

O parâmetro final que IDirect3DDevice9::CreateVertexBuffer aceita é o endereço de uma variável que será preenchida com um ponteiro para o novo IDirect3DVertexBuffer9 interface do objeto de buffer de vértice, se a chamada for bem-sucedida.

Não é possível produzir sinalizadores de clipe para um buffer de vértice que foi criado sem suporte para eles.

O exemplo de código C++ a seguir mostra como a criação de um buffer de vértice pode parecer no código.

   
// 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;

Buffers de vértice