狸村 Mystic Web · 狸村
目录

在本章中,我们将设置用于开发 Vulkan 应用程序的环境,并安装一些有用的库。我们将使用的所有工具(除了编译器)都兼容 Windows、Linux 和 macOS,但安装步骤略有不同,因此我们分开介绍。

获取代码

首先,我们需要从 GitHub 仓库 克隆本教程的代码。 这需要安装 git 版本控制系统。

安装 git 后,我们可以像这样在本地克隆仓库:

git clone https://github.com/KhronosGroup/Vulkan-Tutorial

这会将仓库克隆到当前目录下一个名为 Vulkan-Tutorial 的新文件夹中。各章节的源文件位于 attachments 文件夹内。

依赖安装脚本

为了简化设置过程,我们为 Windows 和 Linux 提供了依赖安装脚本:

Windows

对于 Windows,我们提供了一个使用 vcpkg 安装所有必需依赖的脚本:

  1. 确保你已经安装了 vcpkg。如果没有,请按照 https://github.com/microsoft/vcpkg 上的说明进行操作。

  2. 运行 scripts/install_dependencies_windows.bat 脚本。

  3. 按照说明安装 Vulkan SDK。

虽然我们使用 vcpkg 来支持这个安装脚本,但整个过程在下面有详细说明,并且可以在不使用安装脚本或 vcpkg 的情况下完成。这只是一个方便简化设置过程的工具。

Linux

对于 Linux,我们提供了一个脚本,它可以检测你的包管理器并安装所有必需的依赖:

  1. 运行 scripts/install_dependencies_linux.sh 脚本。

  2. 按照说明安装 Vulkan SDK。

如果你更喜欢手动安装依赖,或者你使用的是 macOS,请遵循下面的平台特定说明。

通用注意事项

Vulkan SDK

开发 Vulkan 应用程序最重要部分就是 SDK。 它包含头文件、标准验证层、调试工具以及 Vulkan 函数的加载器。 加载器在运行时在驱动中查找函数,类似于 OpenGL 的 GLEW(如果你熟悉的话)。

SDK 可以从 LunarG 网站 下载。

继续安装过程,注意 SDK 的安装位置。 我们要做的第一件事是验证你的显卡和驱动程序是否正确支持 Vulkan。 进入 SDK 安装目录,打开 bin 目录,然后运行 vkcube 演示程序。

此目录中还有一个对开发有用的程序。slangc 命令行程序将用于将着色器从人类可读的 Slang 着色语言 编译为字节码。 我们将在 着色器模块 一章中深入介绍它。bin 目录还包含 Vulkan 加载器和验证层的二进制文件,而 lib 目录包含库文件。

最后,还有 include 目录,其中包含 Vulkan 头文件。你可以随意浏览其他文件,但本教程中我们不需要它们。

为了自动设置 VulkanSDK 将使用的环境变量,以简化 CMake 项目配置和其他工具的使用,我们建议在 Linux 上使用 setup-env 脚本。你可以将此脚本添加到终端的自动启动或 IDE 设置中,以确保这些环境变量在你所有的会话中都可用。

如果你收到错误消息,请确保你的驱动程序是最新的,包含 Vulkan 运行时,并且你的显卡受支持。请参阅 引言章节 获取主要厂商驱动的链接。

CMake

尽管跨平台项目存在种种问题,CMake 已成为行业标准。它允许开发者创建一个项目范围的构建描述文件,该文件负责设置和配置创建任何项目所需的所有支持工具。 存在其他具有类似功能的构建系统,如 bazel,但没有一个像 CMake 那样被广泛使用和接受。 完整描述如何使用 CMake 超出了本教程的范围,但可以在 CMake 找到更多详细信息。

Vulkan SDK 支持使用 find_package。要在你的项目中使用它,你可以将 *-config.cmake 的搜索路径添加到 find_package 配置调用的 HINTS 部分:例如

