一、项目简介
项目技术栈
CesiumNative + Dear ImGui + Vulkan 1.3 三维地理可视化系统
详细项目功能说明
1. 3DTiles渲染功能
实现完整的3DTiles格式解析与加载引擎
支持LOD(Level of Detail)分层细节渲染
可加载建筑模型、点云等3DTiles资产
示例:加载城市级建筑3DTiles数据,实现流畅的缩放浏览
2. WGS84椭球体渲染
精确呈现地球椭球体模型
支持WGS84坐标系的自动转换
实现经纬度网格和参考椭球面的渲染
示例:显示带有地形起伏的地球表面
3. TMS/WMS瓦片服务
完整支持TMS(瓦片地图服务)协议
兼容WMS(Web地图服务)标准
实现动态瓦片加载和缓存管理
示例:接入OpenStreetMap等在线地图服务
项目开发脚手架
1. CMake构建系统
采用模块化CMakeLists.txt配置
支持跨平台构建(Windows/Linux)
集成第三方库自动查找和链接
2. VSCode开发环境
配置完整的.vscode开发调试环境
包含tasks.json构建任务
配置launch.json调试参数
使用C++智能提示插件增强开发体验
3. 空间计算库
使用glm数学库处理3D变换
实现坐标转换和投影计算
包括矩阵运算、向量计算等基础功能
示例:使用glm进行模型矩阵变换和视角计算
Cesium-Vulkan
├─ .vscode/ # VS Code 工作区配置目录(如 tasks/launch/settings 等)
├─ assets/ # 资源目录
│ └─ skybox/ # 天空盒资源子目录
│ └─ test.jpg # 示例纹理/天空盒图片
├─ bin/
│ └─ Debug/ # Debug 构建输出目录
│ ├─ assets/ # 输出的资源目录(可能与根 assets 关联)
│ ├─ shaders/ # 输出的着色器目录(可能与根 shaders 关联)
│ ├─ CesiumVulkanDemo.exe # 可执行文件
│ ├─ CesiumVulkanDemo.pdb # 调试符号文件
│ └─ imgui.ini # Dear ImGui 配置文件(运行时生成/配置)
├─ build/ # CMake 构建中间产物目录( Ninja/Makefile 等)
├─ extern/ # 第三方依赖库目录(通过 git submodule 或手动放置)
│ ├─ cesium-native/ # Cesium Native 依赖
│ ├─ glad/ # Glad(OpenGL 函数加载器)
│ ├─ glfw/ # GLFW(窗口/上下文创建)
│ ├─ glm/ # GLM(数学库)
│ ├─ imgui/ # Dear ImGui(GUI 库)
│ ├─ KHR/ # Khronos 头文件(如 vulkan 相关)
│ └─ stb/ # stb 单文件库(图像加载等)
├─ include/ # 项目自定义头文件目录
│ ├─ renderer/ # 渲染模块头文件子目录(可按需扩展)
│ ├─ FileHelper.h # 文件辅助工具头文件
│ └─ HelloRect.h # 示例矩形渲染头文件
├─ scripts/ # 脚本目录(如构建/部署脚本,若有)
├─ shaders/ # 着色器源文件目录(GLSL/SPIR-V 等)
├─ src/ # 项目源代码目录
│ ├─ renderer/ # 渲染模块实现子目录(与 include/renderer 对应)
│ ├─ FileHelper.cpp # 文件辅助工具实现
│ ├─ HelloRect.cpp # 示例矩形渲染实现
│ └─ main.cpp # 程序入口
├─ .clang-format # clang-format 代码格式化配置
├─ .gitignore # Git 忽略规则
├─ .gitmodules # Git 子模块配置(关联 extern/ 里的依赖)
├─ CMakeLists.txt # CMake 构建脚本
├─ imgui.ini # Dear ImGui 配置模板(可能与 bin/Debug 里的运行时文件区分)
├─ LICENSE # 项目许可证
└─ README.md # 项目说明文档
二、CMake配置
# 设置所需的最低 CMake 版本
cmake_minimum_required(VERSION 3.20)
# 定义项目名称和支持的语言
project(CesiumVulkanDemo LANGUAGES CXX C)
# 设置 C++ 标准为 C++20
set(CMAKE_CXX_STANDARD 20)
# 要求必须使用指定的 C++ 标准,否则构建失败
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Windows 平台配置
if(WIN32)
# 将可执行文件输出到项目根目录下的 bin 文件夹
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)
endif()
# 定义外部库的根目录
set(EXTERNAL_LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/extern)
# 设置各个外部依赖库的路径
set(CESIUM_NATIVE_ROOT ${EXTERNAL_LIB_DIR}/cesium-native)
set(GLFW_ROOT ${EXTERNAL_LIB_DIR}/glfw)
set(IMGUI_ROOT ${EXTERNAL_LIB_DIR}/imgui)
set(GLM_ROOT ${EXTERNAL_LIB_DIR}/glm)
# 递归搜索 src 目录下的所有 .cpp 和 .c 文件作为源文件
file(GLOB_RECURSE SOURCE_FILES src/*.cpp src/*.c)
# 创建可执行文件,名称为项目名称
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
# 设置项目的头文件搜索路径
target_include_directories(${PROJECT_NAME} PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/include # 项目自身的 include 目录
${GLM_ROOT} # GLM 数学库目录
${EXTERNAL_LIB_DIR} # 外部库根目录
)
# MSVC 编译器特定配置
if(MSVC)
# 调试模式下启用调试信息和禁用优化
target_compile_options(${PROJECT_NAME} PRIVATE
"$<$<CONFIG:Debug>:/Zi>" # 生成调试信息
"$<$<CONFIG:Debug>:/Od>" # 禁用优化
)
# 链接时忽略缺少 PDB 文件的警告(4099)
target_link_options(${PROJECT_NAME} PRIVATE "/IGNORE:4099")
# 根据配置类型选择不同的运行时库(/MDd 调试版,/MD 发布版)
target_compile_options(${PROJECT_NAME} PRIVATE
"$<$<CONFIG:Debug>:/MDd>" # 调试版使用多线程 DLL 调试运行时库
"$<$<NOT:$<CONFIG:Debug>>:/MD>" # 其他配置使用多线程 DLL 运行时库
)
# 非 MSVC 编译器配置(如 GCC, Clang)
else()
# 调试模式下启用调试信息和禁用优化
target_compile_options(${PROJECT_NAME} PRIVATE
"$<$<CONFIG:Debug>:-g>" # 生成调试信息
"$<$<CONFIG:Debug>:-O0>" # 禁用优化
)
endif()
# 在指定路径查找 GLFW 库
find_library(GLFW_LIB glfw3 PATHS ${GLFW_ROOT}/lib NO_DEFAULT_PATH)
# 如果找不到 GLFW 库,输出致命错误并终止配置
if(NOT GLFW_LIB)
message(FATAL_ERROR "GLFW library not found in: ${GLFW_ROOT}/lib")
endif()
# 创建一个接口库 stb_image(仅包含头文件的库)
add_library(stb_image INTERFACE)
# 设置 stb_image 库的头文件搜索路径
target_include_directories(stb_image INTERFACE ${EXTERNAL_LIB_DIR})
# 将 stb_image 库链接到项目
target_link_libraries(${PROJECT_NAME} PRIVATE stb_image)
# 查找系统上的 Vulkan 开发包,这是必需的依赖
find_package(Vulkan REQUIRED)
# 创建静态库 imgui,包含 ImGui 及其后端的源文件
add_library(imgui STATIC
${IMGUI_ROOT}/imgui.cpp
${IMGUI_ROOT}/imgui_demo.cpp
${IMGUI_ROOT}/imgui_draw.cpp
${IMGUI_ROOT}/imgui_tables.cpp
${IMGUI_ROOT}/imgui_widgets.cpp
${IMGUI_ROOT}/backends/imgui_impl_glfw.cpp
${IMGUI_ROOT}/backends/imgui_impl_vulkan.cpp
)
# 设置 imgui 库的头文件搜索路径
target_include_directories(imgui PUBLIC
${IMGUI_ROOT} # ImGui 主目录
${IMGUI_ROOT}/backends # ImGui 后端目录
${GLFW_ROOT}/include # GLFW 头文件目录
$<TARGET_PROPERTY:Vulkan::Vulkan,INTERFACE_INCLUDE_DIRECTORIES> # Vulkan 头文件目录
)
# 添加 Cesium Native 库的子目录,但排除在默认构建目标之外
add_subdirectory(${CESIUM_NATIVE_ROOT} EXCLUDE_FROM_ALL)
# 创建一个接口库作为 Cesium Native 的包装器
add_library(cesium-native-wrapper INTERFACE)
# 将所有需要的 Cesium 模块链接到这个包装器
target_link_libraries(cesium-native-wrapper INTERFACE
CesiumUtility
CesiumGltf
CesiumGeometry
CesiumGeospatial
CesiumJsonReader
CesiumJsonWriter
CesiumGltfContent
CesiumGltfReader
CesiumGltfWriter
CesiumAsync
Cesium3DTiles
Cesium3DTilesReader
Cesium3DTilesWriter
Cesium3DTilesContent
CesiumRasterOverlays
Cesium3DTilesSelection
CesiumQuantizedMeshTerrain
CesiumIonClient
)
# 将项目与所需的库链接
target_link_libraries(${PROJECT_NAME} PRIVATE
Vulkan::Vulkan # Vulkan 库
imgui # ImGui 库
${GLFW_LIB} # GLFW 库
cesium-native-wrapper # Cesium Native 包装器库
)
# 获取可执行文件的输出目录
set(OUTPUT_DIR $<TARGET_FILE_DIR:${PROJECT_NAME}>)
# 构建后命令:将 shaders 目录复制到可执行文件所在目录
add_custom_command(
TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
${CMAKE_CURRENT_SOURCE_DIR}/shaders
${OUTPUT_DIR}/shaders
COMMENT "Copying shaders to build directory..."
)
# 构建后命令:将 assets 目录复制到可执行文件所在目录
add_custom_command(
TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
${CMAKE_CURRENT_SOURCE_DIR}/assets
${OUTPUT_DIR}/assets
COMMENT "Copying assets to build directory..."
)
三、VSCode开发环境配置
1、tasks.json
{
"version": "2.0.0", // tasks.json 格式版本
"tasks": [
{
// 构建任务:执行实际的项目编译
"label": "Build",
"type": "shell", // 使用 shell 命令执行
"command": "cmake", // 使用 CMake 命令
"args": [
"--build", // 指定 CMake 执行构建操作
"${workspaceFolder}/build", // 构建目录
"--config", "Debug", // 构建配置为 Debug
"--parallel" // 并行构建(使用默认线程数)
],
"group": {
"kind": "build", // 属于构建组
"isDefault": true // 设置为默认构建任务
},
"problemMatcher": ["$gcc"], // 使用 GCC 错误匹配器解析编译错误
"detail": "Build Debug Configuration" // 任务详细描述
},
{
// 配置任务:使用 CMake 生成项目文件
"label": "Configure",
"type": "shell", // 使用 shell 命令执行
"command": "cmake", // 使用 CMake 命令
"args": [
"-S", // 指定源代码目录
"${workspaceFolder}", // 源代码目录为工作区根目录
"-B", // 指定构建目录
"${workspaceFolder}/build", // 构建目录
"-G "Visual Studio 17 2022"", // 生成 Visual Studio 2022 项目文件
"-DCMAKE_BUILD_TYPE=Debug" // 设置构建类型为 Debug
],
"group": {
"kind": "build", // 属于构建组
"isDefault": false // 非默认构建任务
},
"problemMatcher": ["$gcc"], // 使用 GCC 错误匹配器解析配置错误
"detail": "Configure the project using CMake" // 任务详细描述
}
]
}
2、launch.json
{
"version": "0.2.0", // launch.json 格式版本
"configurations": [
{
// 调试配置:用于调试 CesiumVulkanDemo 应用程序
"name": "Debug CesiumVulkan",
"type": "cppvsdbg", // 使用 Visual Studio 调试器(适用于 Windows)
"request": "launch", // 请求启动程序进行调试
"program": "${workspaceFolder}/bin/Debug/CesiumVulkanDemo.exe", // 要调试的可执行文件路径
"args": [], // 传递给程序的命令行参数(此处为空)
"stopAtEntry": false, // 是否在程序入口点(main 函数)处暂停
"cwd": "${workspaceFolder}", // 程序运行时的工作目录(设置为工作区根目录)
}
]
}
这个 launch.json
文件定义了一个调试配置,主要功能是:
使用 Visual Studio 调试器(cppvsdbg)来调试应用程序
启动并调试位于 bin/Debug
目录下的 CesiumVulkanDemo.exe
可执行文件
不传递任何命令行参数给程序
不在程序入口点暂停,直接开始执行
将工作目录设置为项目根目录,确保程序能正确找到相对路径的资源文件
按 F5 键运行调试
3、settings.json
settings.json
是 VS Code(Visual Studio Code)的用户或工作区配置文件,用于定义当前项目或全局的开发环境设置。
{
// 标记当前项目不是 Nuxt.js 应用(Nuxt 是 Vue.js 的服务端渲染框架)
"nuxt.isNuxtApp": false,
// CMake 项目配置
"cmake.sourceDirectory": "${workspaceFolder}", // CMake 源代码目录(项目根目录)
"cmake.buildDirectory": "${workspaceFolder}/build", // CMake 构建输出目录
"cmake.generator": "Ninja", // 指定 CMake 使用 Ninja 作为构建系统(比传统的 Makefile 更快)
"cmake.configureOnOpen": true, // 打开项目时自动运行 CMake 配置
// C/C++ 代码格式化配置
"C_Cpp.clang_format_path": "D:/DevelopApps/clang+llvm-18.1.8-x86_64-pc-windows-msvc/bin/clang-format.exe", // 指定 clang-format 工具的路径
"C_Cpp.formatting": "clangFormat", // 使用 clang-format 进行代码格式化
"editor.formatOnSave": false, // 保存文件时不自动格式化(可通过 Ctrl+Shift+I 手动触发)
"C_Cpp.clang_format_style": "file", // 使用项目根目录下的 .clang-format 文件定义格式化风格
// 文件类型关联配置:指定不同扩展名的文件使用何种语言模式解析
"files.associations": {
"*.tcc": "cpp", // .tcc 文件按 C++ 语法解析(常用于模板实现文件)
"*.h": "cpp", // .h 头文件按 C++ 语法解析
"glad.h": "c", // glad.h(OpenGL 加载库)按 C 语言语法解析
"string.h": "c", // C 标准库头文件按 C 语言语法解析
// 以下是 C++ 标准库头文件的关联配置
"any": "cpp",
"array": "cpp",
"atomic": "cpp",
// ...(省略其他标准库头文件关联配置)
}
}
4、c_cpp_properties.json
在 Visual Studio Code(VS Code)中,c_cpp_properties.json
是 C/C++ 扩展(由 Microsoft 提供)的配置文件,用于控制代码智能提示(IntelliSense)、语法检查、头文件搜索路径等功能。它不是编译器或构建工具的配置文件(如 CMake、Makefile),而是专门用于 编辑器自身的代码分析环境。
{
"configurations": [
{
// 配置名称(用于在VS Code中选择不同的编译配置)
"name": "Win32",
// 头文件搜索路径:编译器查找#include文件的位置
"includePath": [
"${workspaceFolder}/**", // 项目根目录下的所有文件夹(递归搜索)
"D:/VulkanSDK/1.3.243.0/Include" // Vulkan SDK的头文件目录
],
// 预处理器定义:相当于编译器命令行中的-D选项
"defines": [
"_DEBUG", // 定义_DEBUG宏(通常用于启用调试相关代码)
"UNICODE", // 启用Unicode字符集
"_UNICODE" // Windows特定的Unicode定义
],
// 编译器路径:指定使用的C/C++编译器
// "compilerPath": "D:\DevelopApps\mingw64\bin\gcc.exe", // MinGW GCC编译器(已注释)
"compilerPath": "D:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.37.32822\bin\Hostx64\x64\cl.exe", // Visual Studio 2022的C++编译器
// C语言标准版本
"cStandard": "c17",
// C++语言标准版本
"cppStandard": "c++20"
}
],
"version": 4 // 配置文件版本(当前为4)
}
暂无评论内容