Реализация аппаратного экземпляра на Directx11 - PullRequest
0 голосов
/ 19 апреля 2019

Я абсолютный новичок в Directx / 3D-программировании. Мне нужна помощь с реализацией аппаратного инстансинга в Directx 11. Я пытаюсь визуализировать несколько кубов на экране, чтобы создать какой-то воксельный движок в стиле Minecraft. Проблема в том, что я не знаю, с чего начать. Вот как выглядит моя функция рендеринга фрейма:

void RenderFrame(void)
{
    D3DXMATRIX matView, matProjection;
    D3DXMATRIX matFinal;

    // create a view matrix
    D3DXMatrixLookAtLH(&matView,
        &D3DXVECTOR3(0.0f, 9.0f, 24.0f),   // the camera position
        &D3DXVECTOR3(0.0f, 0.0f, 0.0f),    // the look-at position
        &D3DXVECTOR3(0.0f, 1.0f, 0.0f));   // the up direction

// create a projection matrix
    D3DXMatrixPerspectiveFovLH(&matProjection,
        (FLOAT)D3DXToRadian(45),                    // field of view
        (FLOAT)SCREEN_WIDTH / (FLOAT)SCREEN_HEIGHT, // aspect ratio
        1.0f,                                       // near view-plane
        100.0f);                                    // far view-plane

// create the final transform
    matFinal = matView * matProjection;

    // clear the back buffer to a deep blue
    devcon->ClearRenderTargetView(backbuffer, D3DXCOLOR(0.0f, 0.2f, 0.4f, 1.0f));

    // clear the depth buffer
    devcon->ClearDepthStencilView(zbuffer, D3D11_CLEAR_DEPTH, 1.0f, 0);

    // select which vertex buffer to display
    UINT stride = sizeof(VERTEX);
    UINT offset = 0;
    devcon->IASetVertexBuffers(0, 1, &pVBuffer, &stride, &offset);
    devcon->IASetIndexBuffer(pIBuffer, DXGI_FORMAT_R32_UINT, 0);

    // select which primtive type we are using
    devcon->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

    // draw the Hypercraft
    devcon->UpdateSubresource(pCBuffer, 0, 0, &matFinal, 0, 0);
    devcon->DrawIndexed(24, 0, 0);

    // switch the back buffer and the front buffer
    swapchain->Present(0, 0);
}

Обратите внимание, что есть один буфер вершин, содержащий вершины куба, и индексный буфер, содержащий его индексы. Я хочу визуализировать сразу несколько (более 5000) кубов на экране одним вызовом отрисовки без проблем с производительностью, поэтому я знаю, что создание экземпляров - это путь, но я не знаю, как реализовать его в своем коде. Какие изменения нужно внести в мой код, чтобы отобразить несколько экземпляров куба?

Заранее спасибо!

...