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

问题描述

VkInstance是程序的实例

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

目前,

QueueFamily将是一个队列,可以帮助从GPU发送和接收消息。队列很多,例如一个用于从内存中传输数据的队列,另一个用于处理计算命令的队列,等等。

VkDevice是与队列族关联的VkPhysicalDevice。我们可以为同一VkPhysicalDevice拥有多个VkDevice,这很有意义。我们可能同时使用GPU处理许多事情,例如解码视频和渲染3D场景。我想这就是它的目的。

我们需要一个VkSurfaceKHR来显示事物,因为Vulkan与设备无关,因此我们有必要向其传递一个窗口。

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

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

解决方法

VkInstance是程序的实例

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

VkDevice是与队列族关联的VkPhysicalDevice

不,不是。 VkPhysicalDevice代表GPU(以简化方式)。 VkDevice是GPU的接口。如果VkPhysicalDevice是一个类,则VkDevice是该类的实例

VkDevice的创建要求您指定要使用的队列系列(请注意复数)以及每个系列应提供多少个队列。

现在出现了SwapChain的概念。我无法将其与Queue(与QueueFamily)区分开来。

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

队列是否为从GPU发送和接收图像的结构?

队列是一种将工作发送到GPU以便执行的方法。这项工作可能是在可访问GPU的内存之间传输数据。

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

就是。顾名思义,vkQueuePresentKHR是一个队列操作。它将给定的交换链图像显示在给定的队列上。

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

存在这种针对用户的灵活性,以便为OS和Vulkan的实现提供最大的灵活性。 Vulkan需要使用自己的特殊显示方式来在各种硬件和操作系统上运行。因此,将所有这些差异抽象化需要在某些方面保持僵化。

,

交换链是用于处理特定于平台的怪癖的抽象。可以将其视为GDI +,DXGI,X11或Wayland及其调用,限制和怪癖的包装。

此外,交换链还不只是一个“正常”队列执行的东西。它具有当前模式和其他功能。其语义也有所不同。其目的是将数据移交给Presentation Engine,这通常是Vulkan的外部事务,必须处理。

Vulkan中的帧缓冲区具有帧所需的所有(历史上不透明的)缓冲区的含义。随着时间的流逝,许多人认为这意味着色彩缓冲区,因为色彩缓冲区是最受关注的一种,始终需要通过交换链进行特殊处理。但是它也是深度缓冲区和模板缓冲区。 Vulkan还新增加了输入缓冲区。

无图像帧缓冲区也已添加到扩展中,并已添加到Vulkan 1.2中。因此,最好将其视为“ VkFramebufferMetadata”。在这种情况下,vkCreateFramebuffer只是在渲染通道中插入将在帧缓冲区角色中使用的图像的元数据(创建参数)。这种vkCreateFramebuffer方式为驱动程序提供了一个极好的机会,可以计算出如何与帧缓冲区一起使用的总体策略,同时允许稍后提供实际的图像。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...