【发布时间】:2019-12-09 15:10:46
【问题描述】:
我对 Vulkan 中的立体 3D 有一些困惑。
VK_KHR_multiview 有什么用?如果我只使用计算着色器渲染图像,是否有必要呈现 3D 视觉?
必须启用哪些必要的扩展(设备和实例)才能呈现 3D 图像?我需要查询和创建什么?并按什么顺序?
“multiViewport”物理设备功能是什么意思?
【问题讨论】:
我对 Vulkan 中的立体 3D 有一些困惑。
VK_KHR_multiview 有什么用?如果我只使用计算着色器渲染图像,是否有必要呈现 3D 视觉?
必须启用哪些必要的扩展(设备和实例)才能呈现 3D 图像?我需要查询和创建什么?并按什么顺序?
“multiViewport”物理设备功能是什么意思?
【问题讨论】:
VK_KHR_multiview 用于在单个渲染过程中呈现来自同一组命令的两个视图,而不必设置两个渲染过程和两组命令。它通过附加到pNext 的扩展结构来实现这一点,特别是VkRenderPassMultiviewCreateInfoKHR,附加到VkRenderPassCreateInfo。
这更清楚地解释了这个扩展提供了什么:
当您将
VkRenderPassMultiviewCreateInfo连接到VkRenderPassCreateInfo- 你告诉 Vulkan 你想 执行你的管道两次(或更多 - 取决于数量 查看VkRenderPassMultiviewCreateInfo中设置的掩码,但我们正在讨论 这里是关于 VR 的)。这两个执行之间只有两个区别:
gl_ViewIndex变量在每次运行时具有不同的值(0 或 1) - 您可以将其用作制服的索引以检索特定相机 每只眼睛的矩阵渲染结果转到附件的不同层(第 0 层或第 1 层)
如果您已经通过计算着色器完成此操作,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 的演示将这两层渲染为一个交换链图像( 因为他使用单个输出图像)
您可以类似地渲染它,但使用两个图像作为输出 附件 - 使用两个输出附件创建两个渲染通道, 使用纹理数组作为输入存储图像(或组合图像采样器 如果想重新调整结果)
您可以将纹理数组中的结果复制到您的图像中 使用
vkCmdCopyImage或vkCmdBlitImage(如果你想重新调整 结果)。你可以创建两个
VkImages别名相同的内存,即 图像数组正在使用
multiViewport物理设备特性定义如下:
multiViewport指定是否支持多个视口。 如果未启用此功能:
viewportCount和scissorCount成员VkPipelineViewportStateCreateInfo结构必须设置为 1。
firstViewport和viewportCount参数到vkCmdSetViewportcommand 必须分别设置为 0 和 1。
firstScissor和scissorCount参数到vkCmdSetScissorcommand 必须分别设置为 0 和 1。
exclusiveScissorCount成员VkPipelineViewportExclusiveScissorStateCreateInfoNV结构必须是 设置为 0 或 1。
firstExclusiveScissor和exclusiveScissorCount参数vkCmdSetExclusiveScissorNV命令必须设置为 0 和 1, 分别。
这基本上只是说明物理设备是否支持多个视口。
【讨论】: