在本章中,我们将设置开发 Vulkan 应用程序的环境并安装一些有用的库。我们将使用的所有工具(编译器除外)都与 Windows、Linux 和 MacOS 兼容,但安装它们的步骤略有不同,这就是为什么这里分别描述它们的原因。
Windows
如果您正在为 Windows 进行开发,那么我假设您使用 Visual Studio 编译代码。要获得完整的 C++17 支持,您需要使用 Visual Studio 2017 或 2019。下面概述的步骤是针对 VS 2017 编写的。
Vulkan SDK
开发 Vulkan 应用程序所需的最重要的组件是 SDK。它包括标头、标准验证层、调试工具和 Vulkan 函数的加载器。加载器在运行时查找驱动程序中的函数,类似于 OpenGL 的 GLEW - 如果您对此很熟悉的话。
可以使用页面底部的按钮从LunarG 网站 下载 SDK 。您无需创建帐户,但您可以访问一些可能对您有用的其他文档。

继续安装并注意 SDK 的安装位置。我们要做的第一件事是验证您的显卡和驱动程序是否正确支持 Vulkan。转到安装 SDK 的目录,打开该 Bin 目录并运行 vkcube.exe 演示。您应该看到以下内容:

如果您收到错误消息,请确保您的驱动程序是最新的,包括 Vulkan 运行时,并且您的显卡受支持。请参阅 简介章节 以获取主要供应商的驱动程序链接。
此目录中还有另一个对开发有用的程序。glslangValidator.exe 和 glslc.exe 程序将用于将着色器从人类可读的 GLSL编译为字节码。我们将在着色器模块 章节中深入介绍这一点 。该 Bin 目录还包含 Vulkan 加载器和验证层的二进制文件,而 Lib 目录包含库。
最后,有一个 Include 包含 Vulkan 标头的目录。您可以随意浏览其他文件,但本教程不需要它们。
GLFW
如前所述,Vulkan 本身是一个与平台无关的 API,不包含用于创建窗口以显示渲染结果的工具。为了利用 Vulkan 的跨平台优势并避免 Win32 的麻烦,我们将使用 GLFW 库 来创建一个支持 Windows、Linux 和 MacOS 的窗口。还有其他可用于此目的的库,例如 SDL,但 GLFW 的优势在于,除了窗口创建之外,它还抽象出了 Vulkan 中其他一些特定于平台的内容。
您可以在官方网站 上找到 GLFW 的最新版本。在本教程中,我们将使用 64 位二进制文件,但您当然也可以选择以 32 位模式构建。在这种情况下,请确保链接到 Lib32 目录中的 Vulkan SDK 二进制文件,而不是。下载后,将存档解压到方便的位置。我选择在 Visual Studio 目录中的文档下 Lib 创建一个目录。Libraries

广义线性模型
与 DirectX 12 不同, Vulkan 不包含线性代数运算库,因此我们必须下载一个。GLM 是一个不错的库,专为图形 API 而设计,也常用于 OpenGL。
GLM 是一个仅包含头文件的库,因此只需下载 最新版本 并将其存储在方便的位置即可。您现在应该有一个类似于以下内容的目录结构:

设置 Visual Studio
现在您已经安装了所有依赖项,我们可以为 Vulkan 设置一个基本的 Visual Studio 项目并编写一些代码以确保一切正常。
启动 Visual Studio 并 Windows Desktop Wizard 输入名称并按 创建一个新项目 OK。

确保 Console Application (.exe) 选择该应用程序类型,以便我们有地方打印调试消息,并检查 Empty Project 以防止 Visual Studio 添加样板代码。

按 OK 创建项目并添加 C++ 源文件。您应该已经知道如何执行此操作,但此处包含这些步骤以确保完整性。


现在将以下代码添加到文件中。现在不必担心理解它;我们只是确保您可以编译和运行 Vulkan 应用程序。我们将在下一章从头开始。
#define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h>
#define GLM_FORCE_RADIANS
#define GLM_FORCE_DEPTH_ZERO_TO_ONE
#include <glm/vec4.hpp>
#include <glm/mat4x4.hpp>
#include <iostream>
int main() {
glfwInit();
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
GLFWwindow* window = glfwCreateWindow(800, 600, "Vulkan window", nullptr, nullptr);
uint32_t extensionCount = 0;
vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr);
std::cout << extensionCount << " extensions supported\n";
glm::mat4 matrix;
glm::vec4 vec;
auto test = matrix * vec;
while(!glfwWindowShouldClose(window)) {
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
return 0;
}现在让我们配置项目以消除错误。打开项目属性对话框并确保已 All Configurations 选择,因为大多数设置都适用于 Debug 和 Release 模式。


