如何使用DirectX 11渲染多个网格

时间:2019-06-14 16:08:47

标签: c++ directx-11

我正在使用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 :(得分:0)

首先,您不应在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.8ms

第二,您有很多问题:

  1. GetPerspectiveProjectionMatrixGetViewMatrix返回对局部变量的引用。导致网格渲染不正确。

  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