DiligentEngine 2.5.x 跨平台图形库集成实战:CMake 项目 5 步接入指南

DiligentEngine 2.5.x 跨平台图形库集成实战:CMake 项目 5 步接入指南
DiligentEngine 2.5.x 跨平台图形库集成实战CMake 项目 5 步接入指南在当今多平台图形开发领域DiligentEngine 作为一款现代化的跨平台低级图形 API 抽象层和渲染框架凭借其对 Direct3D12、Vulkan 和 Metal 的深度优化支持同时兼容 Direct3D11、OpenGL 和 OpenGLES 等传统 API已成为游戏引擎、工业仿真和 XR 应用开发者的重要选择。本文将深入解析如何将 DiligentEngine 2.5.x 无缝集成到现有 CMake 项目中通过五个关键步骤实现高效接入。1. 环境准备与源码获取1.1 系统依赖检查在开始集成前需确保开发环境满足以下基础要求CMake 3.16跨平台构建工具核心依赖Python 3.0部分自动化脚本的运行环境平台特定工具链WindowsVisual Studio 2019 或 MinGWWindows SDK 10.0.17763LinuxGCC 7 或 ClangMesa 开发包macOSXcode 12Metal 支持AndroidNDK r21CMake 3.18提示可通过cmake --version和python --version验证工具版本不满足时需优先升级。1.2 源码获取与子模块初始化DiligentEngine 采用模块化设计核心组件通过 Git 子模块管理。执行以下命令完成完整源码获取git clone --recursive https://github.com/DiligentGraphics/DiligentEngine.git cd DiligentEngine git submodule update --init --recursive关键模块说明DiligentCore核心图形 API 抽象层DiligentTools纹理加载、调试工具等实用组件DiligentFX高级渲染效果实现DiligentSamplesAPI 使用示例2. CMake 项目基础配置2.1 最小化 CMake 配置假设项目目录结构如下MyProject/ ├── CMakeLists.txt ├── src/ │ └── main.cpp └── extern/ └── DiligentCore/基础 CMake 配置需包含以下内容cmake_minimum_required(VERSION 3.16) project(MyGraphicsProject LANGUAGES CXX) # 添加DiligentCore子目录 add_subdirectory(extern/DiligentCore) # 创建可执行文件 add_executable(MyApp src/main.cpp) # 链接核心图形引擎 target_link_libraries(MyApp PRIVATE Diligent-GraphicsEngineD3D11-shared Diligent-GraphicsEngineD3D12-shared Diligent-GraphicsEngineOpenGL-shared Diligent-GraphicsEngineVk-shared ) # 复制运行时依赖Windows动态链接必需 if(WIN32) include(DiligentCore/CMake/copy_required_dlls.cmake) copy_required_dlls(MyApp) endif()2.2 平台特定宏定义不同平台需预定义对应的宏标识平台预定义宏WindowsPLATFORM_WIN32Universal WindowsPLATFORM_UWPAndroidPLATFORM_ANDROIDLinuxPLATFORM_LINUXmacOSPLATFORM_MACOSiOSPLATFORM_IOS在 CMake 中通过target_compile_definitions设置if(WIN32) target_compile_definitions(MyApp PRIVATE PLATFORM_WIN321) elseif(APPLE) target_compile_definitions(MyApp PRIVATE PLATFORM_MACOS1) endif()3. 渲染后端选择与优化3.1 后端启用控制DiligentEngine 支持通过 CMake 选项灵活控制各图形后端的编译cmake -D DILIGENT_NO_DIRECT3D11ON \ # 禁用D3D11 -D DILIGENT_NO_VULKANOFF \ # 启用Vulkan -S . -B build常用控制选项DILIGENT_NO_DIRECT3D11禁用 Direct3D11 后端DILIGENT_NO_DIRECT3D12禁用 Direct3D12 后端DILIGENT_NO_OPENGL禁用 OpenGL 后端DILIGENT_NO_VULKAN禁用 Vulkan 后端DILIGENT_NO_GLSLANG禁用运行时着色器编译3.2 静态链接与动态链接对比DiligentEngine 提供两种链接方式各有适用场景特性静态链接动态链接二进制大小较大代码内联较小共享库内存占用较高无共享较低多进程共享部署复杂度简单单文件需附带DLL/SO热更新支持不支持支持初始化方式直接调用工厂函数需动态加载库静态链接示例代码// 无需特殊处理直接使用 auto* pFactoryD3D12 GetEngineFactoryD3D12();动态链接需额外步骤#if ENGINE_DLL // 加载动态库并获取工厂函数 auto GetEngineFactoryD3D12 LoadGraphicsEngineD3D12(); #endif auto* pFactoryD3D12 GetEngineFactoryD3D12();4. 高级集成技巧4.1 使用 FetchContent 动态集成对于不希望直接包含源码的项目可通过 CMake 的 FetchContent 模块动态获取include(FetchContent) FetchContent_Declare( DiligentCore GIT_REPOSITORY https://github.com/DiligentGraphics/DiligentCore.git SOURCE_DIR extern/DiligentCore ) FetchContent_MakeAvailable(DiligentCore) target_include_directories(MyApp PRIVATE ${diligentcore_SOURCE_DIR} )4.2 自定义构建配置通过编写BuildConfig.cmake脚本可深度定制构建过程# build_config.cmake function(custom_configure_build) # 定义Debug/Release之外的自定义配置 set(CMAKE_CONFIGURATION_TYPES Debug Release Profile CACHE STRING Config types FORCE) # Profile配置特定编译选项 set(CMAKE_CXX_FLAGS_PROFILE /O2 /Oi /GL CACHE INTERNAL FORCE) set(CMAKE_EXE_LINKER_FLAGS_PROFILE /LTCG CACHE INTERNAL FORCE) endfunction()在 CMake 命令中指定配置脚本cmake -D BUILD_CONFIGURATION_FILEbuild_config.cmake -S . -B build5. 实战初始化渲染设备5.1 跨平台设备创建以下代码展示如何在不同平台上初始化渲染设备#include DiligentCore/Graphics/GraphicsEngine/interface/RenderDevice.h #include DiligentCore/Graphics/GraphicsEngine/interface/DeviceContext.h void InitEngine() { EngineCreateInfo engineCI; #if PLATFORM_WIN32 auto* pFactoryD3D12 GetEngineFactoryD3D12(); pFactoryD3D12-CreateDeviceAndContextsD3D12(engineCI, m_pDevice, m_pContext); #elif PLATFORM_MACOS auto* pFactoryMetal GetEngineFactoryMetal(); pFactoryMetal-CreateDeviceAndContextsMetal(engineCI, m_pDevice, m_pContext); #elif PLATFORM_LINUX auto* pFactoryVk GetEngineFactoryVk(); pFactoryVk-CreateDeviceAndContextsVk(engineCI, m_pDevice, m_pContext); #endif }5.2 着色器管理最佳实践DiligentEngine 支持 HLSL 作为统一着色语言跨平台自动转换ShaderCreateInfo shaderCI; shaderCI.Desc.Name MyShader; shaderCI.FilePath shaders/my_shader.hlsl; shaderCI.EntryPoint main; shaderCI.SourceLanguage SHADER_SOURCE_LANGUAGE_HLSL; // 设置着色器宏 ShaderMacroHelper macros; macros.Add(USE_SHADOWS, 1); macros.Add(MAX_LIGHTS, 4); shaderCI.Macros macros; // 创建着色器流工厂 RefCntAutoPtrIShaderSourceInputStreamFactory pShaderSourceFactory; m_pEngineFactory-CreateDefaultShaderSourceStreamFactory(assets/shaders, pShaderSourceFactory); shaderCI.pShaderSourceStreamFactory pShaderSourceFactory; // 创建着色器对象 RefCntAutoPtrIShader pShader; m_pDevice-CreateShader(shaderCI, pShader);通过本文的五个关键步骤开发者可以快速将 DiligentEngine 集成到现有 CMake 项目中。实际项目中我曾遇到动态库加载路径问题最终通过设置CMAKE_RUNTIME_OUTPUT_DIRECTORY统一输出目录解决。对于移动平台集成建议优先测试 GLES 后端并注意着色器精度限定符的使用差异。