Как распечатать структуру вершин в цикле - PullRequest
0 голосов
/ 14 июля 2020

Я хочу распечатать содержимое моего Vertex Buffer. Я хотел бы l oop через все вершины и координаты текстуры при печати на консоли. В частности, я хотел бы видеть и расположение вершин, и тексели (координаты текстуры). Как это сделать в al oop?

//vertex structure
struct Vertex
{
    XMFLOAT3 Pos;
    XMFLOAT2 Tex;
};

D3D11_MAPPED_SUBRESOURCE ms;
pContext->Map(buff, NULL, D3D11_MAP_READ, NULL, &ms); 
Vertex* vertices = new Vertex[ms.DepthPitch];     
memcpy(vertices, ms.pData, ms.DepthPitch); 
pContext->Unmap(buff, 0);

//I know how to write a basic for loop,
//But I don't know how to query only pos or tex? 
for (int i = 0; i < 2678; i++) {
  cout << vertices[i] << "\n";
}

1 Ответ

1 голос
/ 14 июля 2020

Существует несколько способов, которыми приведенный выше код может дать сбой, поэтому важно включить обработку ошибок.

Также 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

...