文章目录

  • 关于
  • 电子书
  • 教程结构


关于

本教程将教你使用Vulkan图形和计算接口的基础知识。Vulkan是由Khronos Group(因OpenGL知名)提供的一个新的API,它对现代图形显卡有更好的抽象。这个新的接口可以让你更好地描述应用程序的目的,相比与OpenGL和Direct3D,可以为你带来更好的性能表现,可以让你更准确地控制驱动的行为。Vulkan的思想和Direct3D 12Metal很像,它的优势在于跨平台,一次开发,处处运行。

但是,为了这些好处要付出的代价就是更加冗长的AIP调用。和图像API相关的每一个细节都需要你的程序从头开始设置,包括初始帧缓冲区的创建、缓冲区和图像对象的内存管理等。图形驱动不会处理很多内容,这意味着需要你来做更多的工作以保证程序的正确运行。

这里要传达的信息就是Vulkan并不适合所有人。它适合那些热衷于高性能图形计算并愿意付出更多工作的人。相比计算机图形学,如果你对游戏开发更感兴趣,你可以继续使用OpenGL或Direct3D,它们现在还不会被淘汰。或者你可以使用Unreal EngineUnity等引擎,它们可以在提供高级的API的同时底层使用Vulkan。

学习本教程之前,我们应该具备以下条件:

  • 与Vulkan(NVIDIAAMDIntel)兼容的显卡和驱动程序
  • 有C++经验(熟悉RAII,初始化列表)
  • 支持C++17的编译器(VS2017+,GCC7+,Clang5+)
  • 一些3D计算机图形经验

这个教程不会假设你了解OpenGL和Direct3D的概念,但你应了解3D计算机图形学的基础知识。本教程不会向你讲解透视投影背后的数学原理。或许你可以通过这个来了解计算机图形学,或者一些其它很棒的资源:

你可以使用C而不是C++,但你需要使用其它线性代数库,也需要自己来处理代码结构。我们将会使用C++的class和RAII特性来组织逻辑和管理资源的生命周期。针对Rust开发者,也有对应的教程

为了让使用其他开发语言的开发者也能学习本教程,学习基本的API,我们选择使用C语言接口来使用Vulkan。如果你使用C++,你可能更倾向于使用较新的Vulkan-Hpp(Vulkan接口的C++封装),它封装了一些复杂的操作,也能避免一些类型错误。

电子书

如果你更倾向于使用电子书来阅读本教程,你可以下载EPUB或PDF:

教程结构

我们首先要了解Vulkan是如何工作的,同时还要做一些必要的工作,这样我们才能在屏幕上显示第一个三角形。有一些小的步骤,只有当你明白了它们的角色之后,你才能感受到它们的意义。接下来,我们就会使用VulkanSDK、线性库GLM和用于创建窗口的GLFW库,来创建开发环境。本教程将介绍如何在使用VS的Windows上和使用GCC的Ubuntu上来设置环境。

创建开发环境之后,我们将实现渲染第一个三角形所需的 Vulkan 程序的所有基本组件。章节大致遵循如下结构:

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

虽然每一章都是作为前一章的后续章节编写的,但也可以将每一章作为介绍某个 Vulkan 功能的独立文章来阅读。这意味着本网站可以作为参考手册。所有的Vulkan函数和类型都链接到了规范,你可以点击它们来了解更多信息。Vulkan是一个非常新的API,所以规范本身可能存在一些问题,我们鼓励你向Khronos提交反馈。

像之前说的,Vulkan API有很多冗长的参数,让你最大限度的控制图形硬件。这导致像创建纹理这样的基本操作每次都必须重复执行很多步骤。所以,我们将会在整个教程中编写一系列辅助函数。

每章结尾,我们还会提供一个指向该部分完整代码的链接。如果你对代码结构有任何疑问,或你正在修复BUG并做比较,你可以参考这些代码。所有的代码都在多种显卡上进行了测试,以保证其正确性。每一章最后你还可以参与讨论,可以提出与主题相关的任何问题。你可以将问题及其环境(如平台、驱动程序版本、源代码、预期结果与实际结果)展示出来,我们会尽力给你提供帮助。

本教程希望为社区做出贡献。Vulkan毕竟是一个非常新的API,还未建立最佳实践。如果你对本教程或本站点有任何类型的问题,可以在Github中创建Issue或PullRepuest。你可以关注Github来获取教程更新的通知。

当你熟悉使用Vulkan在屏幕上绘制第一个三角形之后,我们会引入线性变换、纹理和3D模型相关的内容。

如果你用过一些图形API,你就知道,在绘制第一个几何图形之前,需要很多步骤。Vulkan中有很多初始步骤,但每个步骤都容易理解且重要。你要知道,一旦你绘制出了第一个看似无聊的三角形,那绘制完全有纹理的3D模型就不需要那么多额外的工作了,之后的每一步工作都会感觉更加有意义。