Поделиться через


Как создать буфер вершин

Вершинные буферы содержат данные на вершину. В этом разделе показано, как инициализировать статический буфер вершин , то есть буфер вершин, который не изменяется. Для получения информации о инициализации нестатического буфера см. в разделе примечания.

Инициализация статического буфера вершин

  1. Определите структуру, описывающую вершину. Например, если данные вершин содержат данные позиции и цветные данные, структура будет иметь один вектор, описывающий позицию и другую, описывающую цвет.
  2. Выделите память (с помощью malloc или new) для структуры, которую вы определили на первом шаге. Заполните этот буфер фактическими данными вершин, описывающими геометрию.
  3. Создайте описание буфера, заполнив структуру D3D11_BUFFER_DESC. Передайте флаг D3D11_BIND_VERTEX_BUFFER в элемент BindFlags и передайте размер структуры с первого шага на элемент ByteWidth.
  4. Создайте описание данных подресурса, заполнив структуру D3D11_SUBRESOURCE_DATA. Элемент pSysMem структуры D3D11_SUBRESOURCE_DATA должен указывать непосредственно на данные ресурса, созданные на втором шаге.
  5. Вызовите ID3D11Device::CreateBuffer при передаче структуры D3D11_BUFFER_DESC, структуры D3D11_SUBRESOURCE_DATA и адреса указателя на интерфейс ID3D11Buffer для инициализации.

В следующем примере кода показано, как создать буфер вершин. В этом примере предполагается, что g_pd3dDevice является допустимым объектом ID3D11Device.

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

Замечания

Ниже приведены некоторые способы инициализации буфера вершин, который изменяется с течением времени.

  1. Создайте второй буфер с D3D11_USAGE_STAGING; заполните этот буфер с помощью ID3D11DeviceContext::Mapи ID3D11DeviceContext::Unmap; используйте ID3D11DeviceContext::CopyResource для копирования из промежуточного буфера в буфер по умолчанию.
  2. Используйте ID3D11DeviceContext::UpdateSubresource для копирования данных из памяти.
  3. Создайте буфер с D3D11_USAGE_DYNAMICи заполните его с помощью ID3D11DeviceContext::Mapи ID3D11DeviceContext::Unmap (используя флаги "Сбросить" и "NoOverwrite" по необходимости).

#1 и #2 полезны для содержимого, которое изменяется менее одного раза на кадр. Как правило, операции чтения GPU будут быстрыми, а обновления ЦП будут медленнее.

#3 полезно для содержимого, которое изменяется более одного раза на кадр. Как правило, операции чтения GPU будут медленнее, но обновления ЦП будут быстрее.

буферы

Использование Direct3D 11