教程前言
Vulkan 技术概览
Vulkan 是什么
Vulkan 是 Khronos Group 推出的一款跨平台的现代图形与计算 API。与传统 API (如OpenGL和Direct3D)相比,它为显卡提供了更好的抽象,使你可以更好的描述应用的工作内容,从而减少意外的驱动程序行为并带来更好的性能。
DirectX 12 同样是现代图形 API ,但它仅限于 Windows 平台。
与传统 API 的关键差异
| 维度 | OpenGL/D3D11 | Vulkan |
|---|---|---|
| 驱动开销 | 高(由驱动隐式管理状态) | 低(需开发者显式声明) |
| 线程模型 | 单线程主导 | 原生多线程支持 |
| 着色器编译 | 运行时GLSL编译 | 预编译SPIR-V字节码 |
| 内存管理 | 驱动自动分配 | 开发者控制内存类型 |
这些优势的代价是开发者必须显式管理更多细节,需要编写更多代码以确保行为正确。
什么人适合 Vulkan
Vulkan 并不适合所有人,它针对的是热衷于高性能计算机图形学并愿意投入一些工作的程序员。
如果您主要对游戏开发感兴趣,那么 OpenGL 或 Direct3D 可能更适合您,因为它们的上手难度相对较低,且在多数场景下仍然能够满足需求。
另一种选择是使用 Unreal Engine 或 Unity 这样的游戏引擎。这些引擎可以利用 Vulkan 的高性能特性,同时为开发者提供更易用的高级 API,从而在不牺牲太多性能的前提下显著降低开发难度。
在实际开发中通常会通过一个“渲染硬件接口(RHI)”层对图形引擎进行抽象,但学习底层的引擎 API 仍有助于你理解渲染程序本身。
学习前提
硬件要求
- 支持 Vulkan 的设备(大部分现代显卡都支持)
- 较新的显卡驱动
软件技能
- 熟练的现代 C++ 编程能力(RAII、初始化列表等)
- CMake 和 vcpkg 基础使用经验
理论知识
- 线性代数,微积分等数学基础
- 3D 图形学基础知识
本教程不会教你 OpenGL 或 Direct3D 的概念,但它确实要求您了解 计算机图形学 的基础知识。例如,它不会解释透视投影背后的数学原理。
强烈推荐先修课程:GAMES101-现代计算机图形学入门 。
学习的开始
在编程语言中,常常将打印 Hello World! 作为学习的开始,而图形 API 的学习将从第一个三角形的绘制开始。
绘制三角形需要什么
绘制一个三角形远比你想象的复杂,这里从 GPU 工作的角度简要介绍部分概念:
Vulkan 将 CPU 称为“主机”,将 GPU 称为“物理设备”。 不同 GPU 可能有不同的架构和功能集,因此 Vulkan 为它们抽象出了“逻辑设备”的概念,CPU 程序依赖它与 GPU 交互。
Vulkan 将 GPU 执行工作的通道称为“队列(queue)”,而“队列族”是具有相似功能的队列集合。 比如“图形队列族”是一些可以执行图形渲染工作的队列。 只有 CPU 程序向这些队列提交了“命令”,GPU 才能执行对应的工作。
“缓冲(buffer)”即“缓冲区”,实际指的是 GPU 内存(即显存)。就像 CPU 程序需使用主存一样,GPU 渲染也需要从显存中读数据。 GPU 原先仅用于图形渲染,因此 GPU 上的程序称为“着色器(shader)"。
至此,我们就有了大致的工作思路:
- 初始化环境,获取逻辑设备和需要的队列。
- 把图形数据上传到 GPU 内存(缓冲区)。
- 编写着色器程序,描述如何处理图形数据。
- 发送命令并让 GPU 执行渲染工作。
最后
由于大量的初始化工作,仅仅是绘制一个三角形就需要约700行代码。 但在后续的过程中,你会逐渐理解这些繁琐步骤的巨大意义。 且在完成了第一个三角形后,后续扩展纹理和 3D 模型不再需要那么多重复工作。
准备好投入高性能图形 API 的未来了吗?让我们开始吧!