问题描述
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
方式为驱动程序提供了一个极好的机会,可以计算出如何与帧缓冲区一起使用的总体策略,同时允许稍后提供实际的图像。