后端系统是Dear ImGui的一个关键组件,它将与平台无关的核心与特定的平台窗口系统和图形API连接起来。它由两个主要组件组成:平台后端(用于输入、窗口管理和平台集成)和渲染器后端(用于使用特定图形API绘制ImGui元素)。本文档解释了后端系统的架构、职责和集成模式。
有关开发自定义后端的信息,请参阅自定义后端开发。
Dear ImGui使用模块化后端架构,将平台特定代码与渲染特定代码分离
来源:docs/README.md120-128 backends/imgui_impl_vulkan.cpp1-19
平台后端处理平台特定操作,例如:
每个平台后端都实现了一个一致的接口,用于捕获输入事件并将其转发给Dear ImGui。
来源:backends/imgui_impl_glfw.cpp6-14 backends/imgui_impl_sdl3.cpp6-12 backends/imgui_impl_win32.cpp5-9
渲染器后端将Dear ImGui的渲染命令转换为API特定的绘图指令
来源: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
每个后端都在其后端特定结构中维护自己的状态
这些数据结构通过BackendPlatformUserData和BackendRendererUserData指针存储在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
每个后端都提供一个初始化函数来设置必要的状态
在初始化期间,后端会:
来源: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
渲染器后端遵循以下通用渲染过程:
来源: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代表什么 |
|---|---|
| Vulkan | VkDescriptorSet |
| DirectX11 | ID3D11ShaderResourceView* |
| DirectX12 | D3D12_GPU_DESCRIPTOR_HANDLE |
| OpenGL | GLuint (OpenGL纹理ID) |
| Metal | MTLTexture* |
来源: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
后端必须仔细管理渲染状态,以避免与宿主应用程序冲突
此模式确保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)。