Vulkan 3D Tiles渲染器开发笔记1-脚手架搭建

一、项目简介

项目技术栈

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)
}

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容