一、 目录与文件部署
从官网获取 IMGUI 代码库,在项目 extern
目录下新建 imgui
目录,将相关文件复制进去,构建出如下目录结构:
.
├── build
├── extern
│ ├── glfw
│ ├── glm
│ └── imgui
│ ├── backends
│ │ ├── imgui_impl_glfw.cpp
│ │ ├── imgui_impl_glfw.h
│ │ ├── imgui_impl_vulkan.cpp
│ │ └── imgui_impl_vulkan.h
│ ├── imconfig.h
│ ├── imgui_demo.cpp
│ ├── imgui_draw.cpp
│ ├── imgui_internal.h
│ ├── imgui_tables.cpp
│ ├── imgui_widgets.cpp
│ ├── imgui.cpp
│ ├── imgui.h
│ ├── imstb_rectpack.h
│ ├── imstb_textedit.h
│ ├── imstb_truetype.h
│ └── LICENSE.txt
└── stb
二、CMakeLists 配置 - 接入 ImGUI 依赖
(一)路径与文件设置
在 CMakeLists.txt
中,添加 ImGUI 相关配置:
# 设置外部库目录及各库路径
...
set(IMGUI_ROOT ${EXTERNAL_LIB_DIR}/imgui)
# 递归收集源文件
file(GLOB_RECURSE SOURCE_FILES src/*.cpp src/*.c)
(二)构建与链接 ImGUI 库
# 构建 imgui 静态库,指定实现文件
add_library(imgui STATIC
${IMGUI_ROOT}/imgui.cpp
${IMGUI_ROOT}/imgui_demo.cpp
${IMGUI_ROOT}/imgui_draw.cpp
${IMGUI_ROOT}/imgui_widgets.cpp
${IMGUI_ROOT}/imgui_tables.cpp
${IMGUI_ROOT}/backends/imgui_impl_glfw.cpp
${IMGUI_ROOT}/backends/imgui_impl_vulkan.cpp
)
# 配置 imgui 头文件包含目录
target_include_directories(imgui PUBLIC
${IMGUI_ROOT}
${GLFW_ROOT}/include
$<TARGET_PROPERTY:Vulkan::Vulkan,INTERFACE_INCLUDE_DIRECTORIES>
)
# 查找 Vulkan 库
find_package(Vulkan REQUIRED)
# 链接库到项目
target_link_libraries(${PROJECT_NAME} PRIVATE
Vulkan::Vulkan
imgui
${GLFW_LIB}
)
三、主代码集成 - main.cpp 中 ImGUI 接入
(一)头文件引入
...
#include <imgui/imgui.h>
#include <imgui/backends/imgui_impl_glfw.h>
#include <imgui/backends/imgui_impl_vulkan.h>
#include "renderer/VkRenderer.h"
#include "scene/Camera.h"
#include "ObjModelLoader.h"
#include "GltfModelLoader.h"
#include "HelloRect.h"
(二)初始化与回调
GLFWwindow* window;
const uint32_t WIDTH = 1920;
const uint32_t HEIGHT = 1000;
Camera camera(glm::vec3(5.0f, 5.0f, 5.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 0.0f, 1.0f), 45.0f, 0.01f, 1000.0f);
VkContext vkcontext{
};
// 帧缓冲大小变化回调
static void framebufferResizeCallback(GLFWwindow* window, int width, int height) {
vkcontext.framebufferResized = true;