Практическое руководство. Создание буфера вершин

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

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

  1. Определите структуру, описывающую вершину. Например, если данные вершин содержат данные о положении и цвете, структура будет иметь один вектор, описывающий положение, а другой — цвет.
  2. Выделите память (с помощью malloc или new) для структуры, определенной на шаге 1. Заполните этот буфер фактическими данными вершин, описывающими геометрию.
  3. Создайте описание буфера, заполнив структуру D3D11_BUFFER_DESC . Передайте флаг D3D11_BIND_VERTEX_BUFFER члену BindFlags и передайте размер структуры из шага 1 в член ByteWidth .
  4. Создайте описание данных подресурсов, заполнив структуру D3D11_SUBRESOURCE_DATA . Элемент pSysMemструктуры D3D11_SUBRESOURCE_DATA должен указывать непосредственно на данные ресурса, созданные на шаге 2.
  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 будут медленнее, но обновления ЦП будут выполняться быстрее.

Buffers

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