关于

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

然而,这些好处的代价是您必须使用更冗长的 API。与图形 API 相关的每个细节都需要由应用程序从头设置,包括初始帧缓冲区创建和缓冲区和纹理图像等对象的内存管理。图形驱动程序将不再提供太多帮助,这意味着您必须在应用程序中做更多工作以确保正确的行为。

这里的要点是,Vulkan 并不适合所有人。它针对的是那些热衷于高性能计算机图形学并愿意付出一些努力的程序员。如果你对游戏开发比计算机图形学更感兴趣,那么你可能希望坚持使用 OpenGL 或 Direct3D,它们不会很快被 Vulkan 取代。另一种选择是使用 Unreal Engine 或 Unity 等引擎,它们将能够使用 Vulkan,同时向你展示更高级别的 API。

好了,让我们来介绍一下学习本教程的一些先决条件:

  • 与 Vulkan 兼容的显卡和驱动程序(NVIDIAAMDIntelApple Silicon(或 Apple M1)) 与 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++,但您必须使用不同的线性代数库,并且您将自行设计代码结构。我们将使用类和 RAII 等 C++ 功能来组织逻辑和资源生命周期。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 相当冗长,包含许多参数,可让您最大程度地控制图形硬件。这导致创建纹理等基本操作需要很多步骤,每次都必须重复。因此,我们将在整个教程中创建自己的辅助函数集合。

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

本教程旨在成为社区努力的成果。Vulkan 仍然是一个非常新的 API,最佳实践尚未真正建立。如果您对本教程和网站本身有任何反馈,请随时向 GitHub存储库 提交问题或拉取请求。您可以 _ 关注 _ 存储库以接收有关本教程更新的通知。

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

如果您以前使用过图形 API,那么您就会知道,在第一个几何图形出现在屏幕上之前,可能有很多步骤。Vulkan 中有很多这样的初始步骤,但您会发现每个单独的步骤都很容易理解,并且不会让人觉得多余。同样重要的是要记住,一旦您有了这个看起来无聊的三角形,绘制完全纹理的 3D 模型就不需要那么多额外的工作了,而且此后的每一步都会更有回报。

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

准备好探索高性能图形 API 的未来了吗?我们走吧!