菜单

后端系统

相关源文件

目的与范围

后端系统是Dear ImGui的一个关键组件,它将与平台无关的核心与特定的平台窗口系统和图形API连接起来。它由两个主要组件组成:平台后端(用于输入、窗口管理和平台集成)和渲染器后端(用于使用特定图形API绘制ImGui元素)。本文档解释了后端系统的架构、职责和集成模式。

有关开发自定义后端的信息,请参阅自定义后端开发

后端类型

Dear ImGui使用模块化后端架构,将平台特定代码与渲染特定代码分离

来源:docs/README.md120-128 backends/imgui_impl_vulkan.cpp1-19

平台后端

平台后端处理平台特定操作,例如:

  • 输入管理(鼠标、键盘、游戏手柄)
  • 窗口和光标管理
  • 剪贴板操作
  • IME(输入法编辑器)支持
  • 时间管理

每个平台后端都实现了一个一致的接口,用于捕获输入事件并将其转发给Dear ImGui。

来源:backends/imgui_impl_glfw.cpp6-14 backends/imgui_impl_sdl3.cpp6-12 backends/imgui_impl_win32.cpp5-9

渲染器后端

渲染器后端将Dear ImGui的渲染命令转换为API特定的绘图指令

  • 将ImGui的顶点和索引缓冲区转换为渲染器特定格式
  • 管理纹理和着色器
  • 处理渲染状态和管线
  • 使用图形API实现ImGui的绘图命令

来源:backends/imgui_impl_vulkan.cpp4-7 backends/imgui_impl_opengl3.cpp6-8 backends/imgui_impl_dx12.cpp5-7

后端架构

来源:backends/imgui_impl_glfw.cpp149-178 backends/imgui_impl_vulkan.cpp236-262 backends/imgui_impl_opengl3.cpp225-248

后端数据管理

每个后端都在其后端特定结构中维护自己的状态

这些数据结构通过BackendPlatformUserDataBackendRendererUserData指针存储在ImGui上下文中,允许多个Dear ImGui上下文使用不同的后端。

来源:backends/imgui_impl_glfw.cpp150-177 backends/imgui_impl_vulkan.cpp236-262

功能标志

后端通过特性标志向ImGui核心传递其功能

常见的后端标志包括:

  • ImGuiBackendFlags_HasMouseCursors:后端支持自定义鼠标光标
  • ImGuiBackendFlags_HasSetMousePos:后端可以编程设置鼠标位置
  • ImGuiBackendFlags_RendererHasVtxOffset:渲染器支持带有顶点偏移的大型网格

来源:backends/imgui_impl_glfw.cpp597-599 backends/imgui_impl_win32.cpp169-172 backends/imgui_impl_vulkan.cpp762-763

集成模式

应用程序、ImGui核心和后端之间的典型集成流程遵循此模式:

来源:docs/README.md117-123 backends/imgui_impl_glfw.cpp587-607 backends/imgui_impl_vulkan.cpp733-764

初始化

每个后端都提供一个初始化函数来设置必要的状态

在初始化期间,后端会:

  1. 创建后端特定数据结构
  2. 将其存储在ImGui的上下文中
  3. 设置后端标志以指示功能
  4. 初始化操作所需的资源(例如,渲染器所需的字体)

来源:backends/imgui_impl_glfw.cpp587-607 backends/imgui_impl_vulkan.cpp733-764

逐帧执行

每一帧,后端准备状态,ImGui处理UI代码,然后进行渲染

来源:backends/imgui_impl_glfw.cpp608-638 backends/imgui_impl_vulkan.cpp1040-1144

输入处理

平台后端捕获并转换输入事件

来源:backends/imgui_impl_sdl3.cpp345-490 backends/imgui_impl_glfw.cpp341-474

平台后端详情

平台后端负责将平台特定的窗口和输入事件转换为Dear ImGui使用的抽象输入模型。

常用平台后端函数

功能目的
ImGui_ImplXXX_Init()初始化平台后端
ImGui_ImplXXX_Shutdown()清理平台后端
ImGui_ImplXXX_NewFrame()准备新帧,更新输入状态
ImGui_ImplXXX_ProcessEvent()处理平台特定事件(如适用)

