Khronos Vulkan® 教程

归属

Khronos Vulkan® 教程基于 Alexander Overvoorde 的 "Vulkan 教程",并根据 CC BY-SA 4.0 许可授权。

关于

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

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

这里的重点是,Vulkan 并不适合所有人。它的目标是热衷于高性能计算机图形,并愿意投入一些工作的程序员。如果您对游戏开发而不是计算机图形更感兴趣,那么您可能希望坚持使用 OpenGL 或 Direct3D,它们不会很快被弃用而支持 Vulkan。另一种选择是使用像 Unreal EngineUnity 这样的引擎,它们可以使用 Vulkan,同时为您公开更高层次的 API。

话虽如此,让我们涵盖一些遵循本教程的先决条件

  • 与 Vulkan 兼容的设备和驱动程序

    • 大多数 GPU 供应商在其消费级驱动程序或移动设备上支持 Vulkan。对于 MacOS 和 iOS,可以通过 MoltenVK 提供 Vulkan 支持。您可以在社区驱动的 Vulkan 硬件数据库 中详细查找 Vulkan 支持。

  • C++ 经验

    • 熟悉 RAII、初始化列表

  • 一个具有良好 C++17 功能支持的编译器

    • Visual Studio 2017+、GCC 7+ 或 Clang 5+

  • 一些使用实时 3D 计算机图形的现有经验

    • 例如 OpenGL 或 Direct3D

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

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

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

许可证

本存储库的内容按照 CC BY-SA 4.0 许可授权,除非另有说明。通过为本存储库做出贡献,您同意根据相同的许可向公众许可您的贡献。

教程结构

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

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

  • 介绍一个新概念及其目的

  • 使用所有相关的 API 调用将其集成到您的程序中

  • 将部分代码抽象为辅助函数

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

如前所述,Vulkan API 具有相当冗长的 API,包含许多参数,以便您能够最大限度地控制图形硬件。 这导致诸如创建纹理之类的基本操作需要重复多次的步骤。 因此,我们将在整个教程中创建我们自己的辅助函数集合。

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

如果您对教程和网站本身有任何类型的反馈,请不要犹豫,向GitHub仓库提交 issue 或 pull request。您可以watch该仓库以接收教程更新的通知。

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

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

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

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