即时模式UI库 Dear ImGui 上手:3分钟点亮你的窗口
2026/8/29 9:10:54 网站建设 项目流程

即时模式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.himconfig.himgui.cppimgui_draw.cppimgui_tables.cppimgui_widgets.cpp,外加可选的imgui_demo.cpp(演示窗口)。再按你选的后端,把backends/下对应的imgui_impl_xxx.cpp/.h加进来。

选择逻辑分两层:窗口系统(GLFW、SDL、Win32)是一层,渲染器是另一层,按下表挑:

你的工程在用渲染器后端参考示例
OpenGL 3.3+ / ES2imgui_impl_opengl3example_glfw_opengl3
OpenGL 2(遗留固定管线)imgui_impl_opengl2example_glfw_opengl2
DirectX 11imgui_impl_dx11example_win32_directx11
Vulkanimgui_impl_vulkanexample_glfw_vulkan
Metal(macOS/iOS)imgui_impl_metalexample_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(Linuxapt-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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询