关于Vulkan多视图(立体3D)功能的说明

关于Vulkan多视图(立体3D)功能的说明,3d,vulkan,3d,Vulkan,我对Vulkan中的立体3D有一些困惑 VK_KHR_multiview有什么用途?如果我只使用计算着色器渲染图像,是否有必要显示3D视觉 必须启用哪些必要的扩展(设备和实例)才能显示三维图像?我需要查询和创建什么?按什么顺序 “多视口”物理设备功能的含义是什么 用于在单个渲染过程中显示来自同一组命令的两个视图,而不必设置两个渲染过程和两组命令。它通过附加到的pNext的扩展结构来实现这一点,特别是附加到的 这更清楚地解释了此扩展提供的功能: 当您将VkRenderPassMultiviewCr

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

  • VK_KHR_multiview有什么用途?如果我只使用计算着色器渲染图像,是否有必要显示3D视觉

  • 必须启用哪些必要的扩展(设备和实例)才能显示三维图像?我需要查询和创建什么?按什么顺序

  • “多视口”物理设备功能的含义是什么

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

    这更清楚地解释了此扩展提供的功能:

    当您将
    VkRenderPassMultiviewCreateInfo
    连接到
    VkRenderPassCreateInfo
    -您正在告诉Vulkan您想要 执行管道两次(或更多-取决于管道的数量) 查看在
    VkRenderPassMultiviewCreateInfo
    中设置的遮罩,但我们正在讨论 关于虚拟现实)

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

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

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

    如果您已经通过计算着色器实现了这一点,
    VK\u KHR\u multiview
    将不会真正起到帮助作用,除非您使用的是renderpass

    从示例中,似乎需要以下扩展:

    • 显然
      VK\u KHR\u多视图
      设备扩展(通过
      VK\u KHR\u多视图扩展名
    • VK\u KHR\u GET\u PHYSICAL\u DEVICE\u PROPERTIES\u 2\u EXTENSION\u NAME
      ,用于
      VK\u KHR\u GET\u PHYSICAL\u DEVICE\u PROPERTIES 2
      (实例扩展)。这将启用多视图功能的查询
    此外,还需要使用以下工具修改GLSL多视图顶点着色器:

     #extension GL_EXT_multiview : enable
    
    要使用
    gl_ViewIndex
    请参阅,以获取显示此属性的Sascha Willems着色器,请参阅以获取扩展文档

    除此之外,您只需要渲染多个图像(如Saschas示例所示)。从最初的reddit帖子中可以看出,有多种方法可以实现这一点:

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

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

    • 您可以将结果从纹理数组复制到图像中 使用
      vkCmdCopyImage
      VKCMDBLTIMAGE
      (如果要重新缩放 结果)

    • 您可以创建两个别名为相同内存的
      VkImages
      ,该 图像阵列正在使用

    物理设备功能定义如下:

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

    • 视口计数
      剪刀计数
      成员
      VkPipelineViewportStateCreateInfo结构必须设置为1

    • firstViewport
      viewportCount
      参数添加到
      vkCmdSetViewport
      命令必须分别设置为0和1

    • firstScissor
      scissorCount
      参数添加到
      vkCmdSetScissor
      命令必须分别设置为0和1

    • 公司的
      排他性ISSORCOUNT
      成员
      VkPipelineViewportExclusiveScissorStateCreateInfoNV
      结构必须为 设置为0或1

    • firstExclusiveSissor
      ExclusiveSissOrCount
      参数添加到
      vkCmdSetExclusiveScissorNV
      命令必须设置为0和1, 分别

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