Практическое руководство. Создание буфера вершин
Буферы вершин содержат данные для каждой вершины. В этом разделе показано, как инициализировать статический буфер вершин, то есть буфер вершин, который не изменяется. Справку по инициализации нестатических буферов см. в разделе примечаний .
Инициализация статического буфера вершин
- Определите структуру, описывающую вершину. Например, если данные вершин содержат данные о положении и цвете, структура будет иметь один вектор, описывающий положение, а другой — цвет.
- Выделите память (с помощью malloc или new) для структуры, определенной на шаге 1. Заполните этот буфер фактическими данными вершин, описывающими геометрию.
- Создайте описание буфера, заполнив структуру D3D11_BUFFER_DESC . Передайте флаг D3D11_BIND_VERTEX_BUFFER члену BindFlags и передайте размер структуры из шага 1 в член ByteWidth .
- Создайте описание данных подресурсов, заполнив структуру D3D11_SUBRESOURCE_DATA . Элемент pSysMemструктуры D3D11_SUBRESOURCE_DATA должен указывать непосредственно на данные ресурса, созданные на шаге 2.
- Вызовите 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 );
Комментарии
Ниже приведены некоторые способы инициализации буфера вершин, которые изменяются с течением времени.
- Создайте второй буфер с D3D11_USAGE_STAGING; заполните второй буфер с помощью ID3D11DeviceContext::Map, ID3D11DeviceContext::Unmap; используйте ID3D11DeviceContext::CopyResource для копирования из промежуточного буфера в буфер по умолчанию.
- Используйте ID3D11DeviceContext::UpdateSubresource для копирования данных из памяти.
- Создайте буфер с D3D11_USAGE_DYNAMIC и заполните его id3D11DeviceContext::Map, ID3D11DeviceContext::Unmap (с соответствующими флагами Отменить и NoOverwrite).
#1 и 2 полезны для содержимого, которое изменяется менее одного раза на кадр. Как правило, операции чтения GPU будут выполняться быстро, а обновления ЦП — медленнее.
#3 полезен для содержимого, которое изменяется несколько раз на кадр. Как правило, операции чтения с GPU будут медленнее, но обновления ЦП будут выполняться быстрее.
Связанные темы