IMGUI_DX11显示自定义图片

本文详细解析了在IMGUI中加载自定义图片的过程,包括使用Direct11创建纹理并将其转换为纹理ID的方法,以及如何在代码中实现这一过程的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IMGUI官方自带的例子里有一个Widgets项,里面有个Images

由于官方只演示了字体默认图片,并没有演示如何加载自定义图片


我们先搜索一下这个Images关键词

 通过代码搜索,观察发现,这个纹理ID是画图的关键

ImTextureID my_tex_id = io.Fonts->TexID;

 我们搜索看看io.Fonts->TexID是什么时候被赋值的(以下是Direct11的IMGUI)

 

 

 

观察得到流程为CreateTexture2D->CreateShaderResourceView->TexID

根据D3D11的相关知识,可以知道先创建一个2D纹理得到ID3D11Texture2D句柄,再通过CreateShaderResourceView得到ID3D11ShaderResourceView* g_pFontTextureView

即为纹理ID。

只要模拟这个过程就可以得到纹理ID:


ID3D11ShaderResourceView* DX11LoadTextureImageFromFile(ID3D11Device *pD3dDevice, wchar_t* lpszFilePath)
{

	ID3D11Texture2D * pTexture2D = NULL;
	D3D11_TEXTURE2D_DESC dec;


	HRESULT result;
	D3DX11_IMAGE_LOAD_INFO loadInfo;
	ZeroMemory(&loadInfo, sizeof(D3DX11_IMAGE_LOAD_INFO));
	loadInfo.BindFlags = D3D11_BIND_SHADER_RESOURCE;
	loadInfo.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
	loadInfo.MipLevels = D3DX11_DEFAULT; //这时会产生最大的mipmaps层。 
	loadInfo.MipFilter = D3DX11_FILTER_LINEAR;
	result = D3DX11CreateTextureFromFile(pD3dDevice, lpszFilePath, &loadInfo, NULL, (ID3D11Resource**)(&pTexture2D), NULL);
	pTexture2D->GetDesc(&dec);

	if (result != S_OK)
	{
		return NULL;
	}

	ID3D11ShaderResourceView*pFontTextureView = NULL;

	// Create texture view
	D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
	ZeroMemory(&srvDesc, sizeof(srvDesc));
	srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
	srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
	srvDesc.Texture2D.MipLevels = dec.MipLevels;
	srvDesc.Texture2D.MostDetailedMip = 0;
	pD3dDevice->CreateShaderResourceView(pTexture2D, &srvDesc, &pFontTextureView);


	return pFontTextureView;
}

调用例子: 

	if (ImGui::Begin(u8"IMGUI", false, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize))
	{
		if (!m_pImageTextureView1)
		{
			m_pImageTextureView1 = DX11LoadTextureImageFromFile(GetD3dDevice(), (wchar_t*)L"D:\\1.jpg");

		}
		ImTextureID my_tex_id = m_pImageTextureView1;
		float my_tex_w = (float)300;
		float my_tex_h = (float)400;
		ImGui::Image(my_tex_id, ImVec2(my_tex_w, my_tex_h), ImVec2(0, 0), ImVec2(1, 1), ImVec4(1.0f, 1.0f, 1.0f, 1.0f), ImVec4(1.0f, 1.0f, 1.0f, 0.5f));

	}

 

 

D3D9同理

### 配置和使用 ImGui 库的方法 #### 1. 使用 CMake 构建项目 为了更方便地管理和集成 ImGui,推荐通过 CMake 工具来配置和构建项目。以下是具体步骤: - 创建一个新的 CMake 项目,并将 ImGui 的核心文件以及所需的后端文件添加到项目中[^1]。 - 下载并解压 [imgui_cmake_starter](https://gitcode.com/gh_mirrors/im/imgui_cmake_starter),这是一个预设好的 CMake 模板工程,可以直接作为起点。 在项目的 `CMakeLists.txt` 文件中,确保包含以下内容: ```cmake add_subdirectory(imgui) target_link_libraries(YourProjectName PRIVATE ImGui) file(COPY imgui.ini DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) ``` 这一步的作用是链接 ImGui 库至您的目标可执行文件,并复制必要的配置文件 `imgui.ini` 至输出目录[^2]。 #### 2. 设置渲染器和输入设备支持 ImGui 自身不依赖任何特定的图形 API 或平台接口,但它需要您提供这些方面的实现。通常情况下,您可以从其 `backends` 子目录挑选适合当前项目的后端代码,比如针对 DirectX 11 的实现文件 `imgui_impl_dx11.cpp/h` 和 `imgui_impl_win32.cpp/h`[^4]。 对于 DX11 项目中的初始化工作,需调用相应的上下文创建函数,例如: ```cpp IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImGuiIO& io = ImGui::GetIO(); (void)io; // 加载自定义字体... ImGui::StyleColorsDark(); // 初始化平台与渲染器绑定层 ImGui_ImplWin32_Init(hwnd); // hwnd 是窗口句柄 ImGui_ImplDX11_Init(g_pd3dDevice, g_pd3dDeviceContext); ``` #### 3. 编译环境准备 如果您正在 Windows 上运行 Visual Studio 开发环境,则无需手动拷贝源码文件进入每一个新启动的应用程序之中[^4]。相反,应该设置全局范围内的附加包含目录(Additional Include Directories),指向 ImGui 主目录及其子目录 `backends`。 另外,也可以考虑安装 MinGW-w64 工具链以便获得跨平台兼容能力[^3]。此时需要注意调整 Makefiles 或者 Ninja 构建脚本里的编译选项参数以适应不同的主机架构。 最后提醒一点,尽管官方仓库已经包含了大部分常用的第三方依赖项副本,但某些特殊场合可能还需要单独下载最新版 stb 字体解析库等资源包。 --- ####
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值