查看原文
其他

Unity 2019.3为移动VR设备提供Vulkan支持

李鹏鹏 Unity官方平台 2022-05-07

虽然移动VR从一开始就将OpenGL ES作为图形API,但Vulkan具备更大的灵活性和更低的渲染负载,所以现在大多数开发者已经将目光转向Vulkan API。这也意味着Vulkan或将替代OpenGL ES成为VR渲染新的跨平台标准。

本文将为大家介绍Vulkan相较于GL有哪些优势;Unity 2019.3为移动VR设备提供了哪些Vulkan扩展支持;Unity 2019.3中开发者如何为Oculus Quest启用Vulkan以及在URP中使用Vulkan的事项等相关内容。


最新上线的Unity 2019.3版本中带来了超过260项功能的改进,其中就有为移动VR设备提供Vulkan支持这一项。

在此之前,我们先来谈谈Vulkan!正如并行性和多线程编程为多核CPU的性能提升铺平了道路一样,Vulkan作为全新的图形API ,OpenGL 的替代者,也着手打造一个多线程、跨平台的GPU编程和高性能渲染的未来。

Vulkan相比较于GL的优势在哪里?
与OpenGL ES相比,Vulkan的主要优势在于速度。Vulkan旨在通过允许应用程序在多个线程中并行构建命令列表来利用多个CPU内核。这使应用程序可以利用设备上的所有CPU内核,从而提高性能。Vulkan增加速度的同时,降低驱动、CPU负担,不仅功耗有了明显的降低而且画质也有提升。


即使在单个线程中运行渲染器,也可以看到很大的性能提升。在一项内部基准测试中,发现与OpenGL ES 3.1渲染器相比,Android的帧率提高了35% ,即使它们都在单个渲染线程中运行。

Unity 2019.3为移动VR设备提供了哪些Vulkan扩展支持?


1、支持多重采样抗锯齿(Multi-sampling Anti-aliasing;MSAA)

与PC显卡不同,移动芯片集的MSAA是由Tiler执行MASS操作,然后当Tile完成时进行解析(将所有子样本平均到最终像素),再将其结果存储到主存储器。由于从Tile内存到一般内存的带宽是非MSAA,这允许我们以接近与非MSAA相同的速度运行MSAA帧缓冲器。这对VR非常重要,因为每个眼睛的像素非常低,会产生明显的边缘锯齿。


对于OpenGL ES,这是通过使用MSAA帧缓冲区将其渲染到非MSAA纹理来完成。这种方式尽管有效,但由于其隐式性质,同时也带来了一系列的问题。我在实际项目中就遇到过这样的问题,由于不清楚硬件具体是否支持MSAA以及最大能支持到多少,而引起的一些渲染问题。

但是在Vulkan中,一切都将显现出来。

每个子通道包含pColorAttachments、pDepthStencilAttachment、pResolveAttachments的vkSubpassDescription结构定义。一个优秀的Vulkan应用程序应该通过附着4x MSAA缓冲区来设置MSAA,这将减轻CPU 的负担,使应用软件能够更快速的被处理。并且将其用于颜色/深度附件中的颜色和深度,以及pResolveAttachment中的非MSAA颜色缓冲区。

应用程序同时应该将pColorAttachments及pDepthStencilAttachment storeOperations设置为VK_ATTACHMENT_STORE_OP_DONT_CARE。这将告诉驱动:“以后不会要求这种颜色或深度,请不要将它们存储在Tile内存中并丢弃它们”。

2、支持多视图(Multiview)

Multiview这个扩展允许GPU驱动程序在纹理数组的N个不同的切片(slice)执行N次绘制调用。它在VR中通过单次绘制调用来在2-deep纹理阵列绘制左眼和右眼。Vulkan通过VK_KHR_Multiview扩展提供支持。它需要颜色,深度和解析图像为2D Array而非2D,并且需要将VkRenderPassMultiviewCreateInfo结构添加到要通过Multiview执行的渲染通道。它支持多个子通道。renderdoc管道状态图片(与上面相同)展示了具有2个视图的多视图捕获(一个用于左眼,一个用于右眼)。VkRenderPassMultiviewCreateInfo有一个pViewMasks参数,其要求对多视图的视图数进行按位掩码。对于viewMask[0]值为0b11,双视图系统要求bit0和bit1为真。运行本身支持纹理数组作为时间扭曲合成的输入纹理。开发者应该使用VRAPI_TEXTURE_TYPE_2D_ARRAY枚举创建纹理,而非渲染到多视图缓冲区,然后再手动将它们复制到非多视图图像并发送到VR API 。

