了解 Vulkan 概念:交换链、帧缓冲区

Gue*_*OCs 1 3d graphics gpu vulkan

VkInstance是一个程序的实例

VkPhysicalDevice代表一个物理设备。因此,如果我有一个 Intel HD Graphics 和一个 GTX 1660,则各有VkPhysicalDevice一个

QueueFamily目前,它将是一个有助于从 GPU 发送和接收内容的队列。有很多队列,例如一个用于从内存传输数据,另一个处理计算命令等。

AVkDevice是与队列系列关联的 VkPhysicalDevice。VkDevice同一个 VkPhysicalDevice可以有多个,这是有道理的。我们可以同时使用 GPU 来做很多事情,比如解码视频和渲染 3D 场景。我想这就是它的用途。

我们需要 aVkSurfaceKHR来显示东西,因为 Vulkan 与设备无关,所以我们需要向它传递一个窗口是有意义的。

现在来了 SwapChain 的概念。我无法将它与队列(来自 QueueFamily)区分开来。Queue 不是用于从 GPU 发送和接收图像的结构吗?为什么不简单地使用队列来呈现图像VkSurfaceKHR

还有帧缓冲区的概念。对我来说,帧缓冲区是显示在屏幕上的渲染图像,因此它是SwapChain.

Nic*_*las 5

VkInstance是一个程序的实例

不,它是 Vulkan 执行系统的一个实例。您可以拥有多个 Vulkan 实例(尽管没有多大意义)。

A与队列族相关联VkDeviceVkPhysicalDevice

不,这不对。VkPhysicalDevice代表 GPU(过于简单化)。VkDevice是GPU 的接口。如果VkPhysicalDevice是一个类,VkDevice则 是该类的实例。

VkDevice创建要求您指定要使用哪些队列系列(注意复数)以及每个系列中有多少个队列可用。

现在来了 SwapChain 的概念。我无法将它与队列(来自 QueueFamily)区分开来。

交换链基本上与队列无关。他们有时会使用队列,但它们与队列并不真正相关。

Queue 不是用于从 GPU 发送和接收图像的结构吗?

队列是将工作发送到 GPU 以供其执行的一种方法。这项工作可能是将数据传输到 GPU 可访问的内存或从 GPU 可访问的内存传输数据。

为什么不简单地使用队列在 VkSurfaceKHR 上呈现图像?

就是它的工作原理。vkQueuePresentKHR顾名思义,是一个队列操作。它在给定队列上呈现给定交换链图像。

不允许的是呈现任意图像的能力。交换链中的图像不属于您(或 Vulkan);它们属于操作系统。您可以要求使用其中之一,并且该请求有望获得批准。渲染后即可呈现。但你永远不会拥有它。

这种对用户的不灵活性的存在是为了为操作系统和 Vulkan 的实现提供最大的灵活性。Vulkan 需要在各种硬件和操作系统上运行,并具有处理显示逻辑的特殊方法。因此,要消除所有这些差异,就需要在某些方面保持僵化。