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