3、支持固定注视点渲染(Fixed Foveated Rendering;FFR)

FFR是一种应用于帧缓冲区的渲染设置可以显著的提高VR图像质量,因为它会修改GPU计算帧的方式,同时不会以任何方式影响纹理。从开发者的角度来看,由于两个FFR API之间存在较大的架构差异,所以GL和Vulkan之间的FFR非常不同。首先,因为它是基于VRAPI修改颜色纹理元数据,所以每个预通道(不会渲染到颜色纹理中)都不是根据注视点进行。现在没有太大问题,因为我们的大多数应用程序都是单通道,如果开发者希望启用诸如HDR管道时,情况可能会发生改变。其次,QCOM有一个硬编码的注视点功能模型,它不允许我们根据视场和透镜来选择我们真正想要的分辨率曲线。通过引入VK_EXT_fragment_density_map扩展,而Vulkan完全修复了这个问题。

另外由于Vulkan更贴近硬件与降低CPU的负担也有助于缓解VR设备上的电力和发热问题。

在Unity 2019.3中开发者如何为Quest启用Vulkan支持的?

Unity 2019.3正在转向新的XR Management模型。当结合使用Oculus XR Plugin和XR Plugin Management系统时,2019.3以后将仅提供Vulkan支持。要启用Vulkan,你需要对设置进行一定的改动,并且现有项目应该能够轻松转换为新的XR Management系统。


首先,请导航至Package Manager,并确保未安装“Oculus Android”软件包。接下来,在Project Settings下转到“XR Plugin Management”。确保选择Android选项卡。安装“Oculus XR Plugin”,并在“Plugin Providers”区域选择“Oculus Loader”。最后,要配置特定于Oculus的设置,请导航至“Oculus”选项卡(下图左下角)。


然后要启用Vulkan支持,请打开“Player Settings…”,转到“Other Settings”窗格,然后清除“自动图形API”复选框。你会看到有序的图形API列表供您选择。如果Vulkan不在该列表中,请单击列表底部的“ +”号将其添加。

最后将Vulkan拖动到列表中的第一项,以便在受支持的任何时候都可以使用它,完成了!你所有现有的着色器都将转换为Vulkan SPIR-V(除非已通过#pragma only_renderers或类似功能特别禁用)。

将Vulkan与Universal Render Pipeline一起使用

URP相比,当前使用Unity内置渲染管线的Quest开发人员数量众多。所以URP功能会稍微落后于内置RP功能,所以,目前URP与Vulkan的使用还不完全稳定。但是,Unity会将URP视为未来发展的重中之重,并且会在接下来的几个月中逐渐完善,帮助开发者们可以更稳定地用Vulkan来使用URP。

在此前的2月系列直播中,我们曾开设了一场以《如何通过Unity使用Vulkan API & 移动端Vulkan GPU 大PK》为主题的直播,感兴趣的小伙伴可关注B站:Unity官方观看、回顾。

-END-

Unity Learn Premium旨在为广大开发者、创作者提供更为广泛、更为全面、更有针对性的学习资源。成为Premium用户之后,将能够获得Unity与Pluralsight合作的明星系列课程《持剑勇士》开发(Unity Game Dev Course)、Unity与Oculus合作的VR课程《Design, Develop, and Deploy for VR》等优质学习内容。


针对大中华区用户,Unity Learn Premium 4个月免费使用权益将持续至5月底。



点击关键词
获取更多信息

2019.3 
Hololens 2 | ML-Agents
 地形工具 Made With Unity |HDRP
Visual Effect Graph像素风 | 《Boat Attack》

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存