find_package(slang CONFIG HINTS "$ENV{VULKAN_SDK}/lib/cmake")

将来,FindVulkan.cmake 可能会迁移到 *-config.cmake 标准,但在撰写本文时,建议从 VulkanSamples 获取 FindVulkan.cmake,因为 Kitware 提供的版本已被弃用,并且在 macOS 构建中存在错误。你可以在代码目录 FindVulkan.cmake 中找到它。

使用 FindVulkan.cmake 是一个项目特定的文件,你可以获取它并根据需要进行修改,以便在你的构建环境中良好工作,并可以根据你的需求进一步定制。Khronos 在 VulkanSamples 中分发的版本经过良好测试,是一个不错的起点。

要使用它,请像这样将其添加到你的 CMAKE_MODULE_PATH 中:

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/CMake")

这将允许其他通过 Find*.cmake 分发的项目也放在同一个文件夹中。请参阅随附的 CMakeLists.txt 以获取一个工作项目的示例。

Vulkan C++ 头文件还提供了一个 C++ 模块。C++ 模块的一大优势是它们提供了 C++ 的所有好处,而没有编译时间长的开销。要使用它们,必须为你的目标设备编译 .cppm 文件。

Note

Vulkan C++ 头文件中的模块支持仍处于实验阶段,可能无法在所有编译器上工作。除非你想进行实验,否则建议 不要 使用它们。

要在附件模板中启用 Vulkan C++20 模块,请使用以下命令配置 CMake:

cmake -DENABLE_CPP20_MODULE=ON ..

启用后,CMakeLists.txt 包含自动构建模块所需的所有指令。相关片段如下所示:

find_package (Vulkan REQUIRED)

# 设置 Vulkan C++ 模块(在 ENABLE_CPP20_MODULE=ON 时启用)
add_library(VulkanCppModule)
add_library(Vulkan::cppm ALIAS VulkanCppModule)

target_compile_definitions(VulkanCppModule PUBLIC
        VULKAN_HPP_DISPATCH_LOADER_DYNAMIC=1
        VULKAN_HPP_NO_STRUCT_CONSTRUCTORS=1
)

target_include_directories(VulkanCppModule PRIVATE "${Vulkan_INCLUDE_DIR}")

target_link_libraries(VulkanCppModule PUBLIC Vulkan::Vulkan)

set_target_properties(VulkanCppModule PROPERTIES CXX_STANDARD 20)

target_sources(VulkanCppModule
        PUBLIC
        FILE_SET cxx_modules TYPE CXX_MODULES
        BASE_DIRS "${Vulkan_INCLUDE_DIR}"
        FILES "${Vulkan_INCLUDE_DIR}/vulkan/vulkan.cppm"
)

VulkanCppModule 目标只需要定义一次,然后将其添加到你的使用项目的依赖项中,它就会自动构建。你不需要再将 Vulkan::Vulkan 添加到你的项目中。

target_link_libraries (${PROJECT_NAME} Vulkan::cppm)

