本文档是对Vulkan Tutorial教程的翻译,非官方翻译,仅供vulkan爱好者参考学习。如果有翻译错误,请留言指出,或者联系占航(hangliebe@163.com)进行修正,感谢。建议英文好的朋友直接读原文档。

关注我的微博主页

2022-02-20 v1.0

简介

关于我们

本教程将教你使用Vulkan图形和计算API的基础知识。VulkanKhronos集团(以OpenGL闻名)推出的新API,它为现代图形卡提供了一个更好的抽象。这个新的接口允许你更好地描述你的应用程序打算做什么,与现有的API如OpenGLDirect3D相比,这可能会导致更好的性能和更少的令人惊讶的驱动行为。Vulkan背后的想法与Direct3D 12Metal的想法相似,但Vulkan的优势是完全跨平台,允许你同时为Windows、Linux和Android开发。

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

这里的启示是,Vulkan并不适合所有人。它的目标是那些热衷于高性能计算机图形的程序员,并且愿意投入一些工作。如果你对游戏开发更感兴趣,而不是对计算机图形感兴趣,那么你可能希望坚持使用OpenGL或Direct3D,它们不会在短期内被废弃而支持Vulkan。另一个选择是使用像虚幻引擎Unity这样的引擎,它将能够使用Vulkan,同时向你暴露一个更高层次的API。

说完这些,让我们来介绍一下遵循本教程的一些先决条件。

  • 与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++,但你必须使用不同的线性代数库,而且在代码结构方面你要靠自己了。我们将使用C++的特性,如类和RAII来组织逻辑和资源寿命。本教程还有一个可供Rust开发者使用的替代版本。

为了让使用其他编程语言的开发者更容易跟上,并获得一些基础API的经验,我们将使用原始的C语言API来与Vulkan合作。然而,如果你使用的是C++,你可能更喜欢使用较新的Vulkan-Hpp绑定,它可以抽象出一些杂乱的工作并有助于防止某些类别的错误。

电子书

如果你喜欢以电子书的形式阅读本教程,那么你可以在这里下载EPUB或PDF版本。

EPUB PDF版

教程结构

我们将从概述Vulkan的工作原理和我们必须做的工作开始,以获得屏幕上的第一个三角形。在你理解了它们在整个画面中的基本作用之后,所有小步骤的目的就会更有意义。接下来,我们将用Vulkan SDK、用于线性代数操作的GLM库和用于创建窗口的GLFW设置开发环境。本教程将包括如何在Windows上用Visual Studio设置这些,以及在Ubuntu Linux上用GCC设置。

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

  • 介绍一个新的概念和它的目的
  • 使用所有相关的API调用,将其整合到你的程序中去
  • 将其部分内容抽象为辅助函数

尽管每一章都是作为前一章的后续内容来写的,但也可以将这些章节作为介绍某个Vulkan功能的独立文章来阅读。这意味着该网站也可以作为参考资料使用。所有的Vulkan功能和类型都与规范相联系,所以你可以点击它们来了解更多。Vulkan是一个非常新的API,所以规范本身可能有一些不足之处。我们鼓励你向这个Khronos资源库提交反馈。

如前所述,Vulkan API有一个相当啰嗦的API,有很多参数,可以让你对图形硬件进行最大程度的控制。这导致像创建纹理这样的基本操作需要很多步骤,每次都要重复。因此,我们将在整个教程中创建我们自己的辅助函数集合。

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

本教程旨在成为一项社区工作。Vulkan仍然是一个非常新的API,最佳实践还没有真正建立起来。如果你对本教程和网站本身有任何类型的反馈,那么请不要犹豫,向GitHub仓库提交一个问题或拉动请求。你可以关注该仓库,以获得关于教程更新的通知。

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

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

如果你在跟随教程的过程中遇到了任何问题,那么先看看FAQ,看看你的问题和它的解决方案是否已经列在那里。如果之后你仍然被卡住,那么请随时在最近的相关章节的评论区寻求帮助。

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

留言板