VULKAN多视图(立体3D)功能的澄清



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

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

  2. 必须启用3D图像的必要扩展(设备和instanes(?我需要查询什么?按什么顺序?

  3. " MultiviewPort"物理设备功能的含义是什么?

VK_KHR_multiview用于在单个渲染通过中从同一组命令中展示两个视图,而不必设置两个渲染通行证和两组命令。它通过您连接到VkRenderPassCreateInfo附加的pNext的扩展结构来执行此操作。

这对此扩展提供了更清晰的解释:

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

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

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

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

来源

如果您已经通过计算着色器完成了此操作,则除非您使用RenderPass,否则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多视Vertex着色器。

 #extension GL_EXT_multiview : enable

要使用gl_ViewIndex请参阅此处的Sascha Willems着色器,请参见此处,请参阅此处的扩展文档。

设置之外,您只需要渲染到多个图像(如Saschas示例所示(。正如原始的Reddit帖子中看到的那样,有多种方法可以实现这一目标:

sascha的演示将这两层变成单个Swapchain图像( 因为他使用单个输出图像(

  • 您可以类似地渲染,但使用两个图像作为输出 附件 - 创建两个带有两个输出附件的渲染通道, 使用纹理阵列作为输入存储图像(或组合图像采样器 如果要重新列出结果(

  • 您可以将结果从纹理阵列复制到图像 使用vkCmdCopyImagevkCmdBlitImage(如果您想重新销售 结果(。

  • 您可以创建两个VkImages,这些 CC_17与同一内存相同,即 图像阵列正在使用

多维视图物理设备功能定义为以下方式:

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

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

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

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

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

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

基本上只是说出多个视图端口是否由物理设备支持。

最新更新