环境配置

首先在 vulkan.lunarg.com 官网下载 Vulkan SDK。我自己的环境是 Windows,所以下载此时最新的 vulkansdk-windows-X64-1.4.328.1.exe 进行安装。

因为涉及系统窗口显示,此处使用 GLFW 库,它是跨平台的窗口管理库。可以在 glfw.org 官网下载。因为在 Windows 系统下使用,所以可以直接下载预编译的库。

我们再准备一下 GLM 库,它是专为图形编程设计的数学库。它是 header only 库,所以使用很方便。我们可以直接克隆 https://github.com/g-truc/glm 仓库进行使用。

接着,我们创建一个新的 Visual Studio 工程。然后在同级创建一个 externals 目录,把上述提及的三方库放入其中。

  • ├─externals
  • │  ├─glfw-3.4.bin.WIN64
  • │  └─glm
  • └─VulkanCourseApp

接着,我们设置工程的头文件目录和库文件目录。

右击功能,选择 属性。然后如图 1 所示,在 C/C++ - 常规 - 附加包含目录 选项里设置头文件目录。此处,GLFW 和 GLM 所在的头文件目录使用相对路径,Vulkan 头文件所在的目录使用绝对路径。

图1 头文件目录

库文件目录设置如图 2 所示,需要在 链接器 - 常规 - 附加库目录 里设置。此处指定了 GLFW 和 Vulkan 库所在的目录。GLM 库没有库文件,它是 header only 的。

图2 库文件目录

然后如图 3 所示,我们在 链接器 - 输入 - 附加依赖性 里指定具体需要链接的库。此处我们使用到 vulkan-1.libglfw3.lib

图3 库

头文件和库设置完成之后,我们就可以编写测试代码了。如代码清单 1 所示,我们对 GLFW、GLM 和 Vulkan 进行测试。

运行程序,如果显示了窗口,就代表 GLFW 配置正确了。extensionCount 变量非零,就代表 Vulkan 配置正确了。矩阵和向量计算正确,就代表 GLM 配置正确了。

代码清单 1 测试代码
  1. #define GLFW_INCLUDE_VULKAN
  2. #include <GLFW/glfw3.h>
  3. //#include <vulkan/vulkan.h>
  4.  
  5. #define GLM_FORCE_RADIANS
  6. #define GLM_FORCE_DEPTH_ZERO_TO_ONE
  7. #define GLM_ENABLE_EXPERIMENTAL
  8. #include <glm/glm.hpp>
  9. #include <glm/mat4x4.hpp>
  10. #include <glm/gtx/string_cast.hpp>
  11.  
  12. int main()
  13. {
  14.     glfwInit();
  15.  
  16.     glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
  17.     GLFWwindow* window = glfwCreateWindow(800, 600, "Test Window", NULL, NULL);
  18.  
  19.     uint32_t extensionCount = 0;
  20.     vkEnumerateInstanceExtensionProperties(NULL, &extensionCount, NULL);
  21.    
  22.     printf("Extension count: %i\n", extensionCount);
  23.  
  24.     glm::mat4 testMatrix(1.0f);
  25.     glm::vec4 testVector(1.0f);
  26.     auto testResult = testMatrix * testVector;
  27.  
  28.     printf("testMatrix: %s\n", glm::to_string(testMatrix).c_str());
  29.     printf("testVector: %s\n", glm::to_string(testVector).c_str());
  30.     printf("testResult: %s\n", glm::to_string(testResult).c_str());
  31.  
  32.     while (!glfwWindowShouldClose(window))
  33.     {
  34.         glfwPollEvents();
  35.     }
  36.  
  37.     glfwDestroyWindow(window);
  38.     glfwTerminate();
  39.  
  40.     return 0;
  41. }