目录
版权声明(Attribution)
差异说明(Differences)
关于(About)
授权协议(License)
教程结构(Tutorial structure)
版权声明(Attribution)
本 Khronos Vulkan® 教程基于 Alexander Overvoorde 编写的《Vulkan 教程》("Vulkan Tutorial")改编,遵循 CC BY-SA 4.0 授权协议。
差异说明(Differences)
与原版教程相比,本版本教授的是前沿概念:
- 以 Vulkan 1.4 为基准版本
- 采用 Dynamic rendering(动态渲染)替代 render passes(渲染通道)
- 支持 Timeline semaphores(时间线信号量)
- 将 Slang 作为主要着色语言(shading language)
- 采用带模块(modules)的现代 C++ 20 标准
- 结合 RAII 机制的 Vulkan-Hpp
同时,本教程还包含 Vulkan 使用说明的补充说明、改进的同步机制以及新增内容。
关于(About)
本教程将教授 Vulkan 图形与计算 API 的基础知识。Vulkan 是 Khronos 集团推出的 API,能更好地抽象现代显卡的功能。与 OpenGL、Direct3D 等现有 API 相比,这一新接口允许开发者更清晰地描述应用程序的预期行为,从而实现更优性能,减少驱动行为的不确定性。Vulkan 的设计理念与 Direct3D 12、Metal 相似,但优势在于完全跨平台,支持同时为 Windows、Linux 和 Android 系统开发应用。
然而,要获得这些优势,需要面对一个显著更繁琐、更精细的 API。应用程序需自行配置图形 API 相关的所有细节,包括帧缓冲(frame buffer)的初始创建、缓冲区(buffers)和纹理图像(texture images)等对象的内存管理。图形驱动的辅助操作大幅减少,这意味着开发者需要在应用程序中投入更多工作以确保功能正确性。
本教程会尽可能利用现代工具简化 Vulkan 的学习和使用流程,但需明确:Vulkan 的设计初衷并非追求易用性。
核心要点是:Vulkan 并非适用于所有开发者。它面向的是热衷于高性能计算机图形学、愿意投入额外精力的程序员。如果你的兴趣更偏向游戏开发而非计算机图形学,可继续使用 OpenGL 或 Direct3D—— 这些 API 短期内不会被 Vulkan 替代。但需注意,坚持使用 OpenGL 意味着无法获取光线追踪(Ray Tracing)、人工智能(AI)等最新功能。OpenGL 目前处于维护阶段,而 Vulkan 是前沿研究和新功能的承载平台。另一种选择是使用 Unreal Engine 或 Unity 等引擎,这些引擎会底层调用 Vulkan,同时为开发者提供更高层级的 API。
接下来,列出学习本教程的前提条件:
- 兼容 Vulkan 的设备和驱动大多数 GPU 厂商在消费级驱动中支持 Vulkan,移动设备也已普遍支持。对于 macOS 和 iOS 系统,可通过 MoltenVK 实现 Vulkan 支持。你可在社区维护的 Vulkan Hardware Database 中查询详细的硬件支持情况。
- C++ 编程经验需熟悉 RAII 机制、初始化列表(initializer lists)。
- 支持 C++ 20 特性的编译器推荐使用 Visual Studio 2017+、GCC 7+ 或 Clang 5+。
- 实时 3D 计算机图形学基础例如接触过 OpenGL 或 Direct3D。
本教程不要求开发者掌握 OpenGL 或 Direct3D 的具体概念,但需具备 3D 计算机图形学的基础知识(例如不会讲解透视投影(perspective projection)的数学原理)。推荐通过以下资源学习计算机图形学基础:
- 在线书籍《计算机图形学入门》(参考原文提及的 "this online book")
- 《一周入门光线追踪》(Ray tracing in one weekend)
- 《基于物理的渲染》书籍(Physically Based Rendering book)
若你希望使用 C 语言而非 C++,需自行选择其他线性代数库,且需独立处理代码结构设计。本教程将利用 C++ 的类(classes)、RAII 等特性组织逻辑和管理资源生命周期。
为简化 Vulkan 的学习过程,我们将使用较新的 Vulkan-Hpp 绑定 —— 它能抽象部分底层操作,帮助避免特定类型的错误。同时,我们还会结合 Vulkan RAII 和 Vulkan C++ 20 模块。这种组合不仅能展示在大型项目中使用 Vulkan 的高效方式(传统 C++ 库常导致冗长的构建时间),还能让 Vulkan 的使用体验更流畅。
为方便其他编程语言开发者理解核心概念并跟进学习,同时帮助大家熟悉基础 API,我们在描述所用对象和概念时,会参考原始 C API。
授权协议(License)
除非另有说明,本仓库内容遵循 CC BY-SA 4.0 授权协议。向本仓库提交贡献即表示你同意将自己的贡献以相同协议向公众授权。
教程结构(Tutorial structure)
- 首先概述 Vulkan 的工作原理,以及实现 “屏幕上显示第一个三角形” 所需完成的步骤。理解每个小步骤在整体流程中的核心作用后,后续学习会更清晰。
- 接下来搭建开发环境:安装 Vulkan SDK、用于线性代数运算的 GLM 库,以及用于创建窗口的 GLFW 库。教程将详细说明在 Windows(搭配 Visual Studio)和 Ubuntu Linux(搭配 GCC)系统中的搭建流程。
- 之后,将逐步实现 Vulkan 程序的所有基础组件,最终完成第一个三角形的渲染。每章大致遵循以下结构:
- 介绍新概念及其用途
- 调用所有相关 API 将其集成到程序中
- 将部分逻辑抽象为辅助函数
尽管各章节按顺序编写(后一章基于前一章内容),但每章也可作为独立文章阅读,专门介绍某一 Vulkan 特性。因此,本教程网站也可作为参考手册使用。所有 Vulkan 函数和类型均链接至官方规范文档,点击即可查看详细说明。欢迎向 Khronos 仓库提交反馈。
如前所述,Vulkan API 较为繁琐,包含大量参数,目的是让开发者获得对图形硬件的最大控制权。这导致创建纹理等基础操作需要重复执行多个步骤。因此,本教程将逐步构建自定义的辅助函数集合。
每章末尾会提供截至该章节的完整代码链接。若对代码结构有疑问,或遇到 Bug 需对比排查,可参考这些代码。所有代码文件均在多家厂商的显卡上经过测试,确保正确性。每章末尾还设有评论区,你可针对该章节主题提问。提问时请注明你的平台、驱动版本、源代码、预期行为和实际行为,以便我们更好地提供帮助。
若对教程内容或网站本身有任何反馈,欢迎随时向 GitHub 仓库提交 issue 或 pull request。你也可以 “关注” 该仓库,及时获取教程更新通知。
成功渲染出第一个 Vulkan 三角形后,我们将进一步扩展程序功能,包括线性变换(linear transformations)、纹理(textures)和 3D 模型的集成。
若你有过图形 API 使用经验,就会知道 “让第一个几何图形显示在屏幕上” 往往需要经历多个步骤。Vulkan 的初始设置步骤确实较多,但每个独立步骤都易于理解,且不会显得冗余。更重要的是:一旦成功渲染出这个看似简单的三角形,后续实现带纹理的 3D 模型渲染并不需要额外投入过多工作,且每一步进阶都会带来更强的成就感。
若在学习过程中遇到问题,建议先查看 FAQ(常见问题解答),确认问题及解决方案是否已列出。若仍未解决,可在最相关章节的评论区寻求帮助。
准备好探索高性能图形 API 的未来了吗?让我们开始吧!