Unity一直致力于帮开发者扫除障碍、拓宽平台,最大程度激发创意。
苹果全球开发者大会上公布了Unity将作为visionOS的原生合作方,这意味着Unity将作为强大的空间体验创作工具,助力开发者们为Apple Vision Pro开发原生visionOS游戏及应用。在Unity技术开放日北京站技术专场中,Unity中国XR产品技术总监 Pengpeng. Li 分享了Unity通用渲染管线最新功能,以及Unity最新的XR开发者工具将如何支持开发者们打造移动头显上高性能、高品质的内容体验。
我分享的主要内容除了对Unity URP亮眼新功能比如APV、TAA等功能进行介绍,也会介绍大家关注的Unity XR最新进展,以及Unity在XR开发工具所新增的功能,与渲染管线中针对XR优化的内容。
Unity通用渲染管线(URP)
通用渲染管线URP是Unity开发预构建的一个可编程渲染管线。URP除了提供对美术等艺术家友好的工作流程之外,可以让开发者在移动平台、高端游戏主机、PC等平台上快速轻松地创建高质量、高性能的画面效果。UPR是一个开箱即用的渲染管线模板,可以直接使用它来构建你的游戏和应用。除此之外,URP的源代码是公开的,可以在此基础上构建和扩展。
URP除了提供友好的工作流程外,它的一大核心是支持了Unity所支持的所有超过20多个平台,包括移动设备、PC等,每次URP推出新功能已经确定这个功能针对所有平台进行了相应的优化,可以放心使用。
通用渲染管线URP不仅支持多种平台,还支持多种不同游戏风格。URP附带三种开箱即用渲染解决方案——为所有支持平台提供简化的材质和照明工作流程的前向渲染器、针对移动设备进行优化,支持海量光照的延迟渲染管线,以及在2D游戏上提供出色的实时光源效果与画面效果的2D渲染器。
此外,URP允许用户通过编写Renderer Feature渲染器功能,来扩展现有的渲染器,并支持创建完全自定义的渲染管线,这也是与传统渲染管线不同的地方。当需要制作一款在极低端手机上运行的速度比较快的无光照游戏时,就可以启用少量功能获得极简管道。另一方面,当启用所有功能,并且有的场景需要它的时候,就可以获得一个支持复杂效果、基于物理渲染的渲染管线。
这里列举了一些使用URP构建的具有独特画面风格的游戏,并且这些游戏都在不同的平台上完美运行了,包括Windows、PS4、PS5、XBOX ONE等。
接下来简单介绍URP亮眼的新功能以及使用方法。
第一个是贴花系统。通过帖花渲染器的功能Decals Renderer Feature,Unity可以将特定的材料或贴花投射到场景中其他物体上,这些贴花会依附在Mesh上,可以跟场景中的光照交互。我们可以通过贴花系统为场景的物体表面上添加细节图案,比如FPS游戏中的弹孔,或场景中地板上的污渍,或车身涂鸦效果。
创建一个高质量的贴花系统并不是一件容易的事情,因为贴花系统最佳解决方案与渲染逻辑密切相关,URP12.0和以上版本中将贴花在Renderer Feature中进行了完全模块化的实现,并且实现了贴花投影(Decals Projector)、贴花网格以及贴花着色器(Decal Shader Graph),极大提高了开发者创作贴花的效率。
除了静态细节之外,我们还可以向场景中物体表面增加动态细节,如动态贴图效果,并且URP的Decal System支持给物体表面添加基于物理的照明,比如用贴花模拟聚光灯的体积光的效果。
接下来通过一个案例给大家演示如何在URP中使用Decal system。找到对应的渲染器,在渲染器上增加一个Decal Feature。这里将它切换成Decals模式,在Renderer场景下创建一个URP的Decal Projector。然后在Decals目录下创建一个材质。Shader需要修改成Shader Graph下面的Decals,将对应的贴图放到贴图这个地方,把对应的材质附着在Decals Projector这个组件上,现在就可以在这个场景中调整一下,这就是贴花的一个简单应用。
由于URP涵盖的平台非常广泛,所以Unity推出两种不同的贴花解决方案,用户可以根据平台选择不同质量或性能的方案。
第一种是Screenspace decals(屏幕空间贴花),通过在不透明对象之后渲染贴花作为额外的渲染通道来工作。屏幕空间贴花解决方案虽然在视觉上比较有限,但是它非常适合移动设备。
另外一种贴花解决方案是贴花缓冲区Dbuffer解决方案,Unity将贴花渲染到Dbuffer上,然后在渲染不透明对象期间将DBuffer的内容覆盖在不透明对象之上。DBuffer 贴花技术需要Depth Normal Prepass,这使得贴花缓冲区技术在实现 基于tile的渲染的GPU上效率较低。所以它不适合移动平台,比较适合PC和Console平台。目前高清渲染管线HDRP就采用这种贴花解决方案。
URP支持材质的GPU实例化。如果场景中的贴花使用了相同的材质,并且材质启用了GPU实例化属性,那么URP会实例化材质,并减少对性能的影响。我们尝试在项目中开启所有贴花材质的GPU实例,通过对比,窗口的合并数量和渲染线程节省的时间都有了一个明显的提升。另外,URP Decal System采用了类似ECS实现方式,所以在使用URP 贴花系统时如果和 jobify 和 burst 一起使用效果会更好。
我们来看一个简单的性能测试,在场景中创建1万个Decals贴花,使用Burst前后进行性能对比。通过Profiler中的数据可以明显看到,使用Burst后对应函数消耗变少,帧率也得到了提升,并且更加稳定,很少有毛刺。
另外,Decals系统实现了对Decals Layer贴花层的支持,可以指定特定的贴花显示在特定的材质上。
URP的Decals system目前不能在透明表面上起作用,但是这个功能已经在HDRP中实现了,所以我们的计划是将HDRP贴花系统的方案移植到URP中,使它满足URP对设备的友好性。
在抗锯齿部分,我们也有一个新功能,是将运动矢量添加到URP,使得我们可以进行时域抗锯齿(TAA)。这种抗锯齿技术类似于MSAA,它使用多个样本确定像素的颜色,不同之处在于这些样本会随着时间累计,而不是在单帧内采样,使得TAA很多情况下比MSAA更便宜、效果更好。
这个例子,这个资源是在Unity资源商店上的一个车辆资源,我们把它导入URP工程中时会发现它有很多锯齿,尤其是在汽车边缘处或者车门接缝处锯齿比较严重。
我们尝试降低锯齿效果。在开始之前先来做一个步骤,真实场景中的汽车车门接缝处是暗黑色的,我们在Unity项目中也把车门接缝处调暗,避免不必要的流光。经过这个操作以后,我们再尝试打开TAA。首先选择相机,在抗锯齿部分选择TAA选项,因为我要把这个项目运行在VR设备上,所以选择的是最低质量的TAA。这里我还将反射探针的强度降低到了75%,因为有一些锯齿可能是因为高光效果产生的,我们看下最终抗锯齿的效果,这就是使用TAA做的抗锯齿演示。
接下来我们谈一下URP中新增的“APV(Adaptive Probe Volumes)”自适应探针体系系统。APV是对现有系统Light Probe Groups的发展与延伸,目标是简化工作流程、减少迭代时间、提高视觉质量,并且未来为全局光照提供新功能。虽然APV机制与Light Probe Group相同,但其质量和工作量与传统照明系统有很大差别。
介绍APV之前,先来回顾一下传统的Light Probe Group工作流程。传统的Light Probe Group网络必须手动放置,这是一项相当繁琐的工作。为了增加光照细节,需要把探头放在明暗对比强烈的地方,这些都需要手动设置。
APV探针体积是Unity 根据场景中的几何体密度自动放置的一组光照探针,用于创建烘焙的间接光照,使用探针体积意味着您无需花时间手动放置和配置光照探针,可以减少迭代时间。除此之外,APV是按像素而不是按对象选择探针。我们来对比一下,左边的场景使用原始的光照探针,其中逐对象的光照意味着汽车的每个部分都是均匀的,光照不能很好地从亮过渡到暗;右场景使用APV。而APV是逐像素而不是按对象选择周围的探针,这意味着APV可以更准确地照亮对象,产生比较自然的过渡效果。
在汽车车漆最外层有层透明的清漆,不仅反光非常强,并且遵循菲涅尔效果,就是视线与物体完全垂直时,反射最弱,当视线与物体表面的夹角越小,反射越强;使用Clear Coat清漆效果可以显著提升汽车的整体外观。
如何在URP中打开Clear Coat呢?首先,创建URP下面的复杂Shader,它有Clear Coat的选项,把它勾选,然后调整参数就OK了。
另外一个比较亮眼的技术是LOD cross-Fade,即LOD的淡入淡出。LOD是一种减少渲染远距离Mesh网格所需GPU成本的技术。LOD技术(level of detail)被称作多层次细节,它的原理是模型物体在场景中根据距离相机的远近来显示不同细节程度的模型,距离渐近时,显示细节程度较高的模型,距离渐远时,显示细节程度较低的模型,从而节省性能的开销。
LOD淡入淡出会根据对象到相机的距离,在高模和低模之间更平滑过渡混合,避免在交换期间发生比较刺耳的弹出。LOD cross-Fade分为两种模式,分别是Time-Based Fading和基于距离淡入淡出的效果Distance-based Fading。目前这个功能可以在URP 14.0的版本中体验。
右图是开启LOD淡入淡出的效果,左图是关闭的,左图随着摄像机距离变化时,陶罐的模型有一个明显的弹出,右图开启LOD淡入淡出感非常好。
怎么开启LOD cross-Fade?我们只需要在LOD的Group中选中Fade Mode,代表我们启用了随时间淡出的模式,LOD模型在切换后会在一定时间内淡出。
另外,淡入淡出的时间也可以通过API进行调整,它的默认时间是0.5,这块我们可以自定义。
那么到底应该使用Time-Based Fading?还是使用基于距离的方法?个人认为,如果更关心外观,可以使用基于距离的LOD淡入淡出方法;如果更加关心性能,就应该使用Time-Based基于时间的方法。
另外,URP中还有几个用于LOD淡入淡出的选项。有一个名为“LOD Cross Fade”的开关,这个开关是默认是打开;还有一个选项可以选择“抖动类型”—— Bayer Matrix 拜耳矩阵和Blue Noise 蓝噪声。其中蓝噪声是一种使用噪声模式的抖动算法,负载相对比较高。蓝噪声需要蓝噪声纹理,因此需要额外的纹理查找,没有实时计算蓝噪声的好方法。因此,拜耳矩阵抖动通常性能更高。
Unity XR
2023年对XR来说是难以置信的一年,硬件朝着振奋人心的方向发展,还有视频直通、手部追踪、眼动追踪等新功能,有望为XR创作者解锁一套全新的框架交互机制,为客户和玩家带来更加沉浸的体验。Unity计划与不断发展的XR生态系统一起继续创新,为XR开发人员提供最好的工具,让他们在AR/VR或者新兴的MR空间中创作更多引人入胜的游戏与应用。XR跨平台一直是为客户提供最大选择和灵活性的关键,这也是为什么我们优先构建API抽象和功能,而不是快速变化的平台API和功能。基于构建的API抽象,我们搭建了Unity的XR插件架构,我们在此方面投入了大量资金、人力来支持各种XR硬件平台集成到我们的XR架构中。
到目前为止,Unity支持所有主流的XR设备,比如手持平台包括适用于 iOS 的 ARKit,适用于Android 的 ARCore、Magic Leap等等,包括国内的YVR、PICO,以及 Meta’s Quest(包括最近发布的 Meta Quest Pro)和PlayStation®VR 等高端的 VR 头显,以及前几天刚发布的苹果的Vision Pro 。
除此之外,我们还支持不断发展的OpenXR的标准,使开发者使用更多头戴式设备吸引更多玩家用户。在我们致力于减少设备和SDK 层的碎片化的同时,我们也意识到在输入管理、传感器数据、测试和迭代时间方面不断增加的碎片化和挑战。为了应对这些挑战,我们也在继续构建、更新迭代我们的XR开发者工具AR Foundation和 XRI Toolkit。
接下来介绍XR Interaction Tookit,它是一个基于组件的高级交互系统,主要用于创建AR/VR的体验。它提供了一个通用的交互框架并简化了跨平台创建。XRI这个包允许你快速创建添加比如可抓取对象、运动系统、UGUI交互等。经过XR团队长期积累和技术迭代,XRI已经很成熟了,XR内置丰富的AR/VR开发过程中基本的功能。在今年3月初,XRI2.3版本中添加了3个主要功能,包括眼动追踪和手部追踪,以及用于在编辑器中进行测试的设备模拟器改进版。
通过一则视频演示XRI2.3版本中的基本功能。玩家可以与3DUI进行更加流畅的交互、抓取对象,还添加了双手交互的效果。
接下来介绍XRI的新功能和使用,首先,注视交互也叫凝视交互,目前HoloLens 2、Meta Quest Pro 和 PlayStation® VR2 等新头戴设备包含用于跟踪用户注视位置的传感器,基于注视或凝视的交互方式可以帮助我们构建更加自然的XRI应用。为了支持这种类型的交互,我们引入了XR Gaze Interactor,即XR注视交互器,它是由眼睛注视或者头部注视姿势驱动,例如通过注视停留在可交互对象如 3D 或 UI 组件上进行交互动作。
除此之外我们还通过XR Interactable Snap Volume引入了一种额外的交互辅助形式,该组件是对XR Gaze Interactor 凝视交互器的补充。我们通常不建议完全使用眼睛控制应用程序,因此引入Interactable Snap Volume这样一种额外形式的控制器和基于手的交互辅助来帮助用户选择特定对象。比如,当视线瞄准对象周围区域时,它会将交互捕捉到附近的可交互对象上来。
在与XRI2.3版本一起,我们在预发行版本中提供了Unity XR Hands这样一个包。Unity XR Hands是一个新的XR次级系统,它添加了在Unity中取用手部跟踪的API。目前它只对OpenXR进行支持,很快还会支持Meta类的平台。另外,XRI2.3还支持XR Poke交互器,它会允许与3DUI或者UGUI画布元素上使用手和控制器进行戳戳动作效果。
怎么使用Unity XR Hands?首先打开Package Manager,然后选择install Package by name 按名称添加安装XR Hands Package,这里需要注意的是要使用Unity 2021.2+以及以上版本。要在设备上使用 XR Hands,还需要安装一个特定硬件的provider 插件包。完成之后还要进行下一步设置,用Quest构建的话,要启用Meta Quest Support,还要启用Meta Hand Tacking Aim,然后在同一个窗口中添加一个交互配置文件,例如Oculus Touch controller Profile,来获得对控制器的支持。
另外一个新功能是优化版的XR设备模拟器。在头显测试XR应用程序很重要,但Build在头显上测试很耗时,Unity XR设备模拟器允许开发者在编辑器中进行测试,有助于减少XR开发迭代的时间,也可以让开发者在不戴头显的情况下进行开发。在新版本中,XR团队优化了XR Device Simulator,其中包括一个新的屏幕UI小组件,从而允许你更容易查看哪些输入目前处于Active状态。
那么怎么去使用呢?可以找到XR Interaction Tookit,然后导入XR Device Simulator,导入进去之后,我们在项目目录上找到XR device Simulator,把它拖拽到场景中,点击play就可以运行了。