Cómo: Crear un búfer de vértices

Los búferes de vértices contienen datos por vértice. En este tema se muestra cómo inicializar un búfer de vértices estático, es decir, un búfer de vértices que no cambia. Para obtener ayuda para inicializar un búfer no estático, consulte la sección comentarios .

Para inicializar un búfer de vértices estático

  1. Defina una estructura que describa un vértice. Por ejemplo, si los datos de vértice contienen datos de posición y de color, la estructura tendría un vector que describa la posición y otra que describa el color.
  2. Asigne memoria (mediante malloc o new) para la estructura que definió en el paso uno. Rellene este búfer con los datos de vértices reales que describen la geometría.
  3. Cree una descripción del búfer rellenando una estructura de D3D11_BUFFER_DESC . Pase la marca D3D11_BIND_VERTEX_BUFFER al miembro BindFlags y pase el tamaño de la estructura del paso uno al miembro ByteWidth .
  4. Cree una descripción de datos subrecursos rellenando una estructura de D3D11_SUBRESOURCE_DATA . El miembro pSysMem de la estructura D3D11_SUBRESOURCE_DATA debe apuntar directamente a los datos de recursos creados en el paso dos.
  5. Llame a ID3D11Device::CreateBuffer mientras pasa la estructura de D3D11_BUFFER_DESC , la estructura D3D11_SUBRESOURCE_DATA y la dirección de un puntero a la interfaz ID3D11Buffer para inicializar.

En el ejemplo de código siguiente se muestra cómo crear un búfer de vértices. En este ejemplo se supone que g_pd3dDevice es un 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 );
    

Comentarios

Estas son algunas maneras de inicializar un búfer de vértices que cambia con el tiempo.

  1. Cree un búfer 2º con D3D11_USAGE_STAGING; rellene el segundo búfer con ID3D11DeviceContext::Map, ID3D11DeviceContext::Unmap; use ID3D11DeviceContext::CopyResource para copiar desde el búfer de almacenamiento provisional al búfer predeterminado.
  2. Use ID3D11DeviceContext::UpdateSubresource para copiar datos de la memoria.
  3. Cree un búfer con D3D11_USAGE_DYNAMIC y llene con las marcas ID3D11DeviceContext::Map, ID3D11DeviceContext::Unmap (usando las marcas Descartar y NoOverwrite correctamente).

#1 y #2 son útiles para el contenido que cambia menos de una vez por fotograma. En general, las lecturas de GPU serán rápidas y las actualizaciones de CPU serán más lentas.

#3 es útil para el contenido que cambia más de una vez por fotograma. En general, las lecturas de GPU serán más lentas, pero las actualizaciones de CPU serán más rápidas.

Búferes

Cómo usar Direct3D 11