关于

本教程将教您使用 Vulkan 图形和计算 API 的基础知识。Vulkan 是 Khronos group(以 OpenGL 闻名)的新 API,它提供了对现代显卡更好的抽象。这个新接口允许您更好地描述您的应用程序打算做什么,与现有的 API(如 OpenGLDirect3D)相比,这可以带来更好的性能和更少的意外驱动程序行为。Vulkan 背后的思想与 Direct3D 12Metal 的思想相似,但 Vulkan 的优势在于它是完全跨平台的,允许您同时为 Windows、Linux 和 Android 开发。

然而,您为这些好处付出的代价是,您必须使用明显更冗长的 API。与图形 API 相关的每个细节都需要由您的应用程序从头开始设置,包括初始帧缓冲创建和对象(如缓冲和纹理图像)的内存管理。图形驱动程序将减少很多帮助,这意味着您必须在应用程序中做更多的工作来确保正确的行为。

这里要传达的信息是,Vulkan 并非适合所有人。它的目标用户是那些对高性能计算机图形充满热情,并且愿意投入一些工作的程序员。如果您对游戏开发而不是计算机图形更感兴趣,那么您可能希望坚持使用 OpenGL 或 Direct3D,它们不会很快被 Vulkan 取代。另一种选择是使用像 Unreal EngineUnity 这样的引擎,它们将能够使用 Vulkan,同时向您公开更高级别的 API。

说完这些,让我们介绍一下学习本教程的一些先决条件

  • 与 Vulkan 兼容的显卡和驱动程序 (NVIDIA, AMD, Intel, Apple Silicon (或 Apple M1))
  • C++ 经验(熟悉 RAII,初始化列表)
  • 对 C++17 功能有良好支持的编译器(Visual Studio 2017+,GCC 7+ 或 Clang 5+)
  • 一些现有的 3D 计算机图形经验

本教程不会假设您了解 OpenGL 或 Direct3D 的概念,但它确实要求您了解 3D 计算机图形的基础知识。例如,它不会解释透视投影背后的数学原理。有关计算机图形概念的精彩介绍,请参阅 这本在线书籍。其他一些很棒的计算机图形资源包括

如果您愿意,可以使用 C 而不是 C++,但您必须使用不同的线性代数库,并且您将需要自行负责代码结构。我们将使用 C++ 的特性,如类和 RAII 来组织逻辑和资源生命周期。还有一个针对 Rust 开发人员的 替代版本 教程。

为了让使用其他编程语言的开发人员更容易上手,并获得一些使用基础 API 的经验,我们将使用原始的 C API 来使用 Vulkan。但是,如果您使用 C++,您可能更喜欢使用较新的 Vulkan-Hpp 绑定,它可以抽象出一些繁琐的工作并帮助防止某些类型的错误。

电子书

如果您更喜欢以电子书的形式阅读本教程,那么您可以在这里下载 EPUB 或 PDF 版本

教程结构

我们将从概述 Vulkan 的工作原理以及我们在屏幕上绘制第一个三角形所需完成的工作开始。在您了解了它们在整个图景中的基本作用之后,所有较小步骤的目的将变得更有意义。接下来,我们将使用 Vulkan SDK、用于线性代数运算的 GLM 库 和用于窗口创建的 GLFW 设置开发环境。本教程将介绍如何在 Windows 上使用 Visual Studio 以及在 Ubuntu Linux 上使用 GCC 进行设置。

之后,我们将实现 Vulkan 程序的所有基本组件,这些组件是渲染您的第一个三角形所必需的。每个章节大致遵循以下结构

  • 介绍一个新概念及其目的
  • 使用所有相关的 API 调用将其集成到您的程序中
  • 将其中的一部分抽象为辅助函数

虽然每个章节都是在前一章的基础上编写的,但也可以将这些章节作为独立的文章阅读,介绍某个 Vulkan 功能。这意味着该网站也可以作为参考。所有 Vulkan 函数和类型都链接到规范,因此您可以单击它们以了解更多信息。Vulkan 是一个非常新的 API,因此规范本身可能存在一些缺点。鼓励您向 这个 Khronos 仓库 提交反馈。

如前所述,Vulkan API 具有相当冗长的 API,其中包含许多参数,可为您提供对图形硬件的最大控制。这导致像创建纹理这样的基本操作需要很多步骤,并且每次都必须重复。因此,我们将在整个教程中创建我们自己的辅助函数集合。

每个章节还将以链接到该点为止的完整代码清单作为结尾。如果您对代码的结构有任何疑问,或者如果您正在处理错误并想进行比较,则可以参考它。所有代码文件都已在多个供应商的显卡上进行了测试,以验证正确性。每个章节末尾还有一个评论部分,您可以在其中提出与特定主题相关的任何问题。请说明您的平台、驱动程序版本、源代码、预期行为和实际行为,以帮助我们帮助您。

本教程旨在成为社区共同努力的成果。Vulkan 仍然是一个非常新的 API,最佳实践尚未真正建立。如果您对教程和网站本身有任何类型的反馈,请随时向 GitHub 仓库 提交 issue 或 pull request。您可以关注该仓库以接收教程更新的通知。

在您完成了绘制您的第一个 Vulkan 驱动的三角形的仪式之后,我们将开始扩展程序以包括线性变换、纹理和 3D 模型。

如果您以前玩过图形 API,那么您就会知道在第一个几何体出现在屏幕上之前可能有很多步骤。Vulkan 中有很多这样的初始步骤,但您会看到,每个单独的步骤都很容易理解,并且不会感到冗余。同样重要的是要记住,一旦您拥有了那个枯燥的三角形,绘制完全纹理化的 3D 模型并不需要那么多额外的工作,并且此后的每一步都更有意义。

如果您在学习本教程时遇到任何问题,请首先查看常见问题解答,看看您的问题及其解决方案是否已列在那里。如果在那之后您仍然遇到困难,请随时在最相关的章节的评论部分寻求帮助。

准备好投入高性能图形 API 的未来了吗? 开始吧!