本页面提供了创建 Dear ImGui 自定义后端的全面指南。尽管 ImGui 已经为流行的平台和渲染器提供了许多预构建的后端,但在将 ImGui 集成到不支持的图形 API 或平台时,您可能需要创建自定义后端。有关使用现有后端的信息,请参阅后端系统概述。
Dear ImGui 需要两种类型的后端才能正常运行
自定义后端实现必须遵循特定的模式和接口,才能与 Dear ImGui 核心正确集成。
来源
每个后端都必须维护自己的状态,并提供一套标准的函数用于初始化、帧管理和清理。平台后端和渲染器后端都遵循类似的模式
来源
使用自定义后端的 ImGui 的典型执行流程遵循此模式
来源
平台后端负责向 ImGui 提供输入数据(鼠标、键盘等)并处理平台特定操作,如剪贴板和光标管理。
| 功能 | 目的 |
|---|---|
| 初始化 | 使用窗口和其他必要句柄初始化平台后端 |
| 关机 | 清理资源并恢复原始状态 |
| 新帧 | 更新时间差并为主帧准备平台输入 |
| 处理事件 | 处理平台特定事件,并将其转换为 ImGui 事件 |
自定义平台后端需要将平台特定的输入事件转换为 ImGui 的输入模型
io.AddKeyEvent() - 用于键盘输入io.AddKeyAnalogEvent() - 用于游戏手柄触发器等模拟输入io.AddMousePosEvent() - 用于鼠标位置io.AddMouseButtonEvent() - 用于鼠标按钮状态io.AddMouseWheelEvent() - 用于鼠标滚轮/滚动输入io.AddFocusEvent() - 用于窗口焦点更改io.AddInputCharacter() - 用于文本输入在 ImGuiIO 中设置适当的后端能力标志
来源
创建后端状态结构以存储平台特定数据
实现初始化函数,该函数:
实现事件处理函数,该函数:
实现 NewFrame 函数,该函数:
实现平台特定实用函数用于
来源
渲染器后端将 ImGui 的绘制命令转换为图形 API 特定的渲染命令。
| 功能 | 目的 |
|---|---|
| 初始化 | 使用设备/上下文句柄初始化渲染器 |
| 关机 | 释放所有渲染资源 |
| 新帧 | 在必要时准备渲染器以处理新帧 |
| RenderDrawData | 使用图形 API 渲染 ImGui 绘制数据 |
| CreateFontsTexture | 将字体图集纹理上传到 GPU |
| CreateDeviceObjects | 创建 GPU 资源(着色器、缓冲区等) |
| DestroyDeviceObjects | 释放 GPU 资源 |
在 ImGuiIO 中设置适当的后端能力标志
提供一种方法,通过将某个图形 API 纹理句柄视为 ImTextureID 来向 ImGui 注册用户纹理。
来源
创建后端状态结构以存储渲染资源
实现初始化函数,该函数:
实现设备对象创建,该操作:
实现 RenderDrawData 函数,该函数:
实现字体纹理创建以渲染文本
来源
两种类型的后端都需要进行适当的状态管理。通用模式如下:
这种模式有利于支持多个 ImGui 上下文,尽管这不是推荐的使用模式。
来源
渲染器后端的一个关键部分是处理顶点和索引数据
来源
虽然不推荐(优先使用多视口而不是多个上下文),但后端应支持多个 ImGui 上下文
来源
错误处理
资源管理
性能考量
兼容性
集成
来源
功能测试
渲染测试
边界情况
来源
为 Dear ImGui 创建自定义后端需要理解 ImGui API 和目标平台或渲染 API。通过遵循现有后端中建立的模式并实现所需接口,您可以将 ImGui 与几乎任何平台或图形系统集成。
请记住,后端应
遵循这些指南并研究现有的后端实现,您可以创建健壮的自定义后端,无缝地将 Dear ImGui 与您的应用程序集成。