Vulkan开发环境

这里使用译者的开发环境:
Ubuntu(操作系统)
CMake(构建系统)
CLion(IDE)
g++/clang(编译器)

设置开发环境,有一些基本的知识你得会。比如:

  1. 编译过程
  2. 怎么用Linux,怎么用Ubuntu
  3. 怎么用CMake
  4. 怎么用CLion(如果你用的话)
  5. 等等吧

安装g++

Ubuntu包:g++/clang

你也可以安装clang,然后通过update-alternatives命令切换默认c编译器,或通过CMake修改c编译器。

安装CMake

Ubuntu包:cmake

安装Vulkan

Ubuntu包:vulkan-tools libvulkan-dev vulkan-validationlayers-dev spriv-tools

在Linux上开发Vulkan应用时,你需要一些重要的内容:Vulkan加载器、验证层和一组测试你机器是否支持Vulkan的命令行实用程序:

  • vulkan-tools:命令实用程序包,最重要的是vulkaninfovkcube工具。运行它们以确定你的机器是否支持Vulkan。
  • libvulkan-dev:Vulkan加载器,用于运行时查找驱动中的函数,就像OpenGL中的GLEW(如果你了解的话)。
  • vulkan-validationlayers-dev spriv-tools:安装标准验证层和需要的SPIR-V工具。它们对于调试Vulkan程序非常重要。我们会在之后的章节中讨论。

Vulkan就安装好了。你可以通过vkcube指令测试一下,如果成功你会看到如下窗口:
Vulkan开发环境 - 图1
如果你收到了错误消息,你要确保你安装了最新的驱动程序,确保其包含Vulkan运行时,确保你的显卡支持Vulkan。你可以回顾介绍章节,找到供应商的驱动程序链接,以获取支持。

安装GLFW

Ubuntu包:libglfw3-dev

如前所述,Vulkan是一个平台无关的API,而且它不包含任何创建显示渲染结果的窗口的接口。为了受益于跨平台并不使用X11,我们使用GLFW库创建窗口,它支持Windows、Linux和MacOS。也有一些别的库可以使用,像SDL,但GLFW 的优势在除了创建窗口之外,还抽象了一些其它特定于平台的内容。

安装GLM

Ubuntu包:libglm-dev

与DirectX12不同,Vulkan不包含用于线性代数运算的库。GLM是一个很好的库,设计用于图形API,常常用于OpenGL。它是一个只有头文件的库。

安装着色器编译器

Ubuntu包:没有glslc
我们要自己装,从这里下载非官方包,然后安装到/usr/local/文件夹(把install目录里面的内容都拷贝过去就行,拷贝时记得加上sudo权限)。

现在,我们只需要一个将文本着色器代码编译为字节码的程序。

有两个比较流行的编译器:Khronos Group的glslangValidator和Google的glslcglslc用起来像gccclang,我们用它。你可以执行glslc试一下,应该会输出以下内容:

  1. glslc: error: no input files

我们会在着色器模块一章深入了解glslc

创建CMake项目

我们从这里获取源码。

然后,我们在源码目录新建一个CMakeFiles.txt:

  1. # 设置cmake版本
  2. cmake_minimum_required(VERSION 3.12)
  3. # 新建项目
  4. project(VulkanTutorial)
  5. # 设置使用c++17
  6. set(CMAKE_CXX_STANDARD 17)
  7. ################################################################################
  8. # find glslc
  9. # package: https://github.com/google/shaderc/blob/main/downloads.md
  10. find_program(
  11. GLSLC_COMMAND
  12. name glslc
  13. PATHS
  14. /bin
  15. /usr/bin
  16. /usr/local/bin
  17. )
  18. if (GLSLC_COMMAND)
  19. message(STATUS "Found glslc ${GLSLC_COMMAND}")
  20. else ()
  21. message(FATAL_ERROR "NOT fount glslc")
  22. endif ()
  23. ################################################################################
  24. # glm
  25. # target: glm::glm
  26. # ubuntu package: libglm-dev
  27. find_package(glm REQUIRED)
  28. if (glm_FOUND)
  29. message(STATUS "Found glm(${GLM_VERSION})")
  30. else ()
  31. message(FATAL_ERROR "NOT found glm")
  32. endif ()
  33. ################################################################################
  34. # glfw3
  35. # target: glfw
  36. # ubuntu package: libglfw3-dev
  37. find_package(glfw3 REQUIRED)
  38. if (glfw3_FOUND)
  39. message(STATUS "Found glfw3(${glfw3_VERSION})")
  40. else ()
  41. message(FATAL_ERROR "NOT found glfw3")
  42. endif ()
  43. ################################################################################
  44. # Vulkan
  45. # target: Vulkan
  46. # ubuntu package: vulkan-tools libvulkan-dev vulkan-validationlayers-dev spriv-tools
  47. find_package(Vulkan REQUIRED)
  48. if (Vulkan_FOUND)
  49. message(STATUS "Found Vulkan")
  50. else ()
  51. message(FATAL_ERROR "NOT found Vulkan")
  52. endif ()
  53. # 添加子目录
  54. add_subdirectory(code)
  55. 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061

然后,我们在code目录新建一个CMakeFiles.txt:

  1. # 获取所有源码文件
  2. file(GLOB SRCS *.cpp)
  3. foreach (SRC ${SRCS})
  4. # 获取文件名
  5. get_filename_component(NAME ${SRC} NAME_WE)
  6. # 每个源码文件都生成一个可执行程序
  7. add_executable(${NAME} ${SRC})
  8. # 链接库
  9. target_link_libraries(
  10. ${NAME}
  11. Vulkan::Vulkan
  12. glm::glm
  13. glfw
  14. )
  15. endforeach ()
  16. # 生成spv(TODO)
  17. 123456789101112131415161718

可通过命令行启动第一个窗口:

  1. # 首先进入到源码目录,之后执行以下目录
  2. # 新建文件夹,用于生成
  3. mkdir build
  4. # 进入build目录
  5. cd build
  6. # 由CMake生成Makefile项目
  7. cmake ..
  8. # 生成 00_base_code
  9. make 00_base_code
  10. # 执行程序
  11. ./code/00_base_code
  12. 123456789101112

执行以上命令之后,可以看到一个黑色的窗口。
Vulkan开发环境 - 图2