即时模式UI库 Dear ImGui 上手:3分钟点亮你的窗口
【免费下载链接】imguiDear ImGui: Bloat-free Graphical User interface for C++ with minimal dependencies项目地址: https://gitcode.com/GitHub_Trending/im/imgui
Dear ImGui 是一个面向 C++ 的轻量级即时模式 GUI 框架,能在你的游戏或工具渲染管线里直接画出可拖拽、可编辑的窗口。本文带你编译运行官方示例,并讲清后端选择和主循环的接入方式。
跑起来:3 分钟编好官方示例
不用从零搭工程,仓库自带一批现成的 example,其中example_glfw_opengl3路径最短:GLFW 管窗口,OpenGL 3 管渲染,是最常见的组合。
第一步,拉源码:
git clone https://gitcode.com/GitHub_Trending/im/imgui cd imgui第二步,装 GLFW 和 OpenGL 开发库(Debian/Ubuntu;macOS 用brew install glfw):
apt-get install -y libglfw3-dev libgl1-mesa-dev第三步,编译并运行示例:
cd examples/example_glfw_opengl3 make ./example_glfw_opengl3窗口弹出来,里面有个标题为 Dear ImGui Demo 的面板、能拖能动,就成了。关掉它的方式是标题栏 X 或按 Esc。
它到底怎么工作:即时模式速览
常见的 GUI 框架是保留模式:按钮建一次,框架帮你记住谁被谁点了,状态同步一直挂在后台。ImGui 把这个模型整个扔掉——UI 是一个每帧被调用的函数:你告诉它"这一帧画个滑条,值 0.5",它画出来,再把新值交还给你。像每帧重画同一幅画,画面看起来连续,每一笔都是全新开始。
所以你看到主循环每帧写 NewFrame → 画 UI → Render,不是仪式感,是它的工作方式本身。Render() 产出的不是窗口,而是一份顶点和纹理清单,交给 GPU 画进你的帧缓冲。ImGui 只管布局和交互,真正的画由"后端"完成:平台后端(GLFW、Win32 等)管窗口和输入,渲染后端(OpenGL3、DirectX11 等)管画,两个都能换,核心不绑定任何图形 API。
每帧: ImGui::NewFrame() → 你的代码声明UI → ImGui::Render() ↓ 后端把 draw data 翻译成 GPU 指令 → 窗口呈现接入你的项目:文件清单与后端选择
把根目录核心源文件拷进你的工程:imgui.h、imconfig.h、imgui.cpp、imgui_draw.cpp、imgui_tables.cpp、imgui_widgets.cpp,外加可选的imgui_demo.cpp(演示窗口)。再按你选的后端,把backends/下对应的imgui_impl_xxx.cpp/.h加进来。
选择逻辑分两层:窗口系统(GLFW、SDL、Win32)是一层,渲染器是另一层,按下表挑:
| 你的工程在用 | 渲染器后端 | 参考示例 |
|---|---|---|
| OpenGL 3.3+ / ES2 | imgui_impl_opengl3 | example_glfw_opengl3 |
| OpenGL 2(遗留固定管线) | imgui_impl_opengl2 | example_glfw_opengl2 |
| DirectX 11 | imgui_impl_dx11 | example_win32_directx11 |
| Vulkan | imgui_impl_vulkan | example_glfw_vulkan |
| Metal(macOS/iOS) | imgui_impl_metal | example_glfw_metal |
现代图形管线一律选 opengl3 这一支;opengl2 那份只作参考,官方文档也明确不建议新工程用。各后端的完整说明在 docs/BACKENDS.md。
主循环接入就这几个调用点,顺序别乱:
// 初始化(一次) ImGui::CreateContext(); ImGui_ImplGlfw_InitForOpenGL(window, true); ImGui_ImplOpenGL3_Init("#version 330"); // 主循环(每帧) while (!glfwWindowShouldClose(window)) { glfwPollEvents(); ImGui_ImplOpenGL3_NewFrame(); ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); // 你的业务代码:ImGui::ShowDemoWindow(); 或画自己的窗口 ImGui::Render(); ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); glfwSwapBuffers(window); }想看完整版怎么写,参考 examples/example_glfw_opengl3/ 里的 main.cpp,上面骨架之外无非多了字体加载和样式缩放几行。
环境 & 依赖清单
- 编译器:C++11 及以上,GCC / Clang / MSVC 均可,核心零依赖
- 窗口系统:GLFW(Linux
apt-get install libglfw3-dev,macOSbrew install glfw,Windows 下 examples/libs/glfw/ 有预编译库) - 图形 API:OpenGL / DirectX / Vulkan 任选其一,装对应系统的开发包
- 可选 FreeType:更高质量的字体渲染,加 misc/freetype/ 并在 imconfig.h 定义 IMGUI_ENABLE_FREETYPE
- 可选字体:misc/fonts/ 下有几个 TTF;内置字体不含中文字形,中文界面自己准备字体文件
常见卡点 & 排错
窗口全黑、看不到 demo 面板→ 漏了 Render 后的后端渲染调用,或 NewFrame/Render 顺序不对 → 确认帧尾依次调了ImGui::Render()和ImGui_ImplXXX_RenderDrawData()。
链接报错 undefined reference toImGui::→ 只拷了 .h,没加核心 .cpp → 对照上一节清单,五个核心文件和后端 .cpp 都要进工程。
编译通过、一闪就没窗口→ GLFW/OpenGL 开发库没装,或窗口创建失败没检查 → 打印glfwGetError()的返回值,先确认依赖装上了。
中文显示成方块→ 内置字体没有 CJK 字形 → 用io.Fonts->AddFontFromFileTTF()加载一份含中文的字体,并确认字形范围配置正确。
帧率异常低→ 每帧重复建字体或纹理图集 → 字体加载只放初始化里,别进主循环反复 AddFont。
卡住的话,先翻 docs/FAQ.md 的对应条目,再看 imgui.cpp 开头 PROGRAMMER GUIDE 一节的回答。
Demo 面板亮起来之后,剩下的事就是画你自己的窗口,imgui_demo.cpp 本身就是最好的 API 图鉴。
【免费下载链接】imguiDear ImGui: Bloat-free Graphical User interface for C++ with minimal dependencies项目地址: https://gitcode.com/GitHub_Trending/im/imgui
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考