关注专栏 写文章
第 2 章 你的第一个 Vulkan 伪代码程序

第 2 章 你的第一个 Vulkan 伪代码程序

7 人 赞同了该文章

在上一章中,我们提供了一个比较基本的介绍,以便可视化新一代的 Vulkan API。 我们通过这套 API 的高级生态系统设计进行了盘点,并了解内部模块的功能,以此来理解其执行模式。

在本章中,我们会了解一下 Vulkan 环境的安装过程,以便使用 Vulkan 伪代码进行编程做好准备。 Vulkan 的明确性会使编程代码变得更加冗长。 在 Vulkan 中,一个简单的 Hello World !!! 程序最终可能会有大约 1,500 行代码。 这意味着即使是一个简单的例子,对初学者来说也是一个挑战。 但我们先不管这些具体的代码;我们会将整个 Hello World! 程序使用简单的伪代码编程的方式进行讲解。

初学者还将学习如何以一种用户友好的方式构建他们的第一个 Vulkan 应用程序,即分步骤操作的方法。 在本书接下来的章节中,我们会深入研究实际的编码过程,并利用 Vulkan 编程来解决问题。 所以学习过程分为几个模块、多个章节。

本章为其余的章节奠定了基础。 在这里,我们将构建一个非常简单的 Hello World!。这是一个 伪代码程序,我们将通过这份代码来了解使用 Vulkan 构建简单三色三角形的过程。 本章将涵盖以下主题:

  • 安装 Vulkan 环境
  • HelloWorld !!! 伪代码程序
  • 整合在一起
  • 安装 Vulkan

我们已经讨论了很多 Vulkan 的内容, 现在让我们深入研究一下 Vulkan 的安装过程,以及为了让 Vulkan 进行一些实际的作业任务需要掌握的内容。

提示

在继续安装之前,请仔细阅读本书提供的代码文件中的软硬件要求。 如果您的系统符合上述要求,那么您最好按照本章介绍的安装过程一起操作。

请按照以下说明安装 Vulkan:

  1. Vulkan 驱动程序:大多数供应商现在都将 Vulkan 支持包含在常规的驱动程序包中。 首先,安装 Vulkan 驱动程序。 您可以选择安装位置;否则就会使用默认位置进行安装。 例如,如果您正在安装 NVIDIA 驱动程序,安装程序首先会检查系统的配置以扫描安装驱动程序的任何兼容性问题。同时它会升级系统上预装的驱动程序。
  2. 安装 Python:安装 Python 并确保将其添加到环境变量 PATH 中。 这可以通过简单地 勾选Add Python to PATH的复选框来实现。
  3. 安装 CMake:接下来安装 CMake。 确保选中 Add CMake to the system PATH for all users。 您可以使用默认位置进行安装。
  4. 安装 SDK:安装 LunarG SDK。 使用默认位置是没有什么问题的。

注意

LunarG SDK 包含 Vulkan 规范,手册以及有助于构建项目的必要库。 它还包含了可快速启动的演示示例,以检查安装状态。 如果您能够成功运行示例的可执行文件,这意味着 Vulkan 驱动程序和 SDK 已正确安装。 您可以在 / Bin 或 / Bin32(用于 32 位系统)下找到这些示例。

Hello World!!! 伪代码

在本节中,我们将构建我们的第一个 Hello World! Vulkan 应用程序。 该应用程序使用伪代码编程模型构建,它具有以下优点:

  • 通过按步骤进行的过程学习如何构建 Vulkan 应用程序。
  • 由于 Vulkan 编码冗长,因此初学者可能会迷失在细节中。 该伪代码仅仅强调了易于理解的必要细节。
  • 这种紧凑形式的代码程序,对于首次使用 Vulkan 的读者来说更容易记忆。
  • 每个伪代码都使用真正的 Vulkan API,并解释其控制流程。
  • 在本章的最后,如果你是一个完完全全的初学者,你将能够理解 Vulkan 编程以及从零开始构建应用程序的所有必要线索。 此外,您将了解 Vulkan API 的高级概念及其职责和功能。
  • 要详细了解 API,请使用 LunarG SDK 提供的 Vulkan 规范。 或者参考 khronos.org/registry/vu

提示

鉴于本章的篇幅所限,不可能提供每个数据结构字段和 API 参数的详细描述。 伪代码仅限于为大多数重要的数据结构或 API 提供高级定义、概述和最多一到两行的相关功能描述。 在我们继续阅读本书后续章节时,会全面介绍 Vulkan 的所有 API 以及相关数据结构。

初始化 - 与设备握手

Vulkan 初始化包括验证层(validation layer)属性和实例对象(VkInstance)创建的初始化。 一旦创建实例,就要检查现有系统上可用的物理设备(VkPhysicalDevice)。 选择预期的物理设备,并借助实例对象创建相应的逻辑设备(VkDevice)。 在 Vulkan 编程中,逻辑设备用于大多数代表物理设备的逻辑表示的 API 中。

<img src="https://pic2.zhimg.com/v2-6abb48a3344d59cfab19a6cbf830a249_b.jpg" data-rawwidth="1585" data-rawheight="184" data-size="normal" data-caption="" class="origin_image zh-lightbox-thumb" width="1585" data-original="https://pic2.zhimg.com/v2-6abb48a3344d59cfab19a6cbf830a249_r.jpg"/>


Vulkan 通过错误 (error) 和验证层 (validation layers) 提供调试功能。 有两种类型的扩展:

  • 特定于实例 Instance-specific:提供了全局级的扩展
  • 特定于设备 Device-specific:提供了物理设备特定的扩展
<img src="https://pic4.zhimg.com/v2-a95cbb5929f2aabee09ecf47946d95c7_b.jpg" data-rawwidth="789" data-rawheight="237" data-size="normal" data-caption="" class="origin_image zh-lightbox-thumb" width="789" data-original="https://pic4.zhimg.com/v2-a95cbb5929f2aabee09ecf47946d95c7_r.jpg"/>


在开始时,会列举系统中的全局层 (global layers) 以及设备特定 (device-specific) 的扩展;这些由 Vulkan 驱动程序公开。 可以将全局层和扩展注入到要在全局级别(global level)启用的实例对象中。 但是,仅在设备级别启用扩展会使其仅在该特定设备上有效。

初始化负责创建实例 (instance ) 和设备对象 (device objects)。 另外,还会查询全局层 / 扩展(global layers/extensions),并在全局级别或实例级别启用它们。 同样,扩展在特定设备上启用。 以下是伪代码的初始化过程:

  1. 枚举 Instance Layer 属性:Vulkan 首先与加载程序通信并找到驱动程序。 该驱动程序公开了很多扩展 extensions 和层 layers,这些扩展和层可能随着每个新驱动的安装或不同的 GPU 供应商不同而有所差异。 vkEnumerateInstanceLayerProperties 检索层的数量及其属性。 每个层可能包含多个扩展,它们都是可以使用 vkEnumerateInstanceExtensionProperties 进行查询的:
/*** 1. Enumerate Instance Layer properties ***/