Direct3D C++ API, как обновить буфер вершин?

Так как же можно обновить значения в буфере вершин, привязанные к объекту устройства, используя IASetVertexBuffers метод? Также будет изменение значений в этом буфере перед вызовом Draw() а также Present()? Также будет ли изображение обновляться в соответствии с этими новыми значениями в буфере?

1 ответ

Решение

Чтобы обновить буфер вершин процессором, вы должны сначала создать динамический буфер вершин, который позволит процессору записывать в него данные. Для этого позвоните ID3D11Device::CreateBufferс Usage установлен в D3D11_USAGE_DYNAMIC а также CPUAccessFlags установлен в D3D11_CPU_ACCESS_WRITE, Пример:

D3D11_BUFFER_DESC desc;
ZeroMemory( &desc, sizeof( desc ) );
desc.Usage = D3D11_USAGE_DYNAMIC;
desc.ByteWidth = size;
desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
d3dDevice->CreateBuffer( &desc, initialVertexData, &vertexBuffer );

Теперь, когда у вас есть динамический буфер вершин, вы можете обновить его, используя ID3D11DeviceContext::Map и ID3D11DeviceContext:: Unmap. Пример:

D3D11_MAPPED_SUBRESOURCE resource;
d3dDeviceContext->Map( vertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &resource );
memcpy( resource.pData, sourceData, vertexDataSize );
d3dDeviceContext->Unmap( vertexBuffer, 0 );

где sourceData - это новые данные вершин, которые вы хотите поместить в буфер.

Это один из методов обновления буфера вершин, когда вы загружаете новый набор данных вершин и отбрасываете предыдущее содержимое. Есть и другие способы обновления буфера вершин. Например, вы можете оставить текущее содержимое и изменить только определенные значения, или вы можете обновить только определенные области буфера вершин вместо всего этого.

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

Да, вы хотите позвонить и IASetVertexBuffers до Draw() а также Present() чтобы увидеть обновленные результаты для текущего кадра. Вам не обязательно обновлять содержимое буфера вершин перед вызовом IASetVertexBuffers, Они могут быть в любом порядке.

Другие вопросы по тегам