Como criar um buffer de vértice

Os buffers de vértice contêm dados por vértice. Este tópico mostra como inicializar um buffer de vértice estático, ou seja, um buffer de vértice que não é alterado. Para obter ajuda para inicializar um buffer não estático, consulte a seção comentários .

Para inicializar um buffer de vértice estático

  1. Defina uma estrutura que descreva um vértice. Por exemplo, se os dados de vértice contiver dados de posição e dados de cor, sua estrutura terá um vetor que descreve a posição e outro que descreve a cor.
  2. Aloque memória (usando malloc ou novo) para a estrutura que você definiu na etapa um. Preencha esse buffer com os dados de vértice reais que descrevem sua geometria.
  3. Crie uma descrição do buffer preenchendo uma estrutura D3D11_BUFFER_DESC . Passe o sinalizador D3D11_BIND_VERTEX_BUFFER para o membro BindFlags e passe o tamanho da estrutura da etapa um para o membro ByteWidth .
  4. Crie uma descrição de dados de sub-recurso preenchendo uma estrutura D3D11_SUBRESOURCE_DATA . O membro pSysMem da estrutura D3D11_SUBRESOURCE_DATA deve apontar diretamente para os dados de recurso criados na etapa dois.
  5. Chame ID3D11Device::CreateBuffer ao passar a estrutura D3D11_BUFFER_DESC , a estrutura D3D11_SUBRESOURCE_DATA e o endereço de um ponteiro para a interface ID3D11Buffer a ser inicializada.

O exemplo de código a seguir demonstra como criar um buffer de vértice. Este exemplo pressupõe que g_pd3dDevice é um objeto ID3D11Device válido.

ID3D11Buffer*      g_pVertexBuffer;

// Define the data-type that
// describes a vertex.
struct SimpleVertexCombined
{
    XMFLOAT3 Pos;  
    XMFLOAT3 Col;  
};

// Supply the actual vertex data.
SimpleVertexCombined verticesCombo[] =
{
    XMFLOAT3( 0.0f, 0.5f, 0.5f ),
    XMFLOAT3( 0.0f, 0.0f, 0.5f ),
    XMFLOAT3( 0.5f, -0.5f, 0.5f ),
    XMFLOAT3( 0.5f, 0.0f, 0.0f ),
    XMFLOAT3( -0.5f, -0.5f, 0.5f ),
    XMFLOAT3( 0.0f, 0.5f, 0.0f ),
};

// Fill in a buffer description.
D3D11_BUFFER_DESC bufferDesc;
bufferDesc.Usage            = D3D11_USAGE_DEFAULT;
bufferDesc.ByteWidth        = sizeof( SimpleVertexCombined ) * 3;
bufferDesc.BindFlags        = D3D11_BIND_VERTEX_BUFFER;
bufferDesc.CPUAccessFlags   = 0;
bufferDesc.MiscFlags        = 0;

// Fill in the subresource data.
D3D11_SUBRESOURCE_DATA InitData;
InitData.pSysMem = verticesCombo;
InitData.SysMemPitch = 0;
InitData.SysMemSlicePitch = 0;

// Create the vertex buffer.
hr = g_pd3dDevice->CreateBuffer( &bufferDesc, &InitData, &g_pVertexBuffer );
    

Comentários

Aqui estão algumas maneiras de inicializar um buffer de vértice que muda ao longo do tempo.

  1. Criar um 2º buffer com D3D11_USAGE_STAGING; preencha o segundo buffer usando ID3D11DeviceContext::Map, ID3D11DeviceContext::Unmap; use ID3D11DeviceContext::CopyResource para copiar do buffer de preparo para o buffer padrão.
  2. Use ID3D11DeviceContext::UpdateSubresource para copiar dados da memória.
  3. Crie um buffer com D3D11_USAGE_DYNAMIC e preencha-o com ID3D11DeviceContext::Map, ID3D11DeviceContext::Unmap (usando os sinalizadores Discard e NoOverwrite adequadamente).

Nº 1 e nº 2 são úteis para conteúdo que muda menos de uma vez por quadro. Em geral, as leituras de GPU serão rápidas e as atualizações de CPU serão mais lentas.

Nº 3 é útil para conteúdo que muda mais de uma vez por quadro. Em geral, as leituras de GPU serão mais lentas, mas as atualizações de CPU serão mais rápidas.

Buffers

Como usar o Direct3D 11