目录
在本章中,我们将设置开发Vulkan应用程序的环境,并安装一些有用的库。除了编译器之外,我们将使用的所有工具都与Windows、Linux和MacOS兼容,但安装它们的步骤略有不同,这就是为什么这里单独描述它们的原因。
Windows
如果您正在为Windows开发,那么我将假设您正在使用Visual Studio编译代码。要获得完整的C++17支持,您需要使用Visual Studio 2017或2019。以下概述的步骤是为VS 2017编写的。
Vulkan SDK
开发Vulkan应用程序最重要的组件是SDK。它包括标头、标准验证层、调试工具和Vulkan函数的加载器。加载器在运行时查找驱动程序中的函数,类似于GLEW for OpenGL-如果您熟悉的话。
可以使用页面底部的按钮从LunarG网站下载SDK。您不必创建帐户,但它可以让您访问一些可能对您有用的其他文档。
继续安装并注意SDK的安装位置。我们要做的第一件事是验证您的图形卡和驱动程序是否正确支持Vulkan。转到安装SDK的目录,打开Bin目录并运行vkcube.exe演示。您应该看到以下内容:
如果您收到错误消息,请确保您的驱动程序是最新的,包括Vulkan运行时,并且您的图形卡受支持。有关主要供应商的驱动程序链接,请参阅介绍章节。
此目录中有另一个对开发有用的程序。glslangValidator.exe和glslc.exe程序将用于将着色器从人类可读的GLSL编译为字节码。我们将在着色器模块一章中详细介绍这一点。Bin目录还包含Vulkan加载器和验证层的二进制文件,而Lib目录包含库。
最后,还有包含Vulkan标头的Include目录。请随意探索其他文件,但本教程不需要它们。
GLFW
如前所述,Vulkan本身是一个平台无关的API,不包括用于创建窗口以显示渲染结果的工具。为了利用Vulkan的跨平台优势并避免Win32的恐怖,我们将使用GLFW库创建一个支持Windows、Linux和MacOS的窗口。还有其他库可用于此目的,如SDL,但GLFW的优点是它还抽象了Vulkan中除窗口创建之外的一些其他特定于平台的内容。
您可以在官方网站上找到GLFW的最新版本。在本教程中,我们将使用64位二进制文件,但您当然也可以选择以32位模式构建。在这种情况下,请确保链接到Lib32目录中的Vulkan SDK二进制文件,而不是Lib。下载后,将存档文件解压缩到方便的位置。我选择在VisualStudio目录的文档下创建一个Libraries目录。
GLM
与DirectX 12不同,Vulkan不包含用于线性代数运算的库,因此我们必须下载一个。GLM是一个很好的库,设计用于图形API,也常用于OpenGL。
GLM是一个只有头的库,所以只需下载最新版本并将其存储在方便的位置。您现在应该有一个类似于以下内容的目录结构:
Setting up Visual Studio
现在您已经安装了所有依赖项,我们可以为Vulkan设置一个基本的Visual Studio项目,并编写一些代码以确保一切正常。
启动Visual Studio并通过输入名称并按“确定”来创建新的Windows桌面向导项目。
确保选择Console应用程序(.exe)作为应用程序类型,以便我们有地方打印调试消息,并选中空项目以防止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;
}
现在让我们配置项目以消除错误。打开项目“财对话框,确保选中“所有配置”,因为大多数设置都适用于调试和发布模式。
转到C++->常规->其他包含目录,然后按<Edit…>在下拉框中。
添加Vulkan、GLFW和GLM的头目录:
接下来,在Linker->General下打开库目录编辑器:
输入Vulkan和GLFW对象文件的名称:
最后更改编译器以支持C++17功能:
现在可以关闭项目对话框。如果你做的一切都是正确的,那么你就不会在代码中看到更多的错误。
最后,确保您实际上是在64位模式下编译:
按F5键编译并运行项目,您将看到命令提示符和弹出的窗口,如下所示:
扩展名的数量应为非零。恭喜你,你已经准备好和Vulkan一起玩了!
Linux
这些说明将针对Ubuntu、Fedora和Arch Linux用户,但您可以通过将包管理器特定的命令更改为适合您的命令来遵循这些说明。您应该有一个支持C++17(GCC 7+或Clang 5+)的编译器。你也需要make。
Vulkan Packages
在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加载器。加载器在运行时查找驱动程序中的函数,类似于GLEW for OpenGL-如果您熟悉的话。
- 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运行时,并且您的图形卡受支持。有关主要供应商的驱动程序链接,请参阅介绍章节。
GLFW
如前所述,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
GLM
与DirectX 12不同,Vulkan不包含用于线性代数运算的库,因此我们必须下载一个。GLM是一个很好的库,设计用于图形API,也常用于OpenGL。
它是一个仅头部的库,可以从libglm-dev或glm-devel包安装:
sudo apt install libglm-dev
或者
sudo dnf install glm-devel
或者
sudo pacman -S glm
Shader Compiler
除了我们需要一个程序将着色器从人类可读的GLSL编译为字节码之外,我们几乎拥有了所有需要的东西。
两个流行的着色器编译器是Khronos Group的glslangValidator和Google的glslc。后者有一个熟悉的GCC和类似Clang的用法,所以我们将继续:在Ubuntu上,下载谷歌的非官方二进制文件,并将glslc复制到您的/usr/local/bin。注意,根据您的权限,您可能需要sudo。在Fedora上使用sudo dnf install glslc,而在Arch Linux上运行sudo pacman-S shaderc。要进行测试,请运行glslc,它应该会理所当然地抱怨我们没有传递任何着色器来编译:glslc: error: no input files。
我们将在着色器模块一章中深入介绍glslc。
Setting up a makefile project
现在您已经安装了所有依赖项,我们可以为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并使用main.cpp和makefile在目录中运行make,验证此规则是否有效。这将导致VulkanTest可执行文件。
现在我们将定义另外两个规则,test和clean,前者将运行可执行文件,后者将删除已构建的可执行文件:
.PHONY: test clean
test: VulkanTest
./VulkanTest
clean:
rm -f VulkanTest
运行make测试应显示程序成功运行,并显示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中的所有代码。
你现在已经准备好了真正的冒险。