【问题标题】:Understanding Vulkan concepts: swapchain, framebuffer理解 Vulkan 概念:交换链、帧缓冲区
【发布时间】:2020-12-04 21:16:48
【问题描述】:

VkInstance 是程序的一个实例

VkPhysicalDevice 表示物理设备。因此,如果我有一个 Intel HD Graphics 和一个 GTX 1660,那么每个都有一个 VkPhysicalDevice

QueueFamily,现在,将是一个有助于从 GPU 发送和接收东西的队列。队列有很多,一个用于从内存中传输数据,另一个用于处理计算命令等。

VkDevice 是与队列族关联的 VkPhysicalDevice。对于同一个 VkPhysicalDevice,我们可以有多个 VkDevices 是有道理的。我们可能会同时将 GPU 用于很多事情,比如解码视频和渲染 3D 场景。我想这就是它的用途。

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

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

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

【问题讨论】:

    标签: graphics 3d gpu vulkan


    【解决方案1】:

    VkInstance 是程序的一个实例

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

    VkDevice 是与队列族关联的VkPhysicalDevice

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

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

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

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

    队列不就是从 GPU 发送和接收图像的结构吗?

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

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

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

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

    用户的这种不灵活性的存在是为了让操作系统和 Vulkan 的实现具有最大的灵活性。 Vulkan 需要在各种硬件和操作系统上运行,并使用它们自己的特殊方式处理显示逻辑。因此,抽象出所有这些差异需要在某些方面不灵活。

    【讨论】:

      【解决方案2】:

      Swapchain 是一种用于处理特定于平台的怪癖的抽象。将其视为 GDI+、DXGI、X11 或 Wayland 及其调用、限制和怪癖的包装器。

      此外,交换链不仅仅是一个“普通”队列执行的东西。它有现在的模式等等。它的语义也有点不同。其目的是将数据移交给表示引擎,这通常是 Vulkan 必须处理的外部事物。

      Vulkan 中的帧缓冲区具有帧所需的所有(历史上不透明的)缓冲区的含义。随着时间的推移,许多人认为这意味着颜色缓冲区,因为这是人们谈论最多的一个,总是需要通过交换链进行特殊处理。但它也是深度缓冲区和模板缓冲区。而且 Vulkan 还新增了输入缓冲区。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-05
        • 1970-01-01
        相关资源
        最近更新 更多