Существует несколько способов, которыми приведенный выше код может дать сбой, поэтому важно включить обработку ошибок.
Также D3D11_MAPPED_SUBRESOURCE
не сообщает размер буфера вершин в байтах через любое из его значений, поэтому вам нужно получить его из D3D11_BUFFER_DESC
через GetDesc
.
DepthPitch
является допустимым значением, только если вы отображаете объемную (3D) текстуру .
Вы также предполагаете, что сам буфер вершин - это то, что вы можете напрямую Map
, потому что вы создали его с помощью D3D11_USAGE_STAGING
или D3D11_USAGE_DYNAMIC
, а вы использовали D3D11_CPU_ACCESS_FLAG
.
//vertex structure
struct Vertex
{
XMFLOAT3 Pos;
XMFLOAT2 Tex;
};
D3D11_MAPPED_SUBRESOURCE ms = {};
if (FAILED(pContext->Map(buff, 0, D3D11_MAP_READ, 0, &ms)))
{
cout << "Failed Map" << endl;
}
else
{
D3D11_BUFFER_DESC desc = {};
buff->GetDesc(&desc);
size_t nVerts = desc.ByteWidth / sizeof(Vertex);
if (!nVerts)
{
cout << "Failed computing nVerts" << endl;
}
else
{
auto vertices = new Vertex[nVerts];
memcpy(vertices, ms.pData, nVerts * sizeof(Vertex));
for (size_t i = 0; i < nVerts; i++)
{
cout << vertices[i].Pos.x << ", "
<< vertices[i].Pos.y << ", "
<< vertices[i].Pos.z << endl;
}
delete [] vertices;
}
pContext->Unmap(buff, 0);
}
Обратите внимание, что лучший способ обрабатывать временную память vertices
- использовать auto vertices = std::make_unique<Vertex[]>(nVerts);
и добавлять #include <memory>
вверху. Это позволяет избежать необходимости помнить о ручном удалении памяти во всех случаях.
Вы должны также использовать Microsoft :: WRL :: ComPtr вместо необработанных указателей интерфейса COM, чтобы избежать утечки памяти с помощью COM-объектов DirectX.
См. также Набор инструментов DirectX для DX11