【问题标题】:Clarification on Vulkan multiview (stereoscopic 3D) featuresVulkan 多视图(立体 3D)功能的说明
【发布时间】:2019-12-09 15:10:46
【问题描述】:

我对 Vulkan 中的立体 3D 有一些困惑。

  1. VK_KHR_multiview 有什么用?如果我只使用计算着色器渲染图像,是否有必要呈现 3D 视觉?

  2. 必须启用哪些必要的扩展(设备和实例)才能呈现 3D 图像?我需要查询和创建什么?并按什么顺序?

  3. “multiViewport”物理设备功能是什么意思?

【问题讨论】:

    标签: 3d vulkan


    【解决方案1】:

    VK_KHR_multiview 用于在单个渲染过程中呈现来自同一组命令的两个视图,而不必设置两个渲染过程和两组命令。它通过附加到pNext 的扩展结构来实现这一点,特别是VkRenderPassMultiviewCreateInfoKHR,附加到VkRenderPassCreateInfo

    这更清楚地解释了这个扩展提供了什么:

    当您将VkRenderPassMultiviewCreateInfo 连接到 VkRenderPassCreateInfo - 你告诉 Vulkan 你想 执行你的管道两次(或更多 - 取决于数量 查看VkRenderPassMultiviewCreateInfo 中设置的掩码,但我们正在讨论 这里是关于 VR 的)。

    这两个执行之间只有两个区别:

    • gl_ViewIndex 变量在每次运行时具有不同的值(0 或 1) - 您可以将其用作制服的索引以检索特定相机 每只眼睛的矩阵

    • 渲染结果转到附件的不同层(第 0 层或第 1 层)

    source

    如果您已经通过计算着色器完成此操作,VK_KHR_multiview 并不会真正提供帮助,除非您使用的是渲染通道。

    Sascha Williems 示例看来,需要以下扩展:

    • 显然是VK_KHR_multiview 设备扩展(通过VK_KHR_MULTIVIEW_EXTENSION_NAME
    • VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,用于VK_KHR_get_physical_device_properties2(实例扩展)。这将启用多视图功能的查询。

    此外,您需要修改 GLSL 多视图顶点着色器:

     #extension GL_EXT_multiview : enable
    

    要使用gl_ViewIndex,请参阅here 了解显示此内容的 Sascha Willems 着色器,请参阅here 了解扩展文档。

    除此设置外,您只需要渲染到多个图像(如 Saschas 示例所示)。正如在原始 reddit 帖子中看到的,有多种方法可以实现这一点:

    Sascha 的演示将这两层渲染为一个交换链图像( 因为他使用单个输出图像)

    • 您可以类似地渲染它,但使用两个图像作为输出 附件 - 使用两个输出附件创建两个渲染通道, 使用纹理数组作为输入存储图像(或组合图像采样器 如果想重新调整结果)

    • 您可以将纹理数组中的结果复制到您的图像中 使用vkCmdCopyImagevkCmdBlitImage(如果你想重新调整 结果)。

    • 你可以创建两个 VkImages 别名相同的内存,即 图像数组正在使用

    multiViewport物理设备特性定义如下:

    multiViewport 指定是否支持多个视口。 如果未启用此功能:

    • viewportCountscissorCount 成员 VkPipelineViewportStateCreateInfo 结构必须设置为 1。

    • firstViewportviewportCount 参数到 vkCmdSetViewport command 必须分别设置为 0 和 1。

    • firstScissorscissorCount 参数到 vkCmdSetScissor command 必须分别设置为 0 和 1。

    • exclusiveScissorCount 成员 VkPipelineViewportExclusiveScissorStateCreateInfoNV 结构必须是 设置为 0 或 1。

    • firstExclusiveScissorexclusiveScissorCount 参数 vkCmdSetExclusiveScissorNV 命令必须设置为 0 和 1, 分别。

    这基本上只是说明物理设备是否支持多个视口。

    【讨论】:

      猜你喜欢
      • 2020-07-08
      • 2022-11-01
      • 1970-01-01
      • 2016-10-03
      • 1970-01-01
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      相关资源
      最近更新 更多