开发环境
在本章中,我们将为开发 Vulkan 应用程序设置环境,并安装一些有用的库。除了编译器之外,我们将使用的所有工具都与 Windows、Linux 和 macOS 兼容,但安装步骤略有不同,这就是为什么在这里分别描述它们的原因。
依赖项安装脚本
为了使设置过程更加简单,我们提供了适用于 Windows 和 Linux 的依赖项安装脚本:
Windows
对于 Windows,我们提供了一个使用 vcpkg 安装所有必需依赖项的脚本:
-
确保已安装 vcpkg。如果没有,请按照 https://github.com/microsoft/vcpkg 上的说明进行操作
-
运行
scripts/install_dependencies_windows.bat脚本 -
按照说明安装 Vulkan SDK
虽然我们使用 vcpkg 来启用此安装脚本;但下面详细概述了整个过程,可以在不使用安装脚本或不需要 vcpkg 的情况下完成。这只是为了使设置过程更加简单的便利措施。
通用注意事项
Vulkan SDK
开发 Vulkan 应用程序最重要的部分是 SDK。它包括头文件、标准验证层、调试工具和 Vulkan 函数的加载器。加载器在运行时在驱动程序中查找函数,类似于 OpenGL 的 GLEW——如果您熟悉的话。
SDK 可以从 LunarG 网站 使用页面底部的按钮下载。您不必创建账户,但它将为您提供一些可能对您有用的额外文档的访问权限。
继续安装过程,并注意 SDK 的安装位置。我们要做的第一件事是验证您的显卡和驱动程序是否正确支持 Vulkan。转到您安装 SDK 的目录,打开 bin 目录并运行 vkcube 演示。
此目录中还有另一个对开发有用的程序。glslangValidator 和 glslc 程序将用于将着色器从人类可读的 GLSL 编译为字节码。我们将在 着色器模块 章节中深入介绍这一点。bin 目录还包含 Vulkan 加载器和验证层的二进制文件,而 lib 目录包含库。
最后,还有包含 Vulkan 头文件的 include 目录。随意探索其他文件,但我们在本教程中不需要它们。
为了自动设置 VulkanSDK 将使用的环境变量,以便在 CMake 项目配置和各种其他工具中更轻松地工作,我们建议使用 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++20 中可用。C++ 模块的一个很大优势是它们提供了 C++ 的所有好处,而没有长编译时间的开销。为此,必须为您的目标设备编译 .cppm 文件。本教程作为利用 C++ 模块的示例。我们教程中的 CMakeLists.txt 包含了自动构建模块所需的所有指令:
find_package (Vulkan REQUIRED)
# set up Vulkan C++ module
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)
这就是将 Vulkan 添加到任何项目所需的全部内容。
窗口管理
如前所述,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。
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 位模式构建。在这种情况下,请确保链接到 Lib32 目录而不是 Lib 中的 Vulkan SDK 二进制文件。下载后,将存档提取到一个方便的位置。我选择在 Visual Studio 目录下的文档中创建一个 Libraries 目录。
GLM
作为纯图形 API,Vulkan 不包括用于线性代数运算的库,所以我们必须下载一个。GLM 也可以用 vcpkg 安装,如下所示:vcpkg install glm
或者,GLM 是一个仅头文件的库,所以下载 GLM,它专为与图形 API 一起使用而设计,也常用于 OpenGL。
设置 Visual Studio
设置 CMake 项目
现在您已经安装了所有依赖项,我们可以为 Vulkan 设置一个基本的 CMake 项目,并编写一些代码来确保一切正常工作。
我假设您已经有一些 CMake 的基本经验,比如变量和规则如何工作。如果没有,您可以通过 这个教程 很快上手。
您现在可以使用本教程中的 attachments 目录作为 Vulkan 项目的模板。复制一份,重命名为类似 HelloTriangle 的名称,并删除 main.cpp 中的所有代码。
恭喜,您已经准备好 玩转 Vulkan 了!
Linux
这些说明将针对 Ubuntu、Fedora 和 Arch Linux 用户,但您可能可以通过将特定于包管理器的命令更改为适合您的命令来跟随。您应该有一个支持 C++20 的编译器(GCC 7+ 或 Clang 5+)。您还需要 cmake。大部分内容可以通过更大的包(如 build-essentials)安装。
我们建议使用 CLion 或其他 IDE;然而,与 Linux 中的大多数事情一样,GUI 是完全可选的。
Vulkan 压缩包
在 Linux 上开发 Vulkan 应用程序最重要的部分是 Vulkan 加载器、验证层和一些命令行实用程序,用于测试您的机器是否支持 Vulkan:
从 LunarG 下载 VulkanSDK 压缩包。将解压后的 VulkanSDK 放在一个方便的路径中,并创建一个指向最新版本的符号链接,如下所示:
pushd vulkansdk
tar -xzf vulkansdk-linux-x86_64-1.4.304.1.tgz
ln -s 1.4.304.1 default
然后将以下内容添加到您的 ~/.bashrc 文件中,以便 Vulkan 的环境变量在任何地方都启用:
source ~/vulkanSDK/default/setup-env.sh
如果安装成功,您应该已经设置好了 Vulkan 部分。记得运行 vkcube 并确保您在窗口中看到以下内容:
如果您收到错误消息,请确保您的驱动程序是最新的,包括 Vulkan 运行时,并且您的显卡受支持。有关主要供应商的驱动程序链接,请参阅 介绍章节。
X Window System 和 XFree86-VidModeExtension
系统上可能没有这些库,如果没有,您可以使用以下命令安装它们:
* sudo apt install libxxf86vm-dev 或 dnf install libXxf86vm-devel:提供 XFree86-VidModeExtension 的接口。
* sudo apt install libxi-dev 或 dnf install libXi-devel:提供 X Window System 客户端接口到 XINPUT 扩展。
GLFW
我们将使用以下命令安装 GLFW:
sudo apt install libglfw3-dev
或
sudo dnf install glfw-devel
或
sudo pacman -S glfw-wayland # glfw-x11 for X11 users
GLM
它是一个仅头文件的库,可以从 libglm-dev 或 glm-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
为此,打开设置,然后选择"Build, Execution, Deployment",然后选择 CMake。在该窗口底部将是环境变量,只需在那里添加 VULKAN_SDK=<fullPathToVulkanSDK>,Vulkan 将在编译时被找到。为了方便起见,至少对于运行时,我们建议将层放置在系统范围内。要做到这一点,从终端执行以下操作:
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 中。
Vulkan 是 Android 上的一流 API,并得到广泛支持。但使用它在几个关键领域有所不同,从窗口管理到构建系统。因此,虽然基本章节专注于桌面平台,但教程还有一个 专门的章节,引导您设置开发环境并在 Android 上运行教程代码。