来源:backends/imgui_impl_glfw.cpp587-638 backends/imgui_impl_win32.cpp154-218

输入事件映射

平台后端使用以下函数将原生输入事件映射到ImGui的输入系统:

来源:backends/imgui_impl_sdl3.cpp345-490 backends/imgui_impl_win32.cpp430-598

渲染器后端详情

渲染器后端将ImGui的抽象绘图命令转换为API特定的渲染指令。

常用渲染器后端函数

功能目的
ImGui_ImplXXX_Init()初始化渲染器,创建资源
ImGui_ImplXXX_Shutdown()清理渲染器资源
ImGui_ImplXXX_NewFrame()准备渲染新帧
ImGui_ImplXXX_RenderDrawData()使用特定API渲染ImGui绘图数据
ImGui_ImplXXX_CreateFontsTexture()创建字体图集纹理(通常在内部调用)
ImGui_ImplXXX_DestroyFontsTexture()清理字体图集纹理

来源:backends/imgui_impl_vulkan.cpp733-1144 backends/imgui_impl_opengl3.cpp297-519

渲染管道

渲染器后端遵循以下通用渲染过程:

  1. 设置渲染状态(混合模式、剔除、深度测试等)
  2. 使用ImGui绘图数据更新顶点/索引缓冲区
  3. 绑定着色器程序、纹理和Uniform变量
  4. 对于ImGui绘图列表中的每个命令:
    • 设置剪裁矩形
    • 绑定纹理(如果需要)
    • 发出绘图调用
  5. 恢复原始渲染状态

来源:backends/imgui_impl_vulkan.cpp1040-1144 backends/imgui_impl_opengl3.cpp520-665 backends/imgui_impl_dx12.cpp331-414

纹理管理

后端提供函数来向ImGui注册用户纹理

ImGui使用ImTextureID表示纹理,它只是一个句柄(void*uint64_t),渲染器后端知道如何解释它。每个渲染器后端定义此句柄实际代表的内容:

后端ImTextureID代表什么
VulkanVkDescriptorSet
DirectX11ID3D11ShaderResourceView*
DirectX12D3D12_GPU_DESCRIPTOR_HANDLE
OpenGLGLuint (OpenGL纹理ID)
MetalMTLTexture*

来源:backends/imgui_impl_vulkan.cpp55-56 backends/imgui_impl_opengl3.cpp7 backends/imgui_impl_dx12.cpp5

多上下文支持

后端系统通过后端特定的数据检索支持多个ImGui上下文

但是,多上下文支持尚未经过充分测试,通常建议使用Dear ImGui的视口功能而不是多个上下文。

来源:backends/imgui_impl_glfw.cpp186-190 backends/imgui_impl_vulkan.cpp378-383 backends/imgui_impl_opengl3.cpp251-255

高级主题

渲染状态管理

后端必须仔细管理渲染状态,以避免与宿主应用程序冲突

  1. 保存原始渲染状态
  2. 设置ImGui特定的渲染状态
  3. 渲染ImGui元素
  4. 恢复原始渲染状态

此模式确保ImGui渲染不会干扰应用程序的其余渲染。

来源:backends/imgui_impl_opengl3.cpp520-665 backends/imgui_impl_vulkan.cpp1040-1144

自定义回调和扩展

许多渲染器后端允许通过回调进行自定义渲染

这允许实现高级渲染效果或与底层图形API进行自定义集成。

来源:backends/imgui_impl_vulkan.cpp1110-1117 backends/imgui_impl_opengl3.cpp596-604

结论

后端系统是一种灵活的模块化方法,允许Dear ImGui在不损害其核心功能的情况下支持多个平台和渲染API。通过分离平台和渲染器的关注点,Dear ImGui可以轻松集成到几乎任何应用程序环境中。

在集成Dear ImGui时,大多数应用程序将使用一个平台后端(例如,GLFW、SDL、Win32)和一个适合其应用程序技术栈的渲染器后端(例如,OpenGL、Vulkan、DirectX)。

来源:docs/README.md42-46 docs/README.md117-123