imgui导入到dx12的时候,刚开始有些问题,就是在拖动控件时,后面的游戏场景会跟着一起旋转。这是因为imgui没有单独响应,需要进行一下鼠标移动的判断。
我先是直接在添加了以下判断
case WM_MOUSEMOVE:
//让imgui单独响应
if (imio.WantCaptureMouse)
{
break;
}
OnMouseMove(wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
return 0;
但是会报错,
意思是没有创建上下文。
回想之前导入imgui到dx12的时候,我是在Initialize()函数中创建imgui工作流、上下文的,而且是放在窗口初始化和d3d初始化之后的。
所以我们需要对其创建顺序改进:
我是直接在d3dApp的构造函数中就创建好imgui的工作流和上下文:
D3DApp::D3DApp(HINSTANCE hInstance)
: mhAppInst(hInstance)
{
// Only one D3DApp can be constructed.
assert(mApp == nullptr);
mApp = this;
//ImgUI 工作流
IMGUI_CHECKVERSION();
ImGui::CreateContext(); //创建上下文
ImGuiIO& io = ImGui::GetIO();
(void)io;
ImGui::StyleColorsDark();
}
然后在初始化窗口时:
bool D3DApp::InitMainWindow()
{
……………………
ShowWindow(mhMainWnd, SW_SHOW);
UpdateWindow(mhMainWnd);
//初始化imgui窗口
ImGui_ImplWin32_Init(mhMainWnd);
return true;
}
最后,在初始化D3D的函数中:
bool D3DApp::InitDirect3D()
{
CreateCommandObjects();
CreateSwapChain();
CreateRtvAndDsvDescriptorHeaps();
ImGui_ImplDX12_Init(md3dDevice.Get(), SwapChainBufferCount,
DXGI_FORMAT_R8G8B8A8_UNORM, mSrvHeap.Get(),
mSrvHeap.Get()->GetCPUDescriptorHandleForHeapStart(),
mSrvHeap.Get()->GetGPUDescriptorHandleForHeapStart());
return true;
}
|