为什么选择 Vulkan?
在开始之前,我们需要明白为什么在 OpenGL 依然存在的情况下,我们需要去"受苦"学习 Vulkan。
简单来说,OpenGL 是驱动程序为你做好了大部分工作(状态管理、内存同步),这很方便,但也意味着你无法确切知道驱动在背后做了什么,导致了不可预测的性能抖动。
Vulkan 的核心哲学是"显式控制 (Explicit Control)":
-
低开销: 驱动层更薄,CPU 负载更低。
-
多线程友好: 天生支持多核 CPU 并行提交命令。
-
显式内存管理: 你完全控制显存的分配和同步。
虽然代码量会激增(画一个三角形可能需要近千行代码),但每一行代码都在你的掌控之中。
准备工作 (Windows)
我们将完全基于 Windows 平台进行开发。你需要准备以下工具:
-
操作系统: Windows 10 或 Windows 11。
-
显卡: 支持 Vulkan 的 GPU(NVIDIA GTX 600系列以上,AMD Radeon HD 7000系列以上,或较新的 Intel 集显)。
-
IDE: Visual Studio 2019 或 2022(确保安装了 "Desktop development with C++" 工作负载)。
第一步:下载 Vulkan SDK
Vulkan 开发的核心是 LunarG 提供的 SDK。
-
选择 Windows 平台并下载最新的安装包。
-
关键点: 在安装过程中,务必勾选 "Add to System Path"(添加到系统环境变量),这能省去后续很多麻烦。
安装完成后,打开命令提示符(CMD)输入 vulkaninfo。如果看到长长的显卡信息输出,说明 SDK 安装成功。
第二步:准备第三方库 (GLFW 和 GLM)
Vulkan 自身是一个纯粹的图形 API,它不负责创建窗口或处理用户输入。同时,它也不包含数学库。因此我们需要两个帮手:
1. GLFW (窗口管理)
Vulkan 是跨平台的,为了屏蔽 Windows API 的复杂性,我们使用 GLFW 来创建窗口。
-
访问 GLFW 下载页。
-
下载 64-bit Windows binaries (预编译版本)。
-
解压后,你会看到
include和lib-vc2022(或对应版本) 文件夹。
2. GLM (数学库)
Vulkan 使用线性代数(向量、矩阵),GLM 是专门为图形学设计的数学库,且完全兼容 OpenGL/Vulkan 的数据结构。
-
访问 GLM 下载页。
-
下载最新版。GLM 是 Header Only (只有头文件) 的库,不需要编译。
第三步:Visual Studio 项目配置 (重头戏)
这是新手最容易卡关的地方。请按照以下步骤配置你的 VS 项目:
-
创建项目: 新建一个 "Empty Project" (C++)。
-
设置架构: 在顶部工具栏,将解决方案平台从
x86改为x64(非常重要,Vulkan SDK 和我们下载的 GLFW 都是 64 位的)。
接下来打开 项目属性 (Project Properties),确保配置选为 "All Configurations":
A. 包含目录 (Include Directories)

在 C/C++ -> General -> Additional Include Directories 中添加:
-
Vulkan SDK 的 Include 路径 (通常是
D:\VulkanSDK\<version>\Include) -
GLFW 的
include文件夹路径 -
GLM 的根文件夹路径
B. 库目录 (Library Directories)

在 Linker -> General -> Additional Library Directories 中添加:
-
Vulkan SDK 的 Lib 路径 (通常是
D:\VulkanSDK\<version>\Lib) -
GLFW 的
lib-vc2022文件夹路径
C. 链接器输入 (Linker Input)

在 Linker -> Input -> Additional Dependencies 中手动输入:
-
vulkan-1.lib -
glfw3.lib
D. 语言标准
建议在 C/C++ -> Language -> C++ Language Standard 中选择 ISO C++17。

第四步:Hello Vulkan (测试环境)
创建一个 main.cpp 文件,输入以下代码来测试环境是否配置正确。这段代码会初始化一个 GLFW 窗口并检查 Vulkan 扩展支持。
cpp
#define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h>
#include <iostream>
#include <stdexcept>
#include <cstdlib>
const uint32_t WIDTH = 800;
const uint32_t HEIGHT = 600;
class HelloVulkanApp {
public:
void run() {
initWindow();
initVulkan();
mainLoop();
cleanup();
}
private:
GLFWwindow* window;
void initWindow() {
glfwInit();
// 告诉 GLFW 不要创建 OpenGL 上下文 (因为我们要用 Vulkan)
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
// 暂时禁止调整窗口大小
glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);
window = glfwCreateWindow(WIDTH, HEIGHT, "Vulkan", nullptr, nullptr);
}
void initVulkan() {
// 这里仅仅做一个最简单的测试:检查 Vulkan 支持的扩展数量
uint32_t extensionCount = 0;
vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr);
std::cout << "恭喜!Vulkan 环境配置成功。" << std::endl;
std::cout << "检测到 " << extensionCount << " 个可用的 Vulkan 扩展支持。" << std::endl;
}
void mainLoop() {
while (!glfwWindowShouldClose(window)) {
glfwPollEvents();
}
}
void cleanup() {
glfwDestroyWindow(window);
glfwTerminate();
}
};
int main() {
HelloVulkanApp app;
try {
app.run();
} catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
运行结果
按下 F5 运行。如果你的配置正确,你应该会看到:
-
一个黑色的空白窗口弹出。
-
控制台输出类似:
检测到 20个可用的 Vulkan 扩展支持。
如果看到了这些,恭喜你!你已经成功搭建了 Vulkan 的 Windows 开发环境,并迈出了最艰难的第一步。
下一步
环境搭建只是开始。在下一篇文章中,我们将深入 Vulkan 的核心概念,开始创建 Instance (实例) 并与物理显卡"握手"。
准备好迎接近千行代码画一个三角形的挑战了吗?