狸村 Mystic Web · 狸村
目录

版权归属

本 Khronos Vulkan® 教程基于 Alexander Overvoorde 撰写的“Vulkan 教程”,遵循 CC BY-SA 4.0 许可协议。

本网站导航及视觉设计归本站所有,与Khronos、Alexander Overvoorde无关

差异说明

本教程使用AI翻译,仅供参考,不提供准确保证,不代表官方观点

相较于原始教程,本版本采用了更新的概念进行教学:

  • 以 Vulkan 1.4 为基础

  • 使用动态渲染替代渲染通道

  • 使用时间线信号量

  • 使用 Slang 作为主要着色语言

  • 使用现代 C++(20 标准)

  • 使用 Vulkan-Hpp 并启用 RAII 特性

本教程还包含了 Vulkan 用法说明、改进的同步机制以及新增内容。

关于本教程

本教程将教你使用 Vulkan 图形与计算 API 的基础知识。 Vulkan 是 Khronos Group 推出的一套 API,它对现代图形卡提供了更出色的抽象。 这种新的接口让你能更好地描述应用程序的意图,相比现有 API(如 OpenGLDirect3D),它可以带来更好的性能,并减少驱动程序行为的不确定性。 Vulkan 背后的理念与 Direct3D 12Metal 相似,但 Vulkan 的优势在于完全跨平台,允许你同时为 Windows、Linux 和 Android 进行开发。

然而,享受这些好处的同时,你也必须面对一个更为冗长、细节更丰富的 API。与图形 API 相关的每一个细节都需要由你的应用程序来设置,包括初始帧缓冲的创建,以及缓冲区、纹理图像等对象的内存管理。图形驱动会少做很多“保姆式”的工作,这意味着你需要在应用程序中做更多的工作来确保行为的正确性。

在可能的情况下,本教程会利用现代工具来简化学习和使用 Vulkan 的过程;不过,Vulkan 本身并不是为追求简单而设计的。

这里要传达的关键信息是:Vulkan 并非适合所有人。它的目标群体是对高性能计算机图形充满热情、并愿意投入精力去研究的程序员。如果你更关心游戏开发而非计算机图形本身,那么你可能更适合继续使用 OpenGL 或 Direct3D,这些 API 在短期内不会因 Vulkan 而被弃用。但需要明白的是,停留在 OpenGL 的代价是它永远不会获得光线追踪或 AI 等最新特性。OpenGL 已进入维护状态,Vulkan 才是研究和获取新特性的地方。 另一种选择是使用像 Unreal EngineUnity 这样的引擎,它们能够在底层使用 Vulkan,同时向你暴露更高级别的 API。

好了,在开始之前,我们先列出学习本教程所需的一些前置条件:

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

    • 大多数 GPU 厂商都在其消费级驱动或移动设备驱动中支持 Vulkan。 对于 macOS 和 iOS,可通过 MoltenVK 获得 Vulkan 支持。 你可以通过社区驱动的 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 使用起来更愉悦的方法。

许可协议

除非另有说明,本仓库的内容采用 CC BY-SA 4.0 许可协议。 向本仓库贡献内容,即表示您同意以相同许可协议将您的贡献公开授权。

教程结构

我们将首先概述 Vulkan 的工作原理,以及为了在屏幕上显示第一个三角形需要完成的工作。在理解了各个小步骤在整体中的作用后,它们的目的会变得更加清晰。 接下来,我们将设置开发环境,包括 Vulkan SDK、用于线性代数运算的 GLM 库 以及用于创建窗口的 GLFW。本教程将介绍如何在 Windows 上使用 Visual Studio 以及如何在 Ubuntu Linux 上使用 GCC 进行设置。

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

  • 引入一个新概念及其用途

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

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

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

如前所述,Vulkan API 相当冗长,包含许多参数,目的是让你对图形硬件拥有最大程度的控制。这导致像创建纹理这样的基本操作需要重复很多步骤。因此,我们将在整个教程中创建自己的辅助函数集合。

每一章结尾都会提供一个指向截至该章完整代码清单的链接。如果你对代码结构有任何疑问,或者遇到了 bug 想进行比对,都可以参考它。所有代码文件都已在多家厂商的显卡上测试,以确保正确性。

如果你对本教程或网站本身有任何问题或反馈,请随时向 GitHub 仓库 提交 issue 或 pull request。你可以关注该仓库,以便收到教程更新的通知。

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

如果你以前玩过图形 API,你就会知道在屏幕上显示第一个几何图形之前可能有很多步骤。Vulkan 中这些初始步骤也很多,但你会发现每个单独的步骤都易于理解,且不显得多余。同样重要的是要记住,一旦你有了那个看起来单调的三角形,绘制带完整纹理的 3D 模型并不会增加太多额外工作,而且之后的每一步都会带来更多的成就感。

如果你在学习本教程的过程中遇到任何问题,请先查看 FAQ,看看你的问题及其解决方案是否已经列在那里。如果之后仍然卡住,请随时在 GitHub 仓库 中寻求帮助。

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

Vulkan 是 Khronos Group Inc. 的注册商标

教程内容版权归原作者,遵循 CC BY-SA 4.0;本站独立代码及设计除外。