如果你选择保持禁用模块(默认),你可以继续使用传统的基于头文件的包含(例如 #include <vulkan/vulkan_raii.hpp>)。附件中的示例代码编写为无论哪种方式都可以编译,并且仅在 ENABLE_CPP20_MODULE=ON(定义 USE_CPP20_MODULES)时才会导入模块。

窗口管理

如前所述,Vulkan 本身是一个平台无关的 API,不包括用于创建窗口以显示渲染结果的工具。为了受益于 Vulkan 的跨平台优势,我们将使用 GLFW 库 来创建窗口,它支持 Windows、Linux 和 macOS。还有其他库可用于此目的,例如 SDL,但 GLFW 的优势在于它除了窗口创建之外,还抽象了 Vulkan 中其他一些平台特定的内容。

一个不幸的缺点是 GLFW 在 Android 或 iOS 上无法工作;它是一个仅限桌面的解决方案。SDL 确实提供移动支持;然而,移动窗口支持最好通过直接与操作系统接口来实现,例如在 Android 中使用 JNI。

GLM

与 DirectX 12 不同,Vulkan 不包含线性代数运算库,因此我们必须下载一个。http://glm.g-truc.net/[GLM] 是一个不错的库,专为图形 API 设计,也常用于 OpenGL。

纹理库

Vulkan 本身不支持读取各种纹理资源,如 png、jpeg 或 ktx 文件。然而,由于这是一个大主题,深入探讨各种格式超出了本教程的范围。在本教程中,我们将使用 stb 作为加载纹理的依赖项。我们确实建议研究 ktx,以充分利用专为图形应用程序设计的纹理格式。

模型库

模型格式繁多,并且在很多地方暴露了很多细节。一般来说,对于 Vulkan 和其他图形 API,最重要的是知道顶点信息、纹理坐标,以及可能的漫反射颜色细节。GLTF 是一种高级功能丰富的模型格式,具有易于支持的功能,可在跨平台库中使用。然而,在本教程中,我们将使用 tinyobjloader,因为它非常纯粹简单。我们建议仅将 tinyobjloader 库用于小型不复杂的项目。

Windows

在 Windows 上开发,使用 Visual Studio 最为简便。CLion 在 Windows 上也能很好地工作,Android Studio 也是如此,但 Visual Studio 非常流行且支持良好,因此我们将讨论如何在那里获取依赖。要完全支持 C++20,你需要使用 2019 以上的任何版本。下面概述的步骤是为 VS 2022 编写的。

包管理

对于所有平台,我们建议使用平台管理工具。Windows 原生不依赖包管理,所以这算是一个新概念。然而,Microsoft 引入了一个出色的包管理工具,它可以跨平台工作。VCPkg 还包括设置所有必需的 CMake 设置。我们建议按照 这里 的优秀文档来了解如何在 Windows 项目中使用 CMake。

这种设置允许 Windows 开发者在 Visual Studio 中使用 CMake 原生工作,集成度相当好。 另外,http://jetbrains.com[CLion] 在所有平台上原生支持 CMakeLists.txt 项目,并且其工作/功能与 Android Studio 完全相同。它也是一个免费的 IDE。

GLFW

我们建议使用前面提到的 vcpkg 来安装包,为此,从命令行运行:vcpkg install glfw3

如果你希望不使用 vcpkg 安装,你可以在 官方网站 上找到 GLFW 的最新版本。

在本教程中,我们将使用 64 位二进制文件,但你当然也可以选择以 32 位模式构建。在这种情况下,请确保链接 Vulkan SDK 的 Lib32 目录中的二进制文件,而不是 Lib。下载后,将压缩包解压到方便的位置。我们选择在文档目录下的 Visual Studio 目录中创建一个 Libraries 目录。

glfw directory

GLM

作为一个纯粹的图形 API,Vulkan 不包含线性代数运算库,因此我们必须下载一个。 GLM 也可以用 vcpkg 安装,如下所示:vcpkg install glm

另外,GLM 是一个仅头文件库,因此下载 GLM,它专为图形 API 设计,也常用于 OpenGL。

library directory

tinyobjloader

Tinyobjloader 可以用 vcpkg 安装,如下所示:vcpkg install tinyobjloader

Linux

这些说明面向 Ubuntu、Fedora 和 Arch Linux 用户,但你可以通过将特定于包管理器的命令更改为适合你的命令来跟进。 你应该拥有支持 C++20 的编译器(GCC 7+ 或 Clang 5+)。你还需要 cmake。这些大部分可以通过像 build-essentials 这样的大型包安装。

我们建议使用 CLion 或其他 IDE;然而,与 Linux 中的大多数东西一样,GUI 完全是可选的。

Vulkan tarball

在 Linux 上开发 Vulkan 应用程序所需的最重要部分是 Vulkan 加载器、验证层以及一些用于测试你的机器是否支持 Vulkan 的命令行工具:

LunarG 下载 VulkanSDK tarball。 将解压后的 VulkanSDK 放在一个方便的路径中,并像这样创建一个指向最新版本的符号链接:

pushd vulkansdk
tar -xf vulkansdk-linux-x86_64-1.4.304.1.tar.xz
ln -s 1.4.304.1 default

然后将以下内容添加到你的 ~/.bashrc 文件中,以便 Vulkan 的环境变量在所有地方都启用:

source ~/vulkanSDK/default/setup-env.sh

如果安装成功,你应该已经准备好 Vulkan 部分了。记住运行 vkcube 并确保你看到以下内容在窗口中弹出:

cube demo nowindow

如果你收到错误消息,请确保你的驱动程序是最新的,包含 Vulkan 运行时,并且你的显卡受支持。 请参阅 引言章节 获取主要厂商驱动的链接。

Ninja

Ninja 是一个快速的构建系统,CMake 在所有平台上都支持它。我们建议使用 sudo apt install ninja-build 安装它。

X Window System 和 XFree86-VidModeExtension

这些库可能不在系统上,如果没有,你可以使用以下命令安装它们: * sudo apt install libxxf86vm-devdnf install libXxf86vm-devel: 提供对 XFree86-VidModeExtension 的接口。 * sudo apt install libxi-devdnf install libXi-devel:提供对 XINPUT 扩展的 X Window System 客户端接口。

GLFW

我们将使用以下命令安装 GLFW:

sudo apt install libglfw3-dev

sudo dnf install glfw-devel

sudo pacman -S glfw-wayland # X11 用户使用 glfw-x11

GLM

它是一个仅头文件库,可以从 libglm-devglm-devel 包安装:

sudo apt install libglm-dev

sudo dnf install glm-devel

sudo pacman -S glm

设置 CLion(可选)

你可以从 CLion 获取它。我们建议从 jetbrains 工具箱安装,这样它可以自动保持 CLion 更新。要使用像 CLion 这样的 IDE,我们必须设置环境变量,否则这些变量会在终端执行时由

source ~/vulkanSDK/default/setup-env.sh

来设置。为此,打开 Settings,然后选择 "Build, Execution, Deployment",然后选择 CMake。在该窗口的底部将是环境变量。在那里添加 VULKAN_SDK=<fullPathToVulkanSDK>,Vulkan 将在编译时被找到。请注意,完整路径不仅仅是顶层的 VulkanSDK 文件夹。在终端中运行以下命令以找到确切的路径

echo $VULKAN_SDK

为了方便起见,至少对于运行时,我们建议将层放置在系统范围内。为此,从终端执行以下操作:

sudo cp $VULKAN_SDK/lib/libVkLayer_*.so /usr/local/lib/
sudo mkdir -p /usr/local/share/vulkan/explicit_layer.d
sudo cp $VULKAN_SDK/share/vulkan/explicit_layer.d/VkLayer_*.json /usr/local/share/vulkan/explicit_layer.d

或者,你可以将 VK_LAYER_PATH 添加到你的系统环境变量中,并将其指向 $VULKAN_SDK/share/vulkan/explicit_layer.d。此外,你可能还想将 $VULKAN_SDK/lib 路径添加到 LD_LIBRARY_CONFIG 中。所有这些都由 setup-env.sh 文件在使用终端时为你完成。

设置 CMake 项目

现在你已经安装了所有依赖,我们可以为 Vulkan 设置一个基本的 CMake 项目,并编写一点代码来确保一切正常。

我们将假设你已经有一些 CMake 的基本经验,比如变量和规则如何工作。如果没有,你可以通过 本教程 快速上手。

你现在可以使用本教程中的 attachments 目录作为你的 Vulkan 项目的模板。复制一份,将其重命名为类似 HelloTriangle 的名称,并删除 main.cpp 中的所有代码。

你现在已经为 真正的冒险 做好了所有准备。

macOS

这些说明假设你使用 Xcode 和 Homebrew 包管理器。 另外,请记住你至少需要 macOS 版本 10.11,并且你的设备需要支持 Metal API

Vulkan SDK

适用于 macOS 的 SDK 版本在内部使用 MoltenVK。 macOS 上没有对 Vulkan 的原生支持,因此 MoltenVK 实际上充当一个层,将 Vulkan API 调用转换为 Apple 的 Metal 图形框架。 这样,你就可以利用 Apple Metal 框架的调试和性能优势。

下载适用于 macOS 的安装程序后,双击安装程序并按照提示操作。在“Installation Folder”步骤中记下安装位置。在 Xcode 中创建项目时,你将需要引用它。

sdk install mac

注意:在本教程中,vulkansdk 将指代你安装 VulkanSDK 的路径。

vulkansdk/Applications 文件夹中,你应该有一些可执行文件,它们将使用 SDK 运行一些演示。 运行 vkcube 可执行文件,你将看到以下内容:

cube demo mac

GLFW

要在 MacOS 上安装 GLFW,我们将使用 Homebrew 包管理器来获取 glfw 包:

brew install glfw

GLM

它是一个仅头文件库,可以从 glm 包安装:

brew install glm

设置 Xcode

现在所有依赖都已安装,我们可以为 Vulkan 设置一个基本的 Xcode 项目。 这里的大部分指令本质上都是一些“管道”工作,以便将所有依赖链接到项目。 另外,请记住,在以下说明中,每当我们提到 vulkansdk 文件夹时,我们指的是你解压 Vulkan SDK 的文件夹。

我们建议在所有地方都使用 CMake,Apple 也不例外。关于如何为 Apple 使用 CMake 的示例可以在 这里 找到。我们还在 VulkanSamples 项目中提供了在 Apple 环境中使用 cmake 项目的文档。它同时面向 iOS 和桌面 Apple。

一旦你使用带有 XCode 生成器的 CMake,打开生成的 xcode 项目。如果你使用本教程的代码目录,你可以从命令行执行此操作:

cd code
cmake -G XCode

你需要设置的最后一件事是一些环境变量。 在 Xcode 工具栏上,转到 Product > Scheme > Edit Scheme...,然后在 Arguments 选项卡中添加以下两个环境变量:

  • VK_ICD_FILENAMES = vulkansdk/macOS/share/vulkan/icd.d/MoltenVK_icd.json

  • VK_LAYER_PATH = vulkansdk/macOS/share/vulkan/explicit_layer.d

取消选中 'shared'。它应该看起来像这样:

xcode variables

最后,你应该一切就绪!

你现在已经为 真正的学习 做好了所有准备。

Android

Vulkan 在 Android 上是一流的 API,并且得到广泛支持。但它在几个关键领域(从窗口管理到构建系统)的使用方式有所不同。因此,虽然基本章节侧重于桌面平台,但本教程还有 专门的一章,指导你设置开发环境并在 Android 上运行教程代码。

设置 CMake 项目

现在你已经安装了所有依赖,我们可以为 Vulkan 设置一个基本的 CMake 项目,并编写一点代码来确保一切正常。

我们将假设你已经有一些 CMake 的基本经验,比如变量和规则如何工作。如果没有,你可以通过 本教程 快速上手。

attachment\template 文件夹包含一个 CMake 模板,你可以使用它在 build 文件夹中为你选择的 IDE 创建项目文件。将其作为起点,跟随教程进行操作:

cd attachments\template
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=[path\to\vcpkg]\scripts\buildsystems\vcpkg.cmake

或者,你也可以在 attachments 文件夹中执行相同的操作,这将创建一个包含教程所有章节的项目:

cd attachments
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=[path\to\vcpkg]\scripts\buildsystems\vcpkg.cmake

恭喜,你已经为 玩转 Vulkan 做好了所有准备!

Vulkan 是 Khronos Group Inc. 的注册商标

教程内容版权归原作者,遵循 CC BY-SA 4.0;本站独立代码及设计除外。