Khronos Vulkan® 教程

      +

      归属

      Khronos Vulkan® 教程基于 Alexander Overvoorde 的 "Vulkan 教程",该教程采用 CC BY-SA 4.0 许可。

      差异

      与原始教程相比,本教程版本教授的是最新概念:

      • 以 Vulkan 1.4 为基准

      • 使用动态渲染而非渲染通道

      • 时间线信号量

      • Slang 作为主要着色语言

      • 现代 C++ (20) 与模块

      • Vulkan-HppRAII

      它还包含 Vulkan 使用说明、改进的同步机制和新内容。

      关于

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

      然而,为了获得这些好处,您需要使用一个明显更详细和微妙的 API。与图形 API 相关的每个细节都需要由您的应用程序设置,包括初始帧缓冲区创建和对象(如缓冲区和纹理图像)的内存管理。图形驱动程序将减少很多辅助工作,这意味着您需要在应用程序中做更多工作以确保正确的行为。

      在本教程中,我们会尽可能利用现代工具来简化使用和学习 Vulkan 的过程;然而,Vulkan 本身并不是为了简单而设计的。

      这里的要点是 Vulkan 并不适合所有人。它面向那些对高性能计算机图形充满热情并愿意投入工作的程序员。如果您对游戏开发比对计算机图形更感兴趣,那么您可能希望继续使用 OpenGL 或 Direct3D,它们在短期内不会被 Vulkan 取代。然而,继续使用 OpenGL 的代价是该 API 将永远无法获得最新功能,如光线追踪或 AI。OpenGL 处于维护状态,而 Vulkan 是研究和新功能的所在地。另一种选择是使用 虚幻引擎Unity 等引擎,它们能够使用 Vulkan 同时向您公开更高级别的 API。

      说完这些,让我们来看看学习本教程的一些先决条件:

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

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

      • C++ 经验

        • 熟悉 RAII、初始化列表

      • 具有良好 C++20 特性支持的编译器

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

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

        • 例如,OpenGL 或 Direct3D

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

      如果您愿意,可以使用 C 而不是 C++,但您将需要使用不同的线性代数库,并且在代码结构方面将需要自行处理。我们将使用 C++ 特性,如类和 RAII,来组织逻辑和资源生命周期。

      为了更容易学习使用 Vulkan,我们将使用较新的 Vulkan-Hpp 绑定,它抽象了一些繁琐的工作并帮助防止某些类型的错误。我们还将使用 Vulkan RAII 和 Vulkan C++20 模块。通过这种组合,我们展示了如何以一种方式使用 Vulkan,这种方式将直接转化为大型项目,其中 C++ 库传统上会导致较长的构建时间,同时也展示了一种使 Vulkan 成为愉快工作对象的方法。

      为了更容易理解核心概念并让使用其他编程语言的开发人员能够跟上,同时也为了获得一些基本 API 的经验,我们将在描述所使用的对象和概念时使用原始的 C API。

      许可证

      本仓库的内容采用 CC BY-SA 4.0 许可,除非另有说明。 通过向本仓库贡献,您同意根据相同许可将您的贡献许可给公众。

      教程结构

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

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

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

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

      • 将其部分抽象为辅助函数

      虽然每一章都是作为前一章的后续内容编写的,但也可以将各章作为介绍某个 Vulkan 功能的独立文章阅读。这意味着该网站也可以作为参考使用。所有 Vulkan 函数和类型都链接到规范,因此您可以点击它们了解更多信息。欢迎您向 这个 Khronos 仓库 提交反馈。

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

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

      如果您对教程和网站本身有任何类型的反馈,请不要犹豫,向 GitHub 仓库 提交问题或拉取请求。您可以关注该仓库以获取有关教程更新的通知。

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

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

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

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