开发环境
概述
本文将指导你完成 Vulkan 应用程序开发环境的设置,包括安装必要的工具和库。
注意,CMake 和 vcpkg 自身的安装,以及 MSVC/Clang 等编译器的安装,不是本教程的内容。
作为跨平台的教程,我们不限制编译器的选择,但请保证它支持您需要的 C++ 标准。
安装 Vulkan SDK
Vulkan SDK 是开发Vulkan应用程序的核心组件,包含:
- 头文件
- 函数加载器
- 标准验证层
- 着色器编译支持
- ······
可以从 LunarG官网 下载SDK,无需注册账户。
Windows 安装
- 从 官网 下载 Vulkan SDK 并运行安装程序,允许它设置环境变量
- 验证安装:
- 进入 SDK 安装目录的 Bin 子目录
- 运行 vkcube.exe 演示程序
- 应看到旋转的立方体窗口
Linux
图形界面安装
参考Windows安装方法。
命令行安装:
Ubuntu/Debian系
sudo apt install vulkan-tools libvulkan-dev vulkan-validationlayers-dev spirv-tools
Fedora/RHEL系
sudo dnf install vulkan-tools vulkan-loader-devel mesa-vulkan-devel vulkan-validation-layers-devel
Arch Linux
sudo pacman -S vulkan-devel
验证安装:
vkcube
确保您看到以下窗口弹出
MacOS 安装
要求:
- MacOS 10.11或更高版本
- 支持Metal API的硬件
步骤:
-
从 LunarG官网 下载SDK
-
解压到选定目录
-
运行
Applications
目录下的vkcube
演示程序
您应该看到以下内容
依赖库安装
我们使用 vcpkg 作为跨平台包管理器,安装方式请参考 官方文档 。
GLFW
Vulkan 本身是一个平台无关的 API,不包含用于创建窗口以显示渲染结果的工具。 我们将使用 GLFW 库来创建窗口,它支持 Windows、Linux 和 MacOS,且和 Vulkan 有很好的集成。
安装命令:
vcpkg install glfw3
GLM
与 DirectX 12 不同,Vulkan 不包含用于线性代数运算的库。我们使用 GLM 线性代数库,它专为图形 API 设计,常用于 OpenGL 与 Vulkan 。
安装命令:
vcpkg install glm
项目初始化
目录结构
项目根目录/
│
├── CMakeLists.txt # 主CMake配置文件
│
└── src/ # 源代码目录
│
└── main.cpp # 主程序入口
CMake配置
- 设置工具链为vcpkg。
- 设定项目C++标准。
- 查找Vulkan,glm,glfw3三个库。
- 添加主程序。
- 链接库。
参考代码:
# CMakeLists.txt
cmake_minimum_required(VERSION 4.0.0)
# 需要设置环境变量VCPKG_ROOT
file(TO_CMAKE_PATH "$ENV{VCPKG_ROOT}" VCPKG_CMAKE_PATH)
set(CMAKE_TOOLCHAIN_FILE "${VCPKG_CMAKE_PATH}/scripts/buildsystems/vcpkg.cmake")
project(HelloVulkan LANGUAGES CXX)
# 此处使用 23 标准,你可以按需设置
set(CMAKE_CXX_STANDARD 23)
# 需要设置VULKAN_SDK环境变量,比如 D:\Vulkan\1.4.309.0
# 环境变量默认在Vulkan SDK安装时,自动设置
find_package(Vulkan REQUIRED)
# 通过vcpkg导入第三方库
find_package(glfw3 CONFIG REQUIRED)
find_package(glm CONFIG REQUIRED)
# 添加可执行程序目标
add_executable(${PROJECT_NAME} src/main.cpp)
# 链接库
target_link_libraries(${PROJECT_NAME} PRIVATE Vulkan::Vulkan )
target_link_libraries(${PROJECT_NAME} PRIVATE glm::glm )
target_link_libraries(${PROJECT_NAME} PRIVATE glfw )
CMakeLists.txt
代码将在较长时间内不再变动。
测试代码
添加测试代码,测试三个库是否正常:
// main.cpp
#include <iostream>
#include <string_view>
#include <print>
#include <vulkan/vulkan.hpp>
#include <vulkan/vulkan_raii.hpp>
#include <GLFW/glfw3.h>
#define GLM_FORCE_RADIANS
#define GLM_FORCE_DEPTH_ZERO_TO_ONE
#include <glm/vec4.hpp>
#include <glm/mat4x4.hpp>
int main() {
// vulkan test
const vk::raii::Context context;
const auto extensions = context.enumerateInstanceExtensionProperties();
std::cout << "vulkan available extensions:" << std::endl;
for (const auto& extension : extensions) {
std::println("{}", std::string_view( extension.extensionName ));
}
// glm test
constexpr glm::mat4 matrix(1.0f);
constexpr glm::vec4 vec(1.0f, 2.0f, 3.0f, 4.0f);
constexpr glm::vec4 test = matrix * vec;
std::println("{} {} {} {}", test.x, test.y, test.z, test.w);
// glfw test
glfwInit();
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
GLFWwindow* window = glfwCreateWindow(800, 600, "Vulkan window", nullptr, nullptr);
while(!glfwWindowShouldClose(window)) {
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
}
你无需理解上述C++代码的含义,这只是测试库是否成功导入。
构建运行
下面尝试构建和运行程序,在项目根目录执行:
cmake -B build
cmake --build build
运行:
# Windows
build/HelloVulkan.exe
# Linux/MacOS
build/HelloVulkan
预期结果:
- 控制台输出 Vulkan 可用的扩展列表
- 控制台输出 GLM 计算结果: 1 2 3 4
- 弹出空白窗口,可点击右上角关闭窗口
关于CMake预设
注意:CMake预设不是必须的,我们没有复杂的配置需求,你完全可以通过上面两行简单的CMake指令构建项目!
如果你喜欢使用 CMakePresets.json
(它可以很好地和 CLion、VSCode、Visual Studio 配合),可以参考 这个 预设模板。
此预设模板使用 Ninja 作为生成器,提供了 MSVC/GNU/Clang 工具链的预设配置。
代码编辑器
建议使用一个足够智能的编辑器。 当你不确定某些函数的参数和它的含义时,可以右键函数并跳转到它的定义并查看实现。Visual Studio / VSCode / CLion都能提供此功能。