ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Vulkan C++ Examples 多平台构建完全指南:从 Windows 到 Android/iOS 的 CMake 与 Gradle 实战

Vulkan C++ Examples 多平台构建完全指南:从 Windows 到 Android/iOS 的 CMake 与 Gradle 实战 示例工程图形学【免费下载链接】VulkanC examples for the Vulkan graphics API项目地址https://gitcode.com/gh_mirrors/vu/Vulkan点击查看免费下载本指南以 BUILD.md 为主体完整覆盖 Vulkan C Examples 仓库在 Windows、Linux、Android、macOS 与 iOS 上的构建流程CMake 通用选项、各平台 WSI窗口系统集成选择、Android Gradle 构建、Apple 平台的 MoltenVK 驱动配置并结合仓库根目录 CMakeLists.txt、base/CMakeLists.txt、examples/CMakeLists.txt 等源码级配置深入解释每个构建选项背后的实际作用。读完本文你可以从零开始在任意目标平台上编译并运行全部约百个 Vulkan 示例程序。构建前提与整体架构依赖全部内置无需额外下载根据 BUILD.md 的说明本仓库包含编译和构建示例所需的一切依赖GLM、ImGui、KTX、tinygltf、stb、Vulkan Headers 等全部随仓库以子模块或源码形式提供。仓库的 CMakeLists.txt 中通过include_directories(external)、include_directories(external/glm)、include_directories(external/imgui)、include_directories(external/tinygltf)、include_directories(external/ktx/include)、include_directories(base)将这些第三方库直接纳入编译搜索路径。构建所需的编译器要求如下要求项说明编译器支持C20及以上的 C 编译器MSVC、GCC、Clang 均可构建系统CMake最低版本3.10.0支持平台Windows、Linux、Android、macOS、iOS仓库根 CMakeLists.txt 第 4 行cmake_minimum_required(VERSION 3.10.0 FATAL_ERROR)、第 137-138 行set(CMAKE_CXX_STANDARD 20)与set(CMAKE_CXX_STANDARD_REQUIRED ON)与文档要求完全一致。构建系统的两级结构从源码结构看整个构建由三个 CMakeLists 协作完成形成顶层 → 基础库 → 示例的分层结构顶层 CMakeLists.txt负责查找 Vulkan 库、设定平台宏VK_USE_PLATFORM_*、选择资源路径策略并通过add_subdirectory(base)与add_subdirectory(examples)引入下级构建。base/CMakeLists.txt将base目录下的通用框架源码vulkanexamplebase.cpp、VulkanDevice.cpp、VulkanSwapChain.cpp、VulkanTexture.cpp、VulkanBuffer.cpp等与external/imgui、external/ktx的相关源文件一起编译成静态库base同时把shaders/glsl/base、shaders/hlsl/base、shaders/slang/base下的基础着色器源码加入工程。examples/CMakeLists.txt通过buildExample(EXAMPLE_NAME)函数为EXAMPLES列表中列出的每个示例单独生成可执行目标。列表中共有约百个示例triangle、deferred、raytracingbasic、computeheadless、vulkanscene等每个示例目标都会链接base库并把该示例对应目录下的*.cpp及其 GLSL/HLSL/slang 着色器源码一起纳入构建。这种设计的直接好处是着色器源码作为构建目标的一部分被 IDE如 Visual Studio、Xcode识别和管理同时 SPIR-V 预编译产物.spv也已随仓库提供在 shaders/ 目录中确保开箱即用。通用 CMake 选项资源与着色器路径配置默认路径策略BUILD.md 指出示例使用的资产Assets与着色器Shader路径默认是绝对路径基于当前 CMake 源码树的顶层目录。这一逻辑在顶层 CMakeLists.txt 第 142-153 行有对应实现当未指定RESOURCE_INSTALL_DIR且未开启USE_RELATIVE_ASSET_PATH时会编译期注入add_definitions(-DVK_EXAMPLE_ASSETS_DIR${CMAKE_SOURCE_DIR}/assets/) add_definitions(-DVK_EXAMPLE_SHADERS_DIR${CMAKE_SOURCE_DIR}/shaders/)即把仓库根目录下的assets/与shaders/的绝对路径硬编码进每个示例。这些宏最终由运行时路径查询函数消费参见 base/VulkanTools.cppgetAssetPath()返回VK_EXAMPLE_ASSETS_DIRgetShaderBasePath()返回VK_EXAMPLE_SHADERS_DIR。示例启动时还会在 base/vulkanexamplebase.cpp 中对该路径做存在性检查找不到资产目录会直接报错退出因此在移动端或安装包分发场景必须显式配置路径选项。两个可调选项文档给出的两个 CMake 选项如下选项作用RESOURCE_INSTALL_DIR设置资产与着色器的绝对安装/加载路径USE_RELATIVE_ASSET_PATH使用相对二进制文件的固定相对路径加载资产与着色器结合顶层 CMakeLists.txt 的实现逻辑设置RESOURCE_INSTALL_DIR路径时会注入VK_EXAMPLE_ASSETS_DIR路径/与VK_EXAMPLE_SHADERS_DIR路径/shaders/并通过install(DIRECTORY assets/ DESTINATION ...)与install(DIRECTORY shaders/ DESTINATION ...)把资产和着色器随示例一起安装到该目录examples/CMakeLists.txt 也只在设置了RESOURCE_INSTALL_DIR时才注册install(TARGETS ...)用于制作安装包分发。设置USE_RELATIVE_ASSET_PATH后不再注入绝对路径宏base/VulkanTools.cpp 中getAssetPath()与getShaderBasePath()会回退到相对路径./../assets/与./../shaders/适合把assets、shaders与可执行文件按固定相对布局一起拷贝的部署方式。二者均未设置时则采用前文所述的源码树绝对路径默认值。此外示例还支持运行时覆盖在 base/VulkanTools.cpp 中vks::tools::resourcePath非空时优先返回resourcePath /assets/与resourcePath /shaders/。这正是命令行参数-rp/--resourcepath见 README.md 的 Running 章节所设置的值可以在不重新编译的情况下切换资产目录。Windows 平台构建按 BUILD.md 的说明在 Windows 上直接使用仓库提供的 CMakeLists.txt 生成你喜欢的 IDE 或编译器对应的构建配置例如 Visual Studio 2019 的 64 位工程cmake -G Visual Studio 16 2019 -A x64顶层 CMake 在 Windows 分支CMakeLists.txt中会做两件事若系统找不到 Vulkan 库则回退到仓库自带库find_library(Vulkan_LIBRARY NAMES vulkan-1 vulkan PATHS ${CMAKE_SOURCE_DIR}/libs/vulkan)——仓库的 libs/vulkan/vulkan-1.lib 正是为此准备的随附 Vulkan 库版本。注入平台宏-DVK_USE_PLATFORM_WIN32_KHR启用 Win32 平台集成。生成后打开解决方案或直接使用 CMake 生成的目标将某个示例设为启动项目即可编译运行示例的调试工作目录被 examples/CMakeLists.txt 设置为仓库根bin目录保证相对资源路径可正确解析。Linux 平台构建与 WSI 选择Linux 同样使用仓库提供的 CMakeLists 生成构建配置核心在于WSIWindow System Integration窗口系统集成的选择。文档列出了四种方式WSI 类型启用方式XCB默认不指定任何 cmake 选项时启用Wayland-DUSE_WAYLAND_WSIONDirectFB-DUSE_DIRECTFB_WSIONDirectToDisplay-DUSE_D2D_WSION顶层 CMakeLists.txt 的 Linux 分支用IF/ELSEIF链精确实现了这一优先级逻辑并对应注入不同的平台宏默认走find_package(XCB REQUIRED)-DVK_USE_PLATFORM_XCB_KHRUSE_WAYLAND_WSI分支依赖pkg-config、Wayland 开发包与wayland-scanner并自动用wayland-scanner从xdg-shell.xml协议文件生成xdg-shell-client-protocol.h与xdg-shell-protocol.cCMakeLists.txtexamples/CMakeLists.txt 会把这些生成文件加入每个示例目标的源文件列表USE_DIRECTFB_WSI分支通过find_package(DirectFB REQUIRED)定位 DirectFB 开发包并注入-DVK_USE_PLATFORM_DIRECTFB_EXTCMakeLists.txt对应仓库中提供的 cmake/FindDirectFB.cmakeUSE_D2D_WSI分支注入-D_DIRECT2DISPLAY实现无需窗口服务器的直接显示输出CMakeLists.txt。此外Linux 分支还会find_package(Threads REQUIRED)链接线程库并在找不到系统 Vulkan 时回退查找仓库 libs/vulkan 中的库。Wayland 相关的查找模块在 cmake/FindWayland.cmakeXCB 相关模块在 cmake/FindXCB.cmake需要排查依赖问题时可直接查看这两个文件。一个典型的 Linux 构建命令序列为# 默认 XCB cmake -S . -B build cmake --build build -j # 或指定 Wayland cmake -S . -B build-wayland -DUSE_WAYLAND_WSION cmake --build build-wayland -jAndroid 平台构建Gradle构建方式Android 构建使用Gradle Build Tool仓库 android 目录自带 Gradle Wrapper见 android/gradlew 与 android/gradle/wrapper文档给出了两条路线推荐方式使用 Android Studio 直接打开android项目文件夹构建后即可从项目列表中选择要运行的示例。命令行方式通过环境变量ANDROID_SDK_ROOT/ANDROID_NDK_HOME指定 Android SDK 与 NDK 位置。Linux/macOS 下执行cd android ./gradlew assembleDebug该命令会本地下载 gradle、构建全部示例并将 APK 输出到android/examples/bin。Windows 下改用gradlew.bat assembleDebug如需构建并安装到已连接的设备或模拟器将assembleDebug换成installDebug即可。构建内部机制从 android/settings.gradle 可以看到Gradle 会遍历android/examples下除_template之外、存在build.gradle的所有子目录把它们动态注册为项目模块file(examples).eachDir { sub - if (sub.name ! _template) { if (file(examples/$sub.name/build.gradle).exists()) { include :$sub.name project(:$sub.name).projectDir new File(examples/$sub.name) } } }这也是为什么android/examples下有几十个示例模块triangle、bloom、deferred、computeshader等每个模块含.java、AndroidManifest.xml与说明txt。每个示例模块都是一份独立的AndroidManifest.xml Java 源码结构例如 android/examples/triangle启动器支持从项目列表选择任意示例运行。Gradle 相关配置方面android/gradle.properties 中设置了org.gradle.jvmargs-Xmx4096M提高 Gradle 守护进程堆内存适用于大型多模块工程android/settings.gradle 负责多模块聚合SDK/NDK 版本等约束在示例模块各自的build.gradle中声明。Android 平台的资产路径值得注意的是在 Android 上getAssetPath()与getShaderBasePath()会直接返回空字符串与shaders/base/VulkanTools.cpp即资产打包进 APK、着色器从 APK 内shaders/目录读取无需也不应再通过 CMake 的路径选项干预——这也是 Android 分支在顶层 CMake 中被注释Todo : android?CMakeLists.txt的原因。macOS 与 iOS 构建MoltenVK先决条件Metal 之上的 Vulkan 驱动BUILD.md 特别提醒在 macOS 与 iOS 上运行这些示例需要一个支持MetalAPI 的 Vulkan 驱动——MoltenVK或KosmicKrisp。这是因为 Apple 平台本身没有原生 VulkanVulkan API 调用经由这类驱动翻译到 Metal 执行。仓库的 Apple 工程与说明见 apple 目录与 apple/README_MoltenVK_Examples.md。macOS 构建步骤文档给出的 macOS 完整流程如下1. 下载并解压最新 Vulkan SDKcurl -O https://sdk.lunarg.com/sdk/download/latest/mac/vulkan_sdk.zip unzip vulkan_sdk.zip说明该 SDK 下载地址属于文档原始内容属于构建所需的外部工具链资源。本文仅复述文档事实不另提供其他外部链接。2. 安装 SDK 并激活驱动打开vulkansdk-macOS-version安装包选择System Global Installation。MoltenVK驱动在 Apple Silicon 与 x86_64 Mac 上默认使用。在 Apple Silicon 机器上还可以可选安装KosmicKrisp然后通过环境变量激活它export VK_DRIVER_FILES/usr/local/share/vulkan/icd.d/libkosmickrisp_icd.json3. 安装 OpenMP 库libompbrew install libomp export LIBOMP_PREFIX$(brew --prefix libomp)libomp 是 texture3d 等使用 OpenMP 的示例所必需的examples/CMakeLists.txt 中为texture3d专门做了 OpenMP 查找与链接支持 MacPorts 与 Homebrew 两种路径前缀从源码结构看这正是文档要求安装 libomp 的原因。4. 用 CMake 生成 Xcode 工程cmake -G Xcode -DOpenMP_omp_LIBRARY$LIBOMP_PREFIX/lib/libomp.dylib . \ -DCMAKE_XCODE_SCHEME_ENABLE_GPU_API_VALIDATIONOFF其中-DOpenMP_omp_LIBRARY显式指定 libomp 动态库路径-DCMAKE_XCODE_SCHEME_ENABLE_GPU_API_VALIDATIONOFF关闭 Xcode 的 Metal API 验证。5. 打开生成的 Xcode 工程通过 scheme 下拉列表选择示例按 Command-B 构建。Xcode 生成过程还有一些值得注意的细节CMakeLists.txt设置了CMAKE_SUPPRESS_REGENERATION ON避免 Xcode 丢失环境变量后反复触发重新生成若检测到VK_ADD_LAYER_PATH、VK_ICD_FILENAMES、VK_DRIVER_FILES等环境变量会把它们写入 Xcode scheme 的 scheme environment使调试运行时也能使用已配置的驱动与验证层当系统找不到 Vulkan 加载器时会回退查找libMoltenVK.dylibHINTS $ENV{VULKAN_SDK}/lib $ENV{VULKAN_SDK}/dylib/macOS并提示 Using MoltenVK Vulkan Portability library注入-DVK_USE_PLATFORM_METAL_EXT -DVK_EXAMPLE_XCODE_GENERATED平台宏。另外Apple 平台上getAssetPath()/getShaderBasePath()的实现位于 base/vulkanexamplebase.cppObj-C 代码段优先使用 CMake 注入的VK_EXAMPLE_ASSETS_DIR/VK_EXAMPLE_SHADERS_DIR否则回退到NSBundle.mainBundle.resourcePath下的相对目录与 base/VulkanTools.cpp 中iOS/macOS 由外部实现路径工具的注释相互印证。iOS 构建iOS 构建请直接进入 apple 目录遵循 apple/README_MoltenVK_Examples.md 中的说明要点包括需要Vulkan SDK 1.3.275.0 或更新版本SDK 中已包含 iOS、iOS 模拟器与 macOS 所需的 MoltenVK 库框架安装 SDK 后需要把本目录下的MoltenVK.xcframework符号链接重新指向 SDK 内的版本ln -s path-to-VulkanSDK/macOS/lib/MoltenVK.xcframework打开 apple/examples.xcodeproj需Xcode 15.3 或更高在 apple/examples.h 中按注释说明选择要运行的示例再运行examples-iOS或examples-macOSschemeiOS 部署需要在 scheme 中配置开发团队签名与唯一的 Bundle IdentifieriOS 设备上使用单/双指手势控制场景模拟器与 macOS 使用鼠标按键交互按 apple/README_MoltenVK_Examples.md 中的对照说明如用数字键代替 F1/F2、p键暂停/恢复动画等。构建后的运行与验证运行示例桌面平台构建完成后可执行文件输出到构建目录的bin/顶层 CMakeLists.txt 设置CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/。每个示例支持丰富的命令行参数用--help查看完整列表详见 README.md 的 Running 章节常用的有参数作用-v, --validation启用验证层-vs, --vsync启用垂直同步-f, --fullscreen全屏启动-w/--width、-h/--height设置窗口宽高-s, --shaders选择着色器语言glsl / slang / hlsl-g, --gpu、-gl, --listgpus选择 GPU、列出可用 Vulkan 设备-b, --benchmark及-bw/-br/-bf/-bt/-bfs基准测试模式及预热/时长/结果文件等参数-rp, --resourcepath设置资产与着色器所在目录部分示例依赖特定设备特性在多 GPU 机器上可能需要用-gl和-g挑选支持这些特性的 GPU 来运行。着色器语言切换仓库的着色器体系shaders/README.md支持GLSL、HLSL 与 slang三种着色语言统一编译到 SPIR-V 后由 Vulkan 消费。默认主着色语言是 GLSLshaders/glsl多数示例同时提供 shaders/hlsl 与 shaders/slang 版本便于对比不同着色语言差异。使用 slang 着色器时shaders/README.md 提醒slang 需要不同的 SPIR-V 环境会将所有示例的基础要求提升到 Vulkan 1.1 SPIR-V 1.4 扩展。需要重新编译着色器时可使用 shaders/glsl/compileshaders.py 等脚本各语言目录下均有compileshaders.py或任意能生成 Vulkan SPIR-V 的工具。无窗口Headless示例对于没有显示器/窗口系统的环境仓库还提供 Headless 示例computeheadlessexamples/computeheadless只用计算着色器完成计算并通过命令行输出结果renderheadlessexamples/renderheadless把场景渲染到不可见帧缓冲并回读存盘。顶层 CMake 中还提供USE_HEADLESS选项注入-DVK_USE_PLATFORM_HEADLESS_EXTCMakeLists.txt适合在 CI 或服务器环境下编译运行。常见问题排查要点找不到 Vulkan 库桌面平台 CMake 在系统库缺失时会回退到仓库 libs/vulkan 内置库Windows 为vulkan-1.libLinux 为libvulkan若仍失败会以FATAL_ERROR终止CMakeLists.txt。请先确认已安装对应平台的 Vulkan SDK / 驱动。资产路径错误示例启动时会在 base/vulkanexamplebase.cpp 检查资产目录是否存在按上文通用 CMake 选项配置RESOURCE_INSTALL_DIR/USE_RELATIVE_ASSET_PATH或运行时用-rp指定目录即可。Wayland 依赖缺失启用USE_WAYLAND_WSI时要求pkg-config、Wayland 开发包与wayland-scanner齐备缺失时 CMake 会以FATAL_ERROR明确提示。Xcode 环境变量丢失由于 Xcode 的 scheme 环境不继承终端环境变量顶层 CMake 已自动把VK_DRIVER_FILES等写进 schemeCMakeLists.txt若自定义驱动仍不生效可在 Xcode 的 scheme 环境变量中手动补充。texture3d 的 OpenMP 依赖macOS 上需按文档安装 libomp 并设置LIBOMP_PREFIX否则该示例会因缺少 OpenMP 运行时而无法链接。小结本仓库的构建体系覆盖了桌面Windows/Linux、移动Android/iOS/macOS与无窗口Headless三类场景全部依赖内置、开箱即用桌面与 macOS 走 CMake最低 3.10.0C20Android 走 Gradle WrapperApple 平台依赖 MoltenVK/KosmicKrisp 将 Vulkan 翻译到 Metal。资产与着色器路径通过RESOURCE_INSTALL_DIR、USE_RELATIVE_ASSET_PATH及运行时-rp参数三级可调Linux 的 WSI 通过USE_WAYLAND_WSI、USE_DIRECTFB_WSI、USE_D2D_WSI灵活切换。结合 BUILD.md、顶层与各级 CMakeLists.txt 及 shaders/README.md你可以快速搭建起跨平台 Vulkan 示例的开发与验证环境。赞分享示例工程图形学【免费下载链接】VulkanC examples for the Vulkan graphics API项目地址https://gitcode.com/gh_mirrors/vu/Vulkan点击查看免费下载相关推荐c-ares 1.34.6 编译安装完全指南从 AutoTools 到 CMake 的多平台构建实践c ares 1.34.6 编译安装完全指南从 AutoTools 到 CMake 的多平台构建实践 本指南以 c ares 1.34.6本仓库内置的异步可观测性日志分析云原生流处理终极跨平台Vulkan开发指南Windows、Android、iOS和macOS构建全攻略终极跨平台Vulkan开发指南Windows、Android、iOS和macOS构建全攻略 想要掌握 Vulkan跨平台开发 技术构建高性能图形应用这份完示例工程图形学3 条命令跑通 PDF 全文翻译公式和排版完整保留的完整指南3 条命令跑通 PDF 全文翻译公式和排版完整保留的完整指南 PDFMathTranslatepdf2zh把外文 PDF 译成中文同时保留数学公式、图表AI 应用人工智能NLPOCR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表