转到 C++ -> General -> Additional Include Directories 并按 <Edit...> 下拉框。

添加 Vulkan、GLFW 和 GLM 的标头目录:

接下来,打开以下库目录的编辑器 Linker -> General:

并添加 Vulkan 和 GLFW 的目标文件位置:

转到 Linker -> Input 并按下拉 <Edit...> 框 Additional Dependencies 。

输入 Vulkan 和 GLFW 对象文件的名称:

最后更改编译器以支持 C++17 特性:

现在您可以关闭项目属性对话框。如果您做对了所有事情,那么您将不会再看到代码中突出显示任何错误。
最后,确保您实际上是在 64 位模式下进行编译:

按下 F5 编译并运行项目,您将看到一个命令提示符和一个弹出窗口,如下所示:

扩展的数量应为非零。恭喜,您已准备好 使用 Vulkan 了!
Linux
这些说明将针对 Ubuntu、Fedora 和 Arch Linux 用户,但您可以通过将特定于包管理器的命令更改为适合您的命令来遵循这些说明。您应该有一个支持 C++17 的编译器(GCC 7+ 或 Clang 5+)。您还需要 make。
Vulkan 软件包
在 Linux 上开发 Vulkan 应用程序所需的最重要的组件是 Vulkan 加载器、验证层和一些命令行实用程序,用于测试您的机器是否支持 Vulkan:
sudo apt install vulkan-tools或sudo dnf install vulkan-tools:命令行实用程序,最重要的是vulkaninfo和vkcube。运行这些以确认您的机器支持 Vulkan。sudo apt install libvulkan-dev或sudo dnf install vulkan-loader-devel:安装 Vulkan 加载器。加载器在运行时查找驱动程序中的函数,类似于 OpenGL 的 GLEW - 如果您对此很熟悉的话。sudo apt install vulkan-validationlayers-dev spirv-tools或sudo dnf install mesa-vulkan-devel vulkan-validation-layers-devel:安装标准验证层和所需的 SPIR-V 工具。这些在调试 Vulkan 应用程序时至关重要,我们将在下一章中讨论它们。
在 Arch Linux 上,您可以运行 sudo pacman -S vulkan-devel 来安装上述所有必需的工具。
如果安装成功,您应该已经准备好 Vulkan 部分。记得运行 vkcube 并确保在窗口中看到以下内容:

