我对Vulkan的立体3D有一些困惑。
-
vk_khr_multiview的用途是什么?如果我仅使用计算着色器渲染图像,是否有必要呈现3D视觉?
-
必须启用3D图像的必要扩展(设备和instanes(?我需要查询什么?按什么顺序?
-
" 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图像( 因为他使用单个输出图像(
您可以类似地渲染,但使用两个图像作为输出 附件 - 创建两个带有两个输出附件的渲染通道, 使用纹理阵列作为输入存储图像(或组合图像采样器 如果要重新列出结果(
您可以将结果从纹理阵列复制到图像 使用
vkCmdCopyImage
或vkCmdBlitImage
(如果您想重新销售 结果(。您可以创建两个
VkImages
,这些 CC_17与同一内存相同,即 图像阵列正在使用
多维视图物理设备功能定义为以下方式:
multiViewport
指定是否支持一个以上的视口。 如果未启用此功能:
viewportCount
和scissorCount
成员VkPipelineViewportStateCreateInfo
结构必须设置为1。
firstViewport
和viewportCount
参数到vkCmdSetViewport
命令必须分别设置为0和1。
firstScissor
和scissorCount
参数到vkCmdSetScissor
命令必须分别设置为0和1。
exclusiveScissorCount
成员VkPipelineViewportExclusiveScissorStateCreateInfoNV
结构必须是 设置为0或1。
VkRenderPassMultiviewCreateInfoKHR
0和exclusiveScissorCount
参数vkCmdSetExclusiveScissorNV
命令必须设置为0和1, 分别。
基本上只是说出多个视图端口是否由物理设备支持。