在DX12中使用imgui 入门教程 立方体旋转+改变背景颜色

入门imgui第一天,把遇到的问题和参考两位大佬写的教程,总结了一下,写了下来,若有错误欢迎指正

参考文章:

【记录】DirectX12 添加ImGui组件 - 知乎 (zhihu.com)

Directx11/12添加imgui踩坑记 - 知乎 (zhihu.com)

一、下载imgui库

官方网址:

GitHub - ocornut/imgui: Dear ImGui: Bloat-free Graphical User interface for C++ with minimal dependencies

在DirectX12中使用imgui库,需要以下文件:

   后面这四个文件可以在backends文件夹中找到。

二、准备工作

2.1 使用的dx12的demo

使用的是dx龙书第六章绘制立方体的代码,在此项目上加入imgui库

2.2 加入头文件

创建"imgui"的文件夹,将上述15个imgui的文件复制进来。

若遇到“找不到imgui.h"的问题,记得查看项目包含目录是否将imgui.h的路径记录下来,如:

三、使用imgui

①在d3dAPP.cpp和Box.cpp中包含以下头文件:

#include "imgui.h"
#include "imgui_impl_win32.h"
#include "imgui_impl_dx12.h"

②在d3dApp.cpp中创建srv堆

在第六章绘制立方体项目中,只用到了RTV和DSV,所以需要自己创建srv堆。imgui需要srv堆才能完成绘制。

在CreateRtvAndDsvDescriptorHeaps函数中添加以下代码:

D3D12_DESCRIPTOR_HEAP_DESC SrvHeapDesc;
	SrvHeapDesc.NumDescriptors = 1;
	SrvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
	SrvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
	SrvHeapDesc.NodeMask = 0;
	ThrowIfFailed(md3dDevice->CreateDescriptorHeap(
		&SrvHeapDesc, IID_PPV_ARGS(mSrvHeap.GetAddressOf())));

③在d3dAPP.cpp的初始化函数中,添加以下代码:

IMGUI_CHECKVERSION();
	ImGui::CreateContext();   //创建上下文
	ImGuiIO& io = ImGui::GetIO();
	(void)io;
	ImGui::StyleColorsDark();
	ImGui_ImplWin32_Init(mhMainWnd);
	ImGui_ImplDX12_Init(md3dDevice.Get(), SwapChainBufferCount,
		DXGI_FORMAT_R8G8B8A8_UNORM, mSrvHeap.Get(),
		mSrvHeap.Get()->GetCPUDescriptorHandleForHeapStart(),
		mSrvHeap.Get()->GetGPUDescriptorHandleForHeapStart());

④在Box.cpp的Draw()函数中,添加以下代码,注意:在指令关闭之前:

//        开启imgui帧  重置命令列表                                  
	ImGui_ImplDX12_NewFrame();
	ImGui_ImplWin32_NewFrame();
	ImGui::NewFrame();

	// 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!).
	bool show_demo_window = true;
	if (show_demo_window)
		ImGui::ShowDemoWindow(&show_demo_window);

	// 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window.
	//以下是绘制
	{
		static int counter = 0;
		//test1    控制旋转
		ImGui::Begin("WangMeifo!Test");                          // Create a window called "Hello, world!" and append into it.

		ImGui::Text("Drag the slider to rotate the Angle of the Box.");               // Display some text (you can use a format strings too)
		ImGui::Checkbox("Demo Window", &show_demo_window);      // Edit bools storing our window open/close state

		//ImGui::SliderFloat("float", &mPhi, 0.1f, 1.0f);  //mPhi立方体的旋转角度
		ImGui::SliderFloat("float", &mTheta, 0.1f, 1.0f);  //mTheta也是旋转角度
		// Edit 1 float using a slider from 0.0f to 1.0f

		if (ImGui::Button("Button"))                            // Buttons return true when clicked (most widgets return true when edited/activated)
			counter++;
		ImGui::SameLine();
		ImGui::Text("counter = %d", counter);

		ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
		ImGui::End();

    ImGui::Render();
	mCommandList->SetDescriptorHeaps(1, mSrvHeap.GetAddressOf());
	ImGui_ImplDX12_RenderDrawData(ImGui::GetDrawData(), mCommandList.Get());

⑤在d3dApp.cpp中修改窗口程序,让其响应imgui

//       imgui需要响应消息   以下是对窗口过程函数做的修改:             
// Forward declare message handler from imgui_impl_win32.cpp
extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

LRESULT D3DApp::MsgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	ImGui_ImplWin32_WndProcHandler(hwnd, msg, wParam, lParam);

以上部分完成了立方体的旋转,接下来完成背景颜色的改变

⑥在draw()函数中,添加以下代码:

		//控制背景颜色   test2
		ImGui::Begin("Change the BackGround color:");
		ImGui::ColorEdit3("ChangeColor",(float*)&changeColor);
		ImGui::End();

其中,changeColor需要提前声明为成员变量

	ImVec4 changeColor = ImVec4(0.66f, 0.32f, 0.60f, 1.00f);

然后在绘制时,通过以下代码改变背景颜色

//         利用imgui修改背景色                         
	const float change_color_with_alpha[4] = {
	changeColor.x * changeColor.w,
	changeColor.y * changeColor.w,
	changeColor.z * changeColor.w };
	mCommandList->ClearRenderTargetView(CurrentBackBufferView(), change_color_with_alpha, 0, nullptr);

四、效果展示

 

 

imgui我也才入门,若有错误,烦请大家指正,谢谢~

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值