Vulkan学习例子015: vulkan_015_multiview 多视口渲染
多视口渲染的意义在于:
一次渲染,对Vulkan来说也就是一次指令的录制,可以同时渲染到多个视口(Viewport),好处是DrawCall的减少,渲染性能的提升。因此尤其适合VR这种需要左右眼渲染两次(左右眼作为摄像机导致其视区变换矩阵,投影矩阵又不一致)的应用。
实现多视口渲染需要添加如下的instance以及device的扩展:
- 实例扩展VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME
- 设备扩展VK_KHR_MULTIVIEW_EXTENSION_NAME
设置创建Vulkan设备时VK_KHR_multiview的扩展,从而支持多视口渲染。
该例子实现流程如下:
启动时的MultiView扩展设置
常规渲染的物体都使用第一个RenderPass渲染到对应创建的Framebuffer,Image(Color/Depth)中,这部分的组织,渲染与vulkan_014_multirenderpass例子大致的流程基本一致,可以参考。
不同点在于,此时对应于有几个View,我们需要使用几个Image(Color/Depth)来存储渲染结果,因此区别于vulkan_014_multirenderpass例子,此处需要使用ImageArray来对应不同的View的渲染结果。
VkRenderPass创建的不同
传入UniformBuffer的不同
由于多视口渲染因此View/Proj变换矩阵不一样,当然还可能其他参数也有所不同,我们的例子只设置View/Proj变换矩阵的不一样。
使用第二个RenderPass把第一个RenderPass的Color渲染到最终的Framebuffer中并渲染到屏幕上,与例子vulkan_014_multirenderpass不同的是,本例不再使用四边形来进行Copy,采用了无顶点输入的渲染。
多视口渲染常用于VR,AR,视频多路实时显示等应用场合,掌握其关键核心知识,API后,实现各种不同的扩展应用,实际需求将是非常简单的。
注意:上述HTML代码仅为对原文内容的简化处理,可能在某些细节上与原文有所差异。