Acessando o conteúdo de um buffer de vértice (Direct3D 9)

Os objetos de buffer de vértice permitem que os aplicativos acessem diretamente a memória alocada para dados de vértice. Você pode recuperar um ponteiro para a memória do buffer de vértice chamando o método IDirect3DVertexBuffer9::Lock e acessando a memória conforme necessário para preencher o buffer com novos dados de vértice ou para ler os dados que ele já contém. O método IDirect3DVertexBuffer9::Lock aceita quatro parâmetros. O primeiro, OffsetToLock, é o deslocamento para os dados de vértice. O segundo parâmetro é o tamanho, medido em bytes, dos dados de vértice. O terceiro parâmetro aceito é o endereço de um ponteiro que aponta para os dados de vértice, se a chamada for bem-sucedida.

O último parâmetro, Flags, informa ao sistema como a memória deve ser bloqueada. Especifique constantes para o parâmetro Flags de acordo com a maneira como os dados de vértice serão acessados. Verifique se o valor escolhido para D3DUSAGE corresponde ao valor escolhido para D3DLOCK. Por exemplo, se você estiver criando um buffer de vértice somente com acesso de gravação, não faz sentido tentar ler os dados especificando D3DLOCK_READONLY. O uso inteligente desses sinalizadores permite que o driver bloqueie a memória e forneça o melhor desempenho, dado o tipo de acesso solicitado.

Depois de terminar de preencher ou ler os dados de vértice, chame o método IDirect3DVertexBuffer9::Unlock , conforme mostrado no exemplo de código a seguir.

// 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 você criar um buffer de vértice com o sinalizador D3DUSAGE_WRITEONLY, não use o sinalizador de bloqueio D3DLOCK_READONLY. Use o sinalizador D3DLOCK_READONLY se o aplicativo ler somente da memória do buffer de vértice. A inclusão desse sinalizador permite que o Direct3D otimize seus procedimentos internos para melhorar a eficiência, dado que o acesso à memória será somente leitura.

Consulte Usando buffers de vértice dinâmico e índice para obter informações sobre como usar D3DLOCK_DISCARD ou D3DLOCK_NOOVERWRITE para o parâmetro Flags de IDirect3DVertexBuffer9::Lock.

No C++, como você acessa diretamente a memória alocada para o buffer de vértice, verifique se o aplicativo acessa corretamente a memória alocada. Caso contrário, você corre o risco de tornar essa memória inválida. Use o passo do formato de vértice que seu aplicativo usa para mover de um vértice no buffer alocado para outro. A memória do buffer de vértice é uma matriz simples de vértices especificados em FVF. Use o passo de qualquer estrutura de formato de vértice que você definir. Você pode calcular o passo de cada vértice em tempo de execução examinando o D3DFVF contido na descrição do buffer de vértice. A tabela a seguir mostra o tamanho de cada componente de vértice.

Sinalizador de formato de vértice Tamanho
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

 

O número de coordenadas de textura presentes no formato de vértice é descrito pelo D3DFVF_TEX n sinalizadores (em que n é um valor de 0 a 8). Multiplique o número de conjuntos de coordenadas de textura pelo tamanho de um conjunto de coordenadas de textura, que pode variar de um a quatro floats, para calcular a memória necessária para esse número de coordenadas de textura.

Use o passo de vértice total para incrementar e diminuir o ponteiro de memória conforme necessário para acessar determinados vértices.

Recuperando descrições do buffer de vértice

Você pode recuperar informações sobre um buffer de vértice chamando o método IDirect3DVertexBuffer9::GetDesc . Esse método preenche os membros da estrutura D3DVERTEXBUFFER_DESC com informações sobre o buffer de vértice.

Buffers de vértice