我正在使用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);
}
答案 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
第二,您有很多问题:
GetPerspectiveProjectionMatrix
和GetViewMatrix
返回对局部变量的引用。导致网格渲染不正确。
输入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