如果您收到错误消息,请确保您的驱动程序是最新的,包括 Vulkan 运行时,并且您的显卡受支持。请参阅 简介章节 以获取主要供应商的驱动程序链接。
格鲁吉亚
如前所述,Vulkan 本身是一个与平台无关的 API,不包含用于创建窗口以显示渲染结果的工具。为了利用 Vulkan 的跨平台优势并避免 X11 的麻烦,我们将使用 GLFW 库 来创建一个支持 Windows、Linux 和 MacOS 的窗口。还有其他可用于此目的的库,例如 SDL,但 GLFW 的优势在于,除了窗口创建之外,它还抽象出了 Vulkan 中其他一些特定于平台的内容。
我们将使用以下命令安装 GLFW:
sudo apt install libglfw3-dev或者
sudo dnf install glfw-devel或者
sudo pacman -S glfw-wayland # glfw-x11 for X11 users广义线性模型
与 DirectX 12 不同, Vulkan 不包含线性代数运算库,因此我们必须下载一个。GLM 是一个不错的库,专为图形 API 而设计,也常用于 OpenGL。
libglm-dev 它是一个仅有头文件的库,可以从或 包中安装 glm-devel:
sudo apt install libglm-dev或者
sudo dnf install glm-devel或者
sudo pacman -S glm着色器编译器
我们已经拥有了所需的一切,除了我们还需要程序将着色器从人类可读的 GLSL 编译为字节码。
两种流行的着色器编译器是 Khronos GroupglslangValidator 和 Google 的 glslc。后者具有熟悉的 GCC 和 Clang 式用法,因此我们将使用它:在 Ubuntu 上,下载 Google 的 非官方二进制文件 并复制 glslc 到您的 /usr/local/bin。请注意,您可能需要 sudo 根据您的权限。在 Fedora 上使用 sudo dnf install glslc,而在 Arch Linux 上运行 sudo pacman -S shaderc。要测试,运行 glslc 它应该会正确地抱怨我们没有传递任何着色器进行编译:
glslc: error: no input files
我们将在 着色器模块glslc 章节中进行深入介绍。
设置 makefile 项目
现在您已经安装了所有依赖项,我们可以为 Vulkan 设置一个基本的 makefile 项目并编写一些代码以确保一切正常。
在方便的位置创建一个新目录,名称类似 VulkanTest。创建一个名为 的源文件 main.cpp 并插入以下代码。现在不用担心尝试理解它;我们只是确保您可以编译和运行 Vulkan 应用程序。我们将在下一章从头开始。
#define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h>
#define GLM_FORCE_RADIANS
#define GLM_FORCE_DEPTH_ZERO_TO_ONE
#include <glm/vec4.hpp>
#include <glm/mat4x4.hpp>
#include <iostream>
int main() {
glfwInit();
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
GLFWwindow* window = glfwCreateWindow(800, 600, "Vulkan window", nullptr, nullptr);
uint32_t extensionCount = 0;
vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr);
std::cout << extensionCount << " extensions supported\n";
glm::mat4 matrix;
glm::vec4 vec;
auto test = matrix * vec;
while(!glfwWindowShouldClose(window)) {
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
return 0;
}接下来,我们将编写一个 makefile 来编译和运行这个基本的 Vulkan 代码。创建一个名为 的新空文件。我假设您已经对 makefile 有一些基本了解,例如变量和规则的工作原理。如果没有,您可以通过 本教程Makefile 快速掌握。
我们首先定义几个变量来简化文件的其余部分。定义一个 CFLAGS 变量来指定基本的编译器标志:
CFLAGS = -std=c++17 -O2我们将使用现代 C++ ( -std=c++17),并将优化级别设置为 O2。我们可以删除 -O2 以更快地编译程序,但我们应记住将其放回发布版本中。
类似地,在变量中定义链接器标志 LDFLAGS:
LDFLAGS = -lglfw -lvulkan -ldl -lpthread -lX11 -lXxf86vm -lXrandr -lXi该标志 -lglfw 用于 GLFW,-lvulkan 与 Vulkan 函数加载器链接,其余标志是 GLFW 所需的低级系统库。其余标志是 GLFW 本身的依赖项:线程和窗口管理。
您的系统上可能尚未安装 Xxf68vm 和库。您可以在以下软件包中找到它们:Xi
sudo apt install libxxf86vm-dev libxi-dev或者
sudo dnf install libXi-devel libXxf86vm-devel或者
sudo pacman -S libxi libxxf86vm现在指定要编译的规则 VulkanTest 很简单。确保使用制表符而不是空格来缩进。
VulkanTest: main.cpp
g++ $(CFLAGS) -o VulkanTest main.cpp $(LDFLAGS)通过保存 makefile 并 make 在目录中运行 main.cpp 和来验证此规则是否有效 Makefile。这应该会生成一个 VulkanTest 可执行文件。
我们现在将定义另外两个规则 test 和 clean,前者将运行可执行文件,后者将删除已构建的可执行文件:
.PHONY: test clean
test: VulkanTest
./VulkanTest
clean:
rm -f VulkanTest运行 make test 应显示程序成功运行,并显示 Vulkan 扩展的数量。0 当您关闭空窗口时,应用程序应退出并显示成功返回代码 ( )。您现在应该有一个完整的 makefile,类似于以下内容:
CFLAGS = -std=c++17 -O2
LDFLAGS = -lglfw -lvulkan -ldl -lpthread -lX11 -lXxf86vm -lXrandr -lXi
VulkanTest: main.cpp
g++ $(CFLAGS) -o VulkanTest main.cpp $(LDFLAGS)
.PHONY: test clean
test: VulkanTest
./VulkanTest
clean:
rm -f VulkanTest您现在可以将此目录用作 Vulkan 项目的模板。复制一份,将其重命名为类似名称 HelloTriangle,然后删除 中的所有代码 main.cpp。
现在您已经准备好开始 真正的冒险了。
苹果系统
这些说明假设您正在使用 Xcode 和 Homebrew 包管理器。另外,请记住,您至少需要 MacOS 版本 10.11,并且您的设备需要支持 Metal API。
Vulkan SDK
开发 Vulkan 应用程序所需的最重要的组件是 SDK。它包括标头、标准验证层、调试工具和 Vulkan 函数的加载器。加载器在运行时查找驱动程序中的函数,类似于 OpenGL 的 GLEW - 如果您对此很熟悉的话。
可以使用页面底部的按钮从LunarG 网站 下载 SDK 。您无需创建帐户,但您可以访问一些可能对您有用的其他文档。

