【问题标题】:Drawing to Multiple Windows Using Vulkan使用 Vulkan 绘制到多个窗口
【发布时间】:2021-07-23 04:22:46
【问题描述】:

我正在尝试创建一个可以动态创建附加窗口的应用程序。每个窗口都将使用 Vulkan 绘制,我知道这意味着每个窗口都必须包含它自己的 SwapChain 资源(图像视图、帧缓冲区等)和图形管道(因为它引用了交换链的范围)。我想知道每个窗口是否还必须记住自己当前的队列系列,或者我是否可以假设每个窗口都可以使用相同的队列系列。具体来说,要查找当前队列族,您需要使用以下方法确定特定队列族是否支持表面呈现:

VkResult vkGetPhysicalDeviceSurfaceSupportKHR(
    VkPhysicalDevice physicalDevice, 
    uint32_t queueFamilyIndex, 
    VkSurfaceKHR surface, 
    VkBool32* pSupported);

这需要VkSurfaceKHR,因此需要特定窗口的HWNDHINSTANCE,但我不确定当前队列系列是否可能在由同一操作系统创建的不同窗口之间发生变化,或者如果我可以安全地为每个窗口使用相同的窗口。

类似地,在查看swap chain recreation within the vulkan-tutorial 时,我读到VKSurfaceFormatKHR::format 在窗口调整大小期间很少更改,这就是在窗口调整大小操作期间需要重建渲染通道 的唯一原因。在调整窗口大小期间跳过此步骤中的渲染通道重新创建有多安全?同一渲染通道用于不同窗口的效果如何?

如果每个窗口都使用类似的图形管道,更具体地说,使用相同的同步对象,是否通常让每个窗口附加到相同的命令缓冲区并使用单个 vkQueueSubmit?我只是问,因为您需要为飞行中的每个帧创建一个命令缓冲区,因此所需的命令缓冲区数量将是 numWindows * numFramesInFlight 感觉过多,但我不确定它是否与单个大飞行中每帧的命令缓冲区(由每个窗口附加)。

顺便说一句,使用 Vulkan 绘制到多个窗口的资源似乎相当稀缺,所以如果有人知道任何好的资源,我将不胜感激。

【问题讨论】:

    标签: c++ window rendering vulkan


    【解决方案1】:

    在 Windows 上,您可以在很大程度上假设一切都可以渲染到一切。但是使用你应该检查一下。 vkGetPhysicalDeviceWin32PresentationSupportKHR 不需要表面,并强烈暗示 device\queue 是一个能够呈现的,而不是例如。计算加速器什么的。

    类似地,在查看 vulkan-tutorial 中的交换链重建时,我读到 VKSurfaceFormatKHR::format 在窗口调整大小期间很少更改,这是需要重建渲染通道的唯一原因

    它不应该在物理设备和表面的生命周期内发生变化。如果它可以改变,那将是TOCTOU 的问题。

    如果每个窗口都使用类似的图形管道,更具体地说,使用相同的同步对象,是否通常让每个窗口附加到相同的命令缓冲区并使用单个 vkQueueSubmit

    为什么不呢。我的意思是这没有什么“典型的”。但如果可以做到,那么应该可以做到。否则,如果窗口不相关,那么它们可能应该有各自的私有逻辑设备(甚至实例)。

    顺便说一句,使用 Vulkan 绘制到多个窗口的资源似乎相当稀缺

    Vulkan 的大量资源“稀缺”。那是因为 Vulkan 就像一个乐高积木。一旦你知道了各个部分的作用,那么你就可以在不需要外部帮助的情况下构建任何东西。绘制到多个窗口与绘制到单个窗口没有什么不同,除非你多次这样做。

    【讨论】:

    • 所以,如果我理解正确,如果我不是针对 Windows,那么我可能需要为每个窗口创建一个物理设备。我可能不明白为什么,但我至少可以继续假设,如果创建 vulkan 对象需要一个特定的表面,那么该对象可能会因平台而异,但是在什么情况下我需要让每个窗口都有自己的私有逻辑设备或实例?会不会只在某些窗口使用其他窗口不需要的功能的情况下?
    • @Ryoku 我认为在 Android 和带有 Xinerama 的现代桌面 Linux 发行版上也应该不是问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多