Как визуализировать несколько сеток с помощью DirectX 11 - PullRequest
0 голосов
/ 14 июня 2019

Я работаю на графическом движке в c ++ и DirectX 11. При импорте сцен (используя Assimp) мне приходится рендерить несколько сеток с отдельными шейдерами.Я делаю это следующим способом: у меня есть std :: vector для хранения шейдеров и еще один для мешей.После открытия файла я добавляю все сетки к этому вектору.Затем я перебираю элементы вектора, используя цикл for, и рисую каждый из них отдельно.После того, как я нарисовал все сетки, я поменял буфер.Это прекрасно работает, за исключением частоты кадров / производительности, которая ужасна.

Я не знаю, как это можно сделать более эффективно или как это должно быть сделано.

void CRenderer::RenderFrame(void(*r)(void), void(*gui)(void),std::vector<CMesh>& meshStr, std::vector<CShader>& shaderStr)
{
    const float BackColor[4] = { 0.03f, 0.03f, 0.03f, 1.f };
    DeviceContext->ClearDepthStencilView(DepthStencilView, D3D11_CLEAR_DEPTH, 1.0f, 0);
    DeviceContext->ClearRenderTargetView(backbuffer, BackColor);

    for (int i = 0; i < shaderStr.size(); i++)
    {
        UseShader(&shaderStr[i], sizeof(Vertex), 0);

            r();

        DeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

        DeviceContext->VSSetConstantBuffers(0, 1, &CurrentShader->GetConstantBuffer());
        DeviceContext->PSSetConstantBuffers(0, 1, &CurrentShader->GetConstantBuffer());

        DeviceContext->VSSetConstantBuffers(1, 1, &CurrentShader->GetLightConstantBuffer());
        DeviceContext->PSSetConstantBuffers(1, 1, &CurrentShader->GetLightConstantBuffer());

        DeviceContext->DrawIndexed(meshStr[i].GetIndicesCount(), 0, 0);
    }

    gui();

    SwapChain->Present(0, 0);
}

1 Ответ

0 голосов
/ 01 июля 2019

Во-первых, вы не должны отображать в WindowProc.Правильным способом будет обработка всех сообщений в начале каждого тика и рендеринг кадра.Например:

void CWindow::BeginTick(void(*ETick)())
{
    GetCursorPos(&LastMousePosition);
    LastTime = std::chrono::system_clock::now();

    while (true)
    {
        while (PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

        GetCursorPos(&CurrentMousePosition);
        CurrentTime = std::chrono::system_clock::now();
        UpdateDeltaTime();

        ETick();
    }
}

С этим циклом кадров у меня примерно 0,8 мс на кадр

Во-вторых, у вас много проблем:

  1. GetPerspectiveProjectionMatrix и GetViewMatrix возвращают ссылку на локальную переменную.Это приводит к неправильной визуализации меша.

  2. Ошибка OpenCdlg - вы выделяете len - 4 символов, но читаете len.

    txt_path = new char[len - 4];
    f.seekg(0);
    f.read(txt_path, sizeof(char) * len);
    

    Должно быть

    txt_path = new char[len + 1]; // allocate len + 1 for terminator
    f.seekg(0);
    f.read(txt_path, sizeof(char) * len);
    txt_path[len] = 0; // add zero terminator
    
...