MacOS 版 SDK 内部使用 MoltenVK。MacOS 上没有对 Vulkan 的原生支持,因此 MoltenVK 的作用实际上是将 Vulkan API 调用转换为 Apple 的 Metal 图形框架。借助它,您可以利用 Apple Metal 框架的调试和性能优势。
下载后,只需将内容解压到您选择的文件夹中(请记住,在 Xcode 上创建项目时,您需要引用它)。在解压的文件夹中,Applications 您应该有一些可执行文件,这些文件将使用 SDK 运行一些演示。运行 vkcube 可执行文件,您将看到以下内容:

格鲁吉亚
如前所述,Vulkan 本身是一个与平台无关的 API,不包含用于创建窗口以显示渲染结果的工具。我们将使用 GLFW 库 来创建一个窗口,它支持 Windows、Linux 和 MacOS。还有其他可用于此目的的库,如 SDL,但 GLFW 的优势在于,除了窗口创建之外,它还抽象出了 Vulkan 中的一些其他特定于平台的内容。
要在 MacOS 上安装 GLFW,我们将使用 Homebrew 包管理器来获取 glfw 包:
brew install glfw广义线性模型
Vulkan 不包含线性代数运算库,因此我们必须下载一个。GLM 是一个不错的 库,专为图形 API 而设计,也常用于 OpenGL。
它是一个仅有头文件的库,可以从包中安装 glm:
brew install glm设置 Xcode
现在所有依赖项都已安装完毕,我们可以为 Vulkan 设置一个基本的 Xcode 项目。此处的大多数说明本质上都是大量“管道”,以便我们可以获取链接到项目的所有依赖项。此外,请记住,在以下说明中,每当我们提到文件夹时,vulkansdk 我们指的是您提取 Vulkan SDK 的文件夹。
启动 Xcode 并创建一个新的 Xcode 项目。在打开的窗口中选择应用程序 > 命令行工具。

选择 Next,为项目写一个名称并 Language 选择 C++。

按下 Next,项目应该已经创建。现在,让我们将生成的 main.cpp 文件中的代码更改为以下代码:
#define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h>
#define GLM_FORCE_RADIANS
#define GLM_FORCE_DEPTH_ZERO_TO_ONE
#include <glm/vec4.hpp>
#include <glm/mat4x4.hpp>
#include <iostream>
int main() {
glfwInit();
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
GLFWwindow* window = glfwCreateWindow(800, 600, "Vulkan window", nullptr, nullptr);
uint32_t extensionCount = 0;
vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr);
std::cout << extensionCount << " extensions supported\n";
glm::mat4 matrix;
glm::vec4 vec;
auto test = matrix * vec;
while(!glfwWindowShouldClose(window)) {
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
return 0;
}请记住,您不需要了解所有这些代码的作用,我们只是设置一些 API 调用以确保一切正常。
Xcode 应该已经显示了一些错误,例如无法找到库。我们现在将开始配置项目以消除这些错误。在 Project Navigator 面板上选择您的项目。打开 Build Settings 选项卡,然后:
- 找到Header Search Paths字段并添加一个链接
/usr/local/include(这是 Homebrew 安装标头的地方,因此 glm 和 glfw3 标头文件应该在那里)和一个vulkansdk/macOS/includeVulkan 标头的链接。 - 找到Library Search Paths字段并添加一个链接
/usr/local/lib(再次强调,这是 Homebrew 安装库的地方,所以 glm 和 glfw3 lib 文件应该在那里)和一个链接vulkansdk/macOS/lib。
它看起来应该像这样(显然,路径会根据您放置文件的位置而有所不同):

现在,在 Build Phases 选项卡的Link Binary With Libraries上,我们将添加 glfw3 和 vulkan 框架。为了方便起见,我们将在项目中添加动态库(如果您想使用静态框架,可以查看这些库的文档)。
- 对于 glfw,打开文件夹
/usr/local/lib,您将在其中找到一个文件名,如libglfw.3.x.dylib(“x”是库的版本号,根据您从 Homebrew 下载软件包的时间,它可能有所不同)。只需将该文件拖到 Xcode 上的“链接框架和库”选项卡即可。 - 对于 vulkan,请转到。对两个文件和
vulkansdk/macOS/lib执行相同操作(其中“x”将是您下载的 SDK 的版本号)。libvulkan.1.dylib``libvulkan.1.x.xx.dylib
添加这些库后,在复制文件的同一选项卡中更改 Destination 为“框架”,清除子路径并取消选择“仅在安装时复制”。单击“+”号并在此处添加所有这三个框架。
你的 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
它看起来应该是这样的:

最后,一切就绪!现在,如果您运行项目(记得根据您选择的配置将构建配置设置为 Debug 或 Release),您应该会看到以下内容:

扩展的数量不应为零。其他日志来自库,您可能会根据配置从这些日志中收到不同的消息。
现在您已经做好了一切准备,可以开始 真正的行动了。