欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

深度解析虚幻渲染技术系列(15):XR领域的实操探究

最编程 2024-07-22 16:49:16
...

目录
  • 15.1 本篇概述
    • 15.1.1 本篇内容
    • 15.1.2 XR概念
      • 15.1.2.1 VR
      • 15.1.2.2 AR
      • 15.1.2.3 MR
      • 15.1.2.4 XR
    • 15.1.3 XR综述
    • 15.1.4 XR生态
    • 15.1.5 XR应用
  • 15.2 XR技术
    • 15.2.1 XR技术综述
      • 15.2.1.1 软件架构
      • 15.2.1.2 Quest 2开发
      • 15.2.1.3 OpenXR
    • 15.2.2 光学和成像
    • 15.2.3 延迟和滞后
      • 15.2.3.1 Prediction
      • 15.2.3.2 Timewarp(TW)
      • 15.2.3.3 Async Timewarp(ATW)
      • 15.2.3.4 Interleaved Reprojection(IR)
      • 15.2.3.5 Asynchronous Spacewarp(ASW) / Motion Smoothing
      • 15.2.3.6 Positional Timewarp (PTW)
      • 15.2.3.7 优化延迟和滞后
    • 15.2.4 渲染
      • 15.2.4.1 多分辨率渲染和注视点渲染
      • 15.2.4.2 立体和多视图渲染
      • 15.2.4.3 光场渲染
      • 15.2.4.4 光影
      • 15.2.4.5 射线检测
      • 15.2.4.6 抗锯齿
    • 15.2.5 XR优化
    • 15.2.6 其它
  • 15.3 UE XR
    • 15.3.1 UE XR概述
    • 15.3.2 UE XR源码分析
      • 15.3.2.1 Multi-View
      • 15.3.2.2 Fixed Foveation
      • 15.3.2.3 OpenXR
      • 15.3.2.4 Oculus VR
    • 15.3.3 UE VR优化
      • 15.3.3.1 帧率优化
      • 15.3.3.2 体验优化
      • 15.3.3.3 其它优化
    • 15.3.4 UE VR性能检测
  • 15.4 本篇总结
  • 特别说明
  • 参考文献

 

 

15.1 本篇概述

虚拟现实(VR)因伊万·萨瑟兰(Ivan Sutherland)在20世纪60年代的工作而广受赞誉。在过去的50年里,虚拟现实技术的普及程度上下波动。特别是,近年来,虚拟现实在虚拟现实及其对应产品增强现实(AR)方面的投资吸引了许多科技巨头的注意。例如,2014年,Facebook以20亿美元收购了虚拟现实技术公司Oculus,并开始推动虚拟现实进入新时代。如今,苹果、谷歌、索尼和三星等所有主要厂商都在这一领域投入了大量资金,努力让虚拟现实变得可访问且价格合理。

15.1.1 本篇内容

本篇主要阐述XR的以下内容:

  • XR概述
  • XR技术
  • XR的引擎集成
  • XR生态

15.1.2 XR概念

XR涉及的概念及关系如下两图:


AR、VR的技术对比如下:

15.1.2.1 VR

什么是虚拟现实?让电子世界看起来真实且互动,非静态3D图像,不是电影,可以在3D世界中移动,可以在3D世界中操纵对象。虚拟现实体验包含浸入式空间和沉浸式体验两种模式。其中浸入式空间具有360度全景图像/视频、高视觉质量、有限的互动性、改变视点方向、用户可以转头看到不同的视图、固定位置等特点。沉浸式体验具有三维图形、低视觉质量、高交互性、太空运动、与虚拟对象交互等特点。VR设备包含基于PC和基于移动端两种方式。

虚拟现实硬件包含头戴式显示器、运动跟踪、头部追踪、控制器等硬件部件。

早期的VR设备包含Desktop VR、立体拷贝(Stereoscopy)、头部耦合透视(HCP)、头盔显示器(Head-mounted display,HMD等几种模式,它们的技术对比如下:

虚拟现实硬件类型有PC HMD、移动HMD(一体机)、手机嵌入设备三种类型。

PC HMD指的是作为外部显示器的桌面外围设备,提供最深度、最沉浸式的虚拟现实,跟踪位置和方向,使用一条或多条电缆连接到计算机,用于跟踪位置。

移动HMD一般是定制Android build/Oculus mobile SDK,仅限方位跟踪,支持即将到来的S6–三星Gear VR,支持LG G5(LG VR),110对角视野(Gear VR),1000hz刷新率(Gear VR)。

手机嵌套设备是移动虚拟现实开放规范,仅限方位跟踪,标准Android、iOS支持,使用简单的立体渲染和加速度计跟踪,只需添加智能手机,90度视场(硬纸板),200hz刷新率。

可扩展3D(X3D)图形是在Web上发布、查看、打印和存档交互式3D模型的免版税开放标准,X3D和HAnim标准由Web3D联盟开发和维护。使用X3D的HMD虚拟现实服务如下图:

衡量VR设备的基本参数包含立体绘制、6DOF(6*度,包含位置和朝向)、视场(FOV)等,下表是2017年前后的VR设备的基本参数:

VR设备的经典代表Quest 2的参数如下:

  • 面板类型:快速开关LCD。
  • 显示分辨率:每只眼睛1832x1920。
  • 支持刷新率:60Hz、72Hz、80Hz、90Hz。
  • 默认SDK颜色空间:Rec.2020 gamut,2.2 gamma,D65 white point。
  • USB接口:1x USB 3.0。
  • 跟踪:由内向外,6*度。
  • 音频:集成,内置。
  • SoC:高通®Snapdragon™ XR2平台。
  • 内存:总计6GB。
  • 镜头距离:可调IAD,有58、63和68mm三种设置。

15.1.2.2 AR

增强现实(AR)通过将虚拟对象叠加到真实世界中,无缝地融合了真实世界和虚拟世界,与用计算机模拟的虚拟世界代替真实世界的VR不同,AR改变了人们对真实世界的持续感知,Pokémon Go和Snapchat过滤器是AR的两个示例。AR通过将我们所看到的与计算机生成的信息叠加,增强了我们对现实世界的看法。如今,这项技术在智能手机AR应用程序中非常流行,这些应用程序要求用户将手机放在面前。通过从相机中拍摄图像并实时处理,该应用程序能够显示上下文信息或提供似乎植根于现实世界的游戏和社交体验。

虽然智能手机AR在过去十年中有了显著改善,但其应用仍然有限。人们越来越关注通过可穿戴智能眼镜提供更全面的AR体验。这些设备必须将超低功耗处理器与包括深度感知和跟踪在内的多个传感器结合在一起,所有这些都必须在一个足够轻和舒适的外形范围内,以便长时间佩戴。

AR智能眼镜需要在用户移动时始终开启、直观且安全的导航。这需要在深度、遮挡(当三维空间中的一个对象挡住另一个对象的视线时)、语义、位置、方向、位置、姿势、手势和眼睛跟踪等功能方面取得关键进展。

2021,许多新型智能眼镜上市,包括Snap的眼镜智能眼镜、联想ThinkReality A3和Vuzix的下一代智能眼镜。AR智能眼镜旨在改善我们未来的生活,如以下视频所述。它们还可能扮演通向虚拟元素和现实相交的元宇宙的门户的角色。

15.1.2.3 MR

混合现实(MR)是VR和AR技术的混合体,MR有时被称为混合现实,它将真实世界与虚拟世界融合在一起,在虚拟世界中,真实和数字对象可以共存并实时交互。与AR类似,MR将虚拟对象叠加在真实世界的顶部。与VR类似,这些叠加的虚拟对象是交互式的,使用户能够操纵虚拟对象。微软HoloLens就是MR的一个很好的例子。MR位于AR和VR之间,因为它融合了真实世界和虚拟世界。这种类型的XR技术有三个关键场景。第一种是通过智能手机或AR可穿戴设备,将虚拟对象和角色叠加到真实环境中,或者可能反过来。

2016年风靡全球的Pokémon Go手机游戏通过智能手机摄像头在现实世界中覆盖虚拟的神奇宝贝),它经常被吹捧为革命性的AR游戏,但实际上它是MR的一个很好的例子——将真实世界的环境与计算机生成的对象混合在一起。混合现实技术也开始被用于将VR真实世界的玩家叠加到视频游戏中,从而将真实世界的个性带入Twitch或YouTube等游戏流媒体平台。

15.1.2.4 XR

扩展现实(eXtended Reality,XR)是一个“包罗万象”的术语,指增强或取代我们世界观的技术,通常通过将计算机文本和图形叠加或浸入到真实世界和虚拟环境中,甚至是两者的组合。XR包括增强现实(AR)、虚拟现实(VR)和混合现实(MR),虽然这三种“现实”都有共同的重叠特性和需求,但每种都有不同的目的和底层技术。

XR被设定为在元宇宙(metaverse)中发挥基本作用。“互联网的下一次进化”将把真实、数字和虚拟世界融合到新的现实中,通过一个Arm驱动的“网关”设备(如VR设备或一副AR智能眼镜)进行访问。XR技术有一些基本的相似之处:所有XR可穿戴设备的核心部分是能够使用视觉输入方法,如对象、手势和注视跟踪,来导航世界和显示上下文相关信息,深度感知和映射也可以通过深度和位置功能实现。然而,XR设备根据AR、MR和VR体验的类型以及它们设计用于启用的用例的复杂性而有所不同。

15.1.3 XR综述

虚拟现实的历史通常可以追溯到20世纪60年代,这个概念甚至可以追溯到1938年以后。也就是说,当时的虚拟现实与我们现在的虚拟现实非常不同。第一款广为人知的虚拟现实头戴式显示器(HMD)是达摩克利之剑,由计算机科学家伊万·萨瑟兰(Ivan Sutherland)和他的学生鲍勃·斯普鲁尔(Bob Sproull)、奎汀·福斯特(Quitin Foster)和丹尼·科恩(Danny Cohen)发明。虚拟现实系统要求用户戴上安全带,因为整个设备对用户来说太重了,这种不可行性使得达摩克利之剑的使用仅限于实验室。

从那时起,VR HMD就开始发展。2019年,Facebook发布了其独立无线虚拟现实HMD Oculus Quest,用户不再需要PC或手机来操作和使用基于摄像头的位置跟踪(Oculus Insight)。这款内置电脑单元的新型设备为虚拟现实带来了一个移动和*的新时代,Oculus Quest设备在一周内就在多家零售店售罄,在前两周,VR内容销售额达到500万美元。

2020年,近50%的AR/VR支出用于商业用例,其中26亿美元用于培训,9.14亿美元用于工业维护。消费者支出占AR/VR总支出的三分之一,VR游戏和VR功能观看分别为33亿美元和14亿美元。关于全球AR和VR支出的预测,2019年至2023年,前三位最快的支出增长率分别为大专实验室和现场,复合年增长率(CAGR)为190.1%,K-12实验室和现场,复合年增长率为168.7%,现场组装和安全,复合年增长率为129.5%。培训用例将是2023年最大的预测支出。

鉴于虚拟现实技术的发展潜力,苹果、谷歌、微软、Facebook、三星、IBM和其他主要公司在2020年对虚拟现实技术进行了大量投资。虚拟现实肯定有很有前途的支持者和信徒。将虚拟现实用于商业,主要是通过增强购物者的体验,也是一种趋势。通常,虚拟工具用于增强现实世界的环境,帮助购物者在实体商店中定位商品。虚拟现实技术还允许购物者定制他们感兴趣的产品。更有趣的是,购物者现在可以像在现实生活中一样,远程、虚拟地浏览商店的数字孪生兄弟,购买产品。

近年来,虚拟现实技术的全球增长势头强劲,部分原因是其迅速被消费者市场接受,其主要需求来自游戏、娱乐和体验活动行业。虚拟现实改变了我们消费内容的方式,给用户带来了更具互动性和沉浸式的体验。预计到2022年,全球虚拟现实产业预计将达到2092亿美元。随着入门成本的下降和全面部署带来的好处变得更加明显,AR/VR的商业应用将继续扩大。重点正在从谈论技术好处转向展示真实和可衡量的业务成果,包括生产力和效率的提高、知识转移、员工的安全,以及更具吸引力的客户体验。

XR的简要历史。

VR好的用户体验体现在吸引人、参与感和值得纪念的时刻等三方面。其中参与感包含了在场、联系、记忆三方面,这也是使用VR的良好理由。而反面的例子是阅读、键入和精准操作。

好的VR应用应当选择正确的技术,满足在达成和质量、续航、内容发布、备份、后勤等方面的需求。

此外,需要遵循VR最佳实践,具体如下:

保持玩法短暂且清晰:

还是有很多用户对VR不甚了解,是新手,需要对其进行测试,使得模拟负面影响尽量真实,进行跨年龄和视力测试,没有明确的用户体验范例。对于移动端VR,由于开发新硬件,但用户有旧硬件,延迟令人眩晕,设备、型号、版本之间存在差异。对于房间规模VR(room-scale VR),进行压力测试、跨GPU测试及存储、内存测试等。

假设每个人都是VR新手,需要耐心、温柔,解释会发生什么,告诉他们工作原理,和他们呆一分钟,监控其进度,获取反馈,短信提醒,建议转换。VR并不是即时直观的,需要引导他们。品牌需要注意10个VR提示:

为了最小化VR的负面影响(眩晕),需要快速帧速率(90以上最佳),当头部移动(20ms或更短)时,将延迟降至最低,正确获取所有视觉线索,最小化加速度,基于我们的视野和前庭系统如何相互作用的创造性解决方案。其中避免加速度尽量使用恒定速度,即时更改,如果是曲线,则提前显示,显示轨迹,减速,尽量远程传输,但显示地标,让玩家控制。注视点视野中心2度视野,周边视觉是运动的关键,快速移动时模糊或消除周边视觉。

眼睛追踪使注视点渲染成为可能,来到VR以及最终的移动领域,关键是学习我们的视觉系统/大脑如何相互作用,最起码需要什么?VR需要很多因素来保证正确和良好的体验,如帧速率、头部跟踪、视野范围、收敛性(Vergence)、3D渲染、透视、视差、距离雾、纹理、大小、遮挡…以及更多。下图是VR设备在显示、光学等方面的趋势预测:


渲染技术的预测如下:

制约VR体验的因素包含以下几方面:

谨防使用浮动图标、界面破坏存在感,将界面放入3D世界数字界面,研究我们的视觉系统,少即是多保持高帧率,不需要真实感。2017到2019年的VR设备市场份额的变化趋势如下图:

Oculus售出了150万台Rift,拥有12款100万美元以上的OCULUS游戏,OCULUS QUEST发布且售价在399美元。现象级的游戏代表是节奏光剑(Beat Saber):

对于Oculus而言,未来的目标是达到十亿级的VR用户:

15.1.4 XR生态

VR/AR行业覆盖了硬件、系统、平台、开发工具、应用以及消费内容等诸多方面。作为一个还未成熟的产业,VR/AR行业的产业链还比较单薄,参与厂商(尤其是内容提供方)比较少,投入力度不是太大。核心内容生产工具面临较大的研发制作瓶颈,如360°全景拍摄相机,市面上的产品屈指可数。

当前XR涉及了硬件、OS、引擎、设备制造等等产业,涉及的公司和品牌数不胜数:

随着近年来,投资圈在XR圈的活跃,相信生态圈会越来越完善,正如2010年前后的智能移动设备。

15.1.5 XR应用

当前,由于Covid -19大流行,世界其范围正面临危机,例如,中国的在家工作场景要求新的工作或协作方式。VR为传统工作模式提供了另一种解决方案,可以实现虚拟会议、化身、面对面等办公和沟通需求。

自互联网诞生以来,信息通信和媒体技术一直呈指数级增长,虚拟现实技术创新发挥着重要作用。过去,虚拟现实主要是在消费游戏领域。虽然这一趋势将继续下去,但我们看到虚拟现实商业应用的快速增长。这主要是由于消费者习惯的改变以及虚拟现实硬件成本的大幅降低。与几十年前相比,虚拟现实的进入门槛相对较低,这使得虚拟现实成为了一个可行的解决方案,并增强了多个用例段。

为了提高生产力、提高效率和降低运营成本,新加坡的许多企业都在将最新的虚拟现实技术应用于从培训到工作的各种应用中。另一方面,普通消费者,尤其是年轻人,越来越愿意使用虚拟现实以增强他们不同的消费体验,如购物和娱乐。

*机构也在将虚拟现实技术纳入其一些关键业务中。例如,警察和民防部门在培训中采用了虚拟现实技术。VR是某些*建筑项目的强制要求。我们将进一步阐述这些应用在以下领域的沟通、协作与协调、培训以及可视化。

XR应用领域主要体现在(但不限于):

  • 沟通、协作与协调。有了互联网,可以实时与不同地理位置的人合作。然而,虚拟现实带来了一种新的沟通和协作方式。它通过让人们更加接近彼此,为虚拟现实视频会议创造了沉浸式的互动体验。沉浸在虚拟现实环境中,人们可以在没有身体干扰的情况下更加专注于会议。研究表明,与传统视频会议相比,虚拟现实沉浸式会议的注意力预计会增加25%。在旅行成本和物理会议空间方面,还有其他可观的节约。鉴于新冠肺炎的流行和社会疏远措施,许多社会和社区功能和活动已被完全取消。其中一些活动对参与者来说非常重要,诸如集会仪式之类的活动可以在虚拟现实空间中进行,毕业生和活动参与者可以使用手机和虚拟现实设备参加来自世界各地的虚拟毕业典礼。
  • 培训。虚拟现实经常用于培训,因为它允许学员在沉浸式安全环境中体验真实情况。传统的动手培训通常需要物理设备、空间和操作停机时间。在某些情况下,受训人员可能会接触到他们没有准备好的工作场所危险。有了虚拟现实,培训可以随时随地进行,减少了资源成本和等待时间。培训师还可以定制虚拟现实环境,对员工进行不同场景的培训,让学员掌握大量知识,以解决各种问题。例如,犯罪现场的第一反应人员可以接受培训,以处理大量模拟场景,并反复磨练他们的决策技能。与传统场景模型相比,这种实现还允许主队更有效地使用物理存储和空间,允许更多的人更频繁地接受培训,而传统场景模型需要物理道具、模型和昂贵的空间。
  • 可视化。在AEC业务中,虚拟现实帮助用户在网站建设之前将其设计可视化,从而节省成本并产生更好的效果。从2017年到2019年,虚拟现实在虚拟设计与施工(VDC)领域的招标要求有所增加。如果没有完全排除在此类项目竞争之外,没有VDC能力的公司将处于巨大劣势。在建筑设计师开始使用虚拟现实技术之前,他们可以先验证虚拟现实技术的优势,这一过程可以节省大量成本,并在建筑建成前缓解安全问题。
  • 游戏和娱乐。VR游戏、影视等方面的应用是推动VR发展的主要动力之一,以节奏光剑等游戏的流行也推广了VR设备的普及。随着VR技术最初在游戏行业的兴起,VR将对游戏产生巨大影响也就不足为奇了。XR为玩家提供富有吸引力的虚拟对象,丰富游戏环境,允许远程玩家在同一游戏环境中实时游戏和交互,允许玩家通过身体运动改变游戏中的位置,允许游戏从二维空间移动到三维空间。
  • 流媒体。XR带来身临其境的体验,并通过6个*度(6DoF)的能力增强媒体流媒体体验。这允许用户在虚拟现实环境或体育赛事或音乐会中移动并与之交互。


如今的XR仍处于起步阶段,类似于10年前的智能手机,XR的发展将需要数年时间……但机会将是巨大的。

总之,随着国家向数字经济迈进,虚拟现实技术已经在多个行业被广泛采用和使用。商业和消费市场对虚拟现实技术的需求将继续增长。在未来的几年里,虚拟现实将被广泛应用于每一个国人的日常生活和公司的运营中,因为它变得更容易获得和负担得起。出于这个原因,预计商业市场会发生轻微变化,因为一些人可能会开始从虚拟现实转向AR,或者未来的两年肯定是虚拟现实的关键时期,因为科技巨头正在努力为现有的虚拟现实应用带来新的增强,并进一步提高沉浸式技术的技术上限。

 

15.2 XR技术

15.2.1 XR技术综述

桌面虚拟现实(Virtual Reality,VR)历来是消费级3D计算机图形的主要显示技术。近来,立体视觉和头戴式显示器等更复杂的技术已变得更加普及。然而,大多数3D软件仍然仅设计用于支持桌面VR,并且必须进行修改以在技术上支持这些显示器并遵循其使用的最佳实践。需要评估现代3D游戏/图形引擎,并确定了它们在多大程度上适应不同类型的负担得起的VR显示器的输出,表明立体视觉得到了广泛的支持,无论是原生还是通过现有的适应。其它VR技术,如头戴式显示器、头部耦合透视(以及随之而来的鱼缸VR)很少得到原生支持。

2013年虚拟现实显示技术有桌面VR(串流)、立体视觉、头部耦合透视、头戴式显示器等几种,它们在模拟模型和用户感知方面的差异如下图:

立体视觉(Stereoscopy)是适用于双目视觉的桌面VR范式的扩展。立体镜通过两次渲染场景来实现这一点,每只眼睛一次,然后以这样的方式对图像进行编码和过滤,使每张图像只能被用户的一只眼睛看到。这种过滤最容易通过特殊的眼镜实现,眼镜的镜片设计为选择性地通过匹配显示器产生的两种编码之一。当前的编码方法是通过色谱、偏振、时间或空间。这些编码方法经常被分类为被动、主动或自动立体。被动和主动编码之间的区别取决于眼镜是否是电主动的:因此被动编码系统是颜色和极化,而唯一的主动编码是时间。自动立体显示器是不需要眼镜的显示器,因为它们在空间上进行编码,这意味着眼睛之间的物理距离足以过滤图像。

消费者立体显示器与计算机的接口方式与桌面VR显示器相同(通过VGA或DVI等视频接口)。由于这些接口中的大多数都没有特殊的立体观察模式,因此将两个立体图像以显示硬件可识别的格式打包成一个图像。此类帧封装格式包括交错、上下、并排、2D+深度和交错。由于这些标准化接口是软件将渲染图像传递给显示硬件的方式,因此软件应用程序不需要了解或适应编码系统的显示硬件。相反,图形引擎支持立体透视所需要的只是它能够从不同的虚拟相机位置渲染两个具有相同模拟状态的图像,并将它们组合成显示器支持的帧封装格式。

头部耦合透视(Head-coupled perspective,HCP) 的工作原理与桌面VR和立体视觉略有不同, 定义了一个虚拟窗口而不是虚拟相机,其边界是虚拟的窗口映射到用户显示器的边缘。因此,显示器上的图像取决于用户头部的相对位置,因为来自虚拟环境的对象会沿用户眼睛的方向投影到显示器上。这种投影可以使用桌面VR中使用的投影数学的离轴版本来完成。

为了做到这一点,必须实时准确地跟踪用户头部相对于显示器的位置。用于此目的的跟踪系统包括电枢、电磁/超声波跟踪器和图像- 基于跟踪。HCP的一个限制是,由于显示的图像取决于用户的位置,因此任何其他观看同一显示器的用户将感知到失真的图像,因为他们不会从正确的位置观看。

头戴式显示器(Head-mounted display,HMD)是另一种单用户VR技术,将立体视觉的增强功能与类似于HCP的大视场和头部耦合相结合。HMD背后的感知模型是完全覆盖用户眼睛的视觉输入,并将其替换为虚拟环境的包含视图。通过将一个或两个小型显示器安装在非常靠近用户眼前的镜头系统来实现的,以实现更自然的聚焦。由于显示器非常靠近用户的眼睛,显示器的任何部分只有一只眼睛可见,使系统具有自动立体感。

头饰中还嵌入了一个方向跟踪器,允许跟踪用户头部的旋转,允许用户通过将虚拟相机的方向绑定到用户头部的方向来使用自然的头部运动来环顾虚拟环境。它与HCP不同,HCP跟踪的是位置,而不是方向。支持HMD的软件要求与立体观察相同,但附加要求是图形引擎必须考虑HMD的方向,以及要校正的镜头系统引起的任何失真。

通过确定可以使用哪些扩展机制来实现所需的VR显示技术来衡量支持级别,已经结合了差异可以忽略不计的扩展机制(例如脚本和插件),并引入了两个额外的级别,不需要扩展(本机支持)和没有引擎内支持(重新设计)。扩展机制按引擎代码相对于实现VR支持的非引擎代码的比例排序,产生的支持级别及其排序如下:

5、原生支持。在原生支持VR技术的引擎中,引擎的开发人员特意编写了渲染管线,使用户只需最少的努力即可启用VR渲染。所需要做的就是检查开发人员工具中的选项或在引擎的脚本环境中设置变量。除了轻松启用该技术外,这些引擎还旨在避免常见的优化和快捷方式,这些优化和快捷方式在桌面VR显示器中并不明显,但随着更复杂的技术变得明显,一个常见的例子是渲染具有正确遮挡但深度不正确的对象,会导致立体镜下的深度提示冲突。

4、通过引擎内图形定制(包括节点图)。一些引擎的设计方式使得可以使用具有图形界面的自定义工具来更改渲染过程,一种方法是通过节点图,其中渲染管线的不同组件可以在多种配置中重新排列、修改和重新连接。根据支持的节点类型,有时可以配置节点以产生某些 VR 技术的效果。下图显示了虚幻引擎的材质编辑界面,该界面配置为将红青色立体立体渲染作为后处理效果。

3、通过引擎内编码(脚本或插件)。每个引擎都可以使用自定义代码进行扩展,使用定义明确但受限制的扩展点。两种常见的形式是在受限环境中运行的脚本,以及引擎加载并运行外部编译的代码插件,两种形式都可以访问引擎功能的子集,但是,插件也可以访问外部API,而脚本不能。由于通常实现特定于应用程序功能的机制,因此可用于自定义代码的引擎功能可能更多地针对人工智能、游戏逻辑和事件排序,而不是控制确切的渲染过程。

2、通过引擎源代码修改。除了免费的开源引擎,一些商业引擎通过适当的许可协议向用户提供其完整的源代码。通过访问完整的源代码,可以实现任何VR技术,尽管所需的修改量可能很大。

1、通过工程改造。对于不提供上述任何定制入口点的引擎,仍然可以通过重新设计进行一些更改。工程改造是逆向工程的一种形式,除了学习程序的一些工作原理之外,还修改了它的一些功能。对渲染管线进行完全逆向工程所需的工作量可能很大,因此更可取的是微创形式的再工程。其中一种方法是函数挂钩,即内部或库函数的调用被拦截并替换为自定义行为。由于很大一部分实时图形引擎使用OpenGL或Direct3D库进行硬件图形加速,因此这些库为通过函数挂钩实现纯视觉VR技术提供了可靠的入口点。事实证明,这种方法可以有效地将立体视觉添加到3D游戏。本文还展示了以这种方式实现头耦合透视也是可能的,通过挂钩加载投影矩阵(glFrustum和glLoadMatrix)的OpenGL函数,并用头部耦合矩阵替换原始程序提供的固定透视矩阵。

影响用户体验的因素有很多,虽然质量因素本质上与显示硬件相关,但适当的软件设计可以缓解这些问题,而粗心的设计可能会引入新问题。可以通过软件减轻的硬件质量因素的示例是串扰(立体)、A/C故障(立体)和跟踪延迟(HCP和HMD)。由于这些因素对于它们各自的显示技术来说是公认的,因此有众所周知的技术可以最大限度地减少它们引起的问题。解决方案分别是降低场景对比度、降低视差和最小化渲染延迟。

不正确的软件实现也会影响VR效果的质量,可能是由于粗心或桌面VR优化的结果。这方面的一个示例是任意位置的特殊图层(例如天空、阴影和第一人称玩家的身体)不同通道的深度。虽然在桌面VR中产生正确的遮挡,但在立体镜下添加双目视差提示会显示不正确的深度,并在这两个深度提示之间产生冲突。由于桌面VR的主导性质,这不是一个不常见的问题,并且可以作为另一个例子,说明简单的第三方实现可能不如原生VR支持。从这些方面应该注意到,虽然非原生VR实现可能满足必要的技术要求,但也必须考虑其它因素。

下表是2013年的主流引擎对VR的支持情况:

引擎 立体视觉 头部耦合透射 头戴式显示器
UDK 4:图形定制。可以使用Unreal Kismet创建双摄像头装备,并使用材质编辑器打包输出。 1:工程改造。无法从引擎访问自定义相机投影,因此如果无源代码访问权限,则需要工程改造。 3:引擎编码。通过自定义实现立体化,可以通过自定义DLL获得头部方向并通过脚本绑定到相机。
Unity 3:引擎编码。 3:引擎编码。 3:引擎编码。
CryENGINE 5: 原生。 3:引擎编码。 3:引擎编码。
OGRE 3:引擎编码。 3:引擎编码。 3:引擎编码。

虚拟现实中最重要的因素有:短余辉(Low Persistence)、延迟、现实。

VR的软件和硬件架构通常有好几层:C/C++接口、驱动程序DLL、VR服务层(在各应用之间分享和虚拟现实转换)等,下图是Oculus早期的架构图:

SDK的一般工作流程(以Oculus为例):

  • ovrHmd_CreateDistortionMesh。通过UV来转换图像,比像素着色器的渲染效率更高,让Oculus能更灵活地修改失真。
  • ovrHmd_BeginFrame。
  • ovrHmd_GetEyePoses。
  • 基于EyeRenderPose(游戏场景渲染)的立体渲染。
  • ovrHmd_EndFrame。

Oculus SDK易于集成,无需创建着色器和网格,通过设备/系统指针和眼睛纹理,支持OpenGL和D3D9/10/11,必须为下一帧重新申请渲染状态。好处:与今后的Oculus硬件和特性更好地兼容,减少显卡设置错误,支持低延迟驱动显示屏访问,例如前前缓冲区渲染等,支持自动覆盖:延迟的测试、摄像头指南、调试数据、透视、平台覆盖。支持Unreal Engine 3、Unreal Engine 4、Unity等主流游戏引擎使用SDK渲染。支持扩展模式:头戴设备显示为一个OS Display,应用程序必须将一个窗口置于Rift监视器上,图标和Windows在错误的位置,Windows合成器处理Present,通常有至少一帧延迟,如果未完成CPU和GPU同步,则有更多延迟。另外,它支持Direct To Rift的功能,即输出到Rift,显示未成为桌面的一部分。头戴设备未被操作系统看到,避免跳跃窗口和图标,将Rift垂直同步(v-sync)与OS合成器分离,避免额外的GPU缓冲,使延迟降到最低,使用ovrHmd_AttachToWindow,窗口交换链输出被导向Rift,希望直接模式成为较长期的解决方案。

VR开发需要注意的事项:

  • 不要控制玩家的头部!
  • 注意第一人称动作。
  • 照片现实主义是没有必要的。
  • 不要使用电影级的渲染效果!比如可变焦距、过滤器、镜头光斑、泛光、胶片颗粒、暗角、景深等。

立体渲染质量检查:

  • 左右方向正确吗?
  • 双眼中的元素相同吗?
  • 两幅图像代表同一时间吗?
  • 刻度正确吗?
  • 深度一致吗?
  • 避免快速深度变化了吗?

良好的虚拟现实引擎必须满足以下条件:

  • 高质量的视觉效果。高质量视觉效果指没有任何东西会分散你的注意力,让你沉浸在游戏中,良好的着色效果(但不一定是真实照片),通常意味着良好的抗锯齿。为什么良好的抗锯齿至关重要?人类感知的本质意味着我们很容易被高频噪点分心,分心会降低存在感,使用立体渲染时,锯齿伪影可能会更严重,它们会导致视网膜竞争,良好的抗锯齿比原生分辨率更重要。抗锯齿方法有:边缘几何AA,通常硬件加速;图像空间AA,非常适合大多数渲染管线,如FXAA、MLAA、SMAA等;时间AA,使用再投影进行时间超采样。

  • 一致的高帧速率。为什么一致的高帧速率至关重要?在虚拟现实中,低帧速率看起来和感觉都很糟糕,如果没有高帧率,测试就很困难。在整个开发过程中保持高帧率,缺少V-sync也更为明显,因此,请确保启用了V-sync。

    在当前的引擎中,“通道”的概念被广泛接受,如反射渲染、阴影渲染、后处理等,每个通道都有不同的要求,每个通道都要找出瓶颈所在。CPU?DrawCall?状态设置?资源设置?GPU?顶点处理受限?几何处理受限?像素处理受限?

    绘制调用、状态设置或资源设置时CPU受限?考虑如何使用几何着色器,可以减少绘制调用的总数,阴影级联渲染:drawCallCount/n,其中n是层叠的数量,立方体贴图渲染:drawCallCount/6。降低资源设置成本,它还有其它特性可以帮助将处理从CPU上移开。

    几何渲染单元将一个图元流转换为另一个可能更大的图元流,在像素着色器之前发生,即在直接顶点像素绘制调用中的顶点着色器之后,如果启用了细分,则在Hull着色器之后。

    几何体着色器功能,渲染目标索引/视口索引,用于单程立方体贴图渲染、阴影级联、S3D、GS实例,允许逐图元运行同一几何体着色器的多次执行,而无需再次运行上一个着色器阶段。

    用于立体3D渲染的几何体着色器,一种使引擎立体3D兼容的简单方法,为每种材质添加一个GS(或调整已有材质的GS),如下所示:

    [maxvertexcount(3)]
    void main(
        inout TriangleStream<GS_OUTPUT> triangleStream,
        triangle GS_INPUT input[3])
    {
        for(uint i = 0; i < 3; ++i)
        {
            GS_OUTPUT output;
            output.position = (input[i].worldPosition , g_ViewProjectionMatrix);
            triangleStream.Append(output);
        }
    }
    

    顶点/几何体受限?通过压缩属性来减少顶点大小,在着色器阶段之间打包所有属性,如果正在使用用于放大或细分管线的几何体着色器,这一点很重要。考虑使用延迟获取(late fetch)法:将顶点属性数据绑定为使用的着色器阶段中的缓冲区,高度依赖硬件,始终调试性能,看看是否有影响!减少在GPU周围移动的数据。

    像素受限?降低像素着色器的复杂性,减少每帧着色的像素数,一个使用较小渲染目标的实验上采样与高质量视觉冲突,引入光晕、微光和视网膜冲突。

    考虑使用重新投影来加速立体3D渲染的方面,在PlayStation 3立体声3D游戏中获得巨大成功,然而,它只能在视差较小的情况下成功使用。

  • 出色的跟踪和标定。一般由SDK处理跟踪,使用SDK提供的跟踪矩阵。游戏定义的默认观看位置和方向:

    追踪玩家头部与摄像机的偏移量:

    玩家眼睛相对于头部矩阵的偏移量:

    跟踪器重置功能:设置头部位置,使其与游戏摄像机的位置和偏航对齐。重置位置和方向跟踪,重新调整游戏世界与现实世界的关系,以便固定的玩家位置,传递和游戏(Pass-and-play),匹配不同身高的玩家。

    跟踪允许用户接近跟踪体积中的任何内容,无法实现超昂贵的效果,并声称“这只是角落里的一个小东西”,即使是最低画质也需要比传统创作的更高的逼真度,如果在跟踪体积中,必须是高保真的。

  • 低延迟。为什么减少延迟如此重要?延迟是输入和响应之间的时间间隔,重要的不仅仅是始终如一的高帧率。不仅用于虚拟现实头部跟踪,提高响应能力在游戏中至关重要,游戏编程人员了解响应控制的必要性,网络程序员了解对响应性对手的需求等等。

假设现在拥有一个非常高效、高帧率、低延迟、超高质量的下一代引擎中拥有了出色的跟踪功能,该引擎针对虚拟现实进行了优化……引擎的工作完成了吗?当然不是!还有特定于平台的优化、跟踪外围设备、社交方面、游戏性/设计元素等工作。

Valve公司早在2014年就有多年的VR研究经验,联合了硬件和软件工程师,专为VR设计的定制化光学元件,显示技术——低持久性、全局显示,跟踪系统(基于基准的位置跟踪、基于点的桌面跟踪和控制器、激光跟踪HMD和控制器),SteamVR API–跨平台、OpenVR。

HTC Vive开发者版规格:刷新率是90赫兹(每帧11.11毫秒),低持久性,全局显示,帧缓冲区的分辨率是2160x1200(每只眼睛1080x1200),离屏渲染的宽高约1.4倍:每只眼睛1512x1680 = 254万个着色像素(蛮力),FOV约为110度,360⁰ 房间尺度跟踪,多个跟踪控制器和其它输入设备。

每秒着色可见像素数的估算:30赫兹时720p:2700万像素/秒,60Hz时1080p:1.24亿像素/秒,30英寸监视器2560x1600@60赫兹:2.45亿像素/秒,4k监视器4096x2160@30赫兹:2.65亿像素/秒,90赫兹时的VR 1512x1680x2:4.57亿像素/秒,可以将其降低到3.78亿像素/秒,相当于非虚拟现实渲染器在100赫兹时的30英寸监视器。

最低化GPU最低规格,最低规格越低,客户就越多,客户不应注意到锯齿,客户将锯齿称为“闪烁”,算法应该扩展到多个GPU上。

桌面VR可以尝试立体渲染(多GPU),AMD和NVIDIA都提供DX11扩展以加速跨多个GPU的立体渲染,AMD实现的帧速率几乎翻了一番,但还没有测试NVIDIA的实现。非常适合开发人员,团队中的每个人都可以在他们的开发盒中使用多GPU解决方案,在没有不舒服的低帧率的情况下打破帧率。

VR的交互技术包含选择、操纵、导航、系统控制等方面。三维选择包含从集合中拾取一个或多个对象、现实世界的隐喻(触摸/抓取、定点)、“自然”技术(简单虚拟手、射线投射)等。3D选择的影响因素有:技术(跟踪抖动、精度、延迟)、人类(手抖动)、环境(距离、遮挡)等,半天然的“天然”技术,即使是完全自然的技术也不是最佳的。可以使用双气泡(Double Bubble):扩展光线投射,动态体积光标、渐进式优化。3D选择技术的应用场景如下表:

相比Ray Cast,Double Bubble在选择时间、误差方面表现更好:

使用真实世界的隐喻,技术和现实世界的限制,打破现实世界的假设:

每种操作方式在各个阶段的描述如下:

3D交互的最后的想法是自然主义vs 魔法(超自然、超级自然)、与不精确工具的精确交互(渐进式优化、动态C/D增益、虚拟摩擦力):

虚拟实体的影响也比较关键,许多关于化身影响的研究,对社交互动至关重要,对于存在(对某些人)也至关重要。

在手势和身体方面,需要手势向他人解释,有些人经常做手势,语言学研究人员研究了手势对解释困难概念能力的影响。

从左到右:无化身(avatar)、有化身但无移动、完整的化身和移动。

拥有化身显著提高了执行对象记忆任务的能力,有化身的人比没有化身的人做更多的手势。延迟至关重要,较低的延迟倾向于更“自然”的接口,但在所有情况下,这些接口可能不是最有效的接口。虚拟身体对某些用户非常重要,“虚拟现实”研究可以在众多学科中找到,因为其影响和需求非常广泛,一个非常多样化的研究社区促成了令人兴奋和有趣的研究合作。

在现实物理空间和虚拟现实的空间映射中,虚拟现实的物理定律是可变的,人类的感知是可塑的,我们可以利用它来提高可用性,可以创造超现实、神奇的体验。

XR通常存在空间感知技术,运动跟踪-深度感应-区域学习,表面重建–平面和孔洞检测。

空间感知的相关设备:

对于Microsoft的HoloLens,采用了红外相机空间映射:

支持运动和手势跟踪:

语音识别,包含系统级命令、用户可配置命令。

空间处理HoloToolkit支持基本的空间映射(访问/可视化空间数据,保存/加载房间)和空间处理(曲面网格到平面,墙、天花板、地板、桌子,未知,地板缓冲器,天花板缓冲器,自定义形状定义)。

Tango运动追踪支持视觉惯性里程计(VIO,跟踪图像差异,惯性运动传感器,组合以提高精度),限制是漂移、无内存、照明等。2016年的Tango和HoloLens的对比如下:

2017年的VR游戏Climb采用了严密的计划,成功解决了新平台问题,运动方面取得突破,使用保守的技术方法,设计驱动的功能有时会出现问题。

Robinson分析性能和内存,平台工具运行良好,艺术团队成功采用程序可视化分析工具,在屏幕上的OOM崩溃跟踪内存,新功能可分析当天保存的峰值。

注释点(透镜匹配)渲染上,利用PS4近/宽渲染支持,对于每只眼睛,渲染内部和外部视图。

大大有助于在性能和分辨率之间找到最佳点,PS4渲染的内部面积等于1.5倍渲染比例(1620p),PS4 Pro将其增加到1.9倍,更大的内径
外环在PS4上采样不足,Pro 1:1,需要渲染场景四次。在渲染线程上录制场景drawcalls的成本高出四倍,为场景和照明重新提交相同的命令缓冲区:

后处理仍录制4次,有些数据需要修补,每次提交后覆盖现有的每视图常量缓冲区在每次提交后复制后处理(对象速度)期间所需的渲染目标。为了节省GPU成本,顶点着色器执行了4次,但开销可以接受,通过将Post交错作为异步作业来吸收GBuffer中的顶点开销,填充HTILE掩码以拒绝相关区域之外的像素。

总之,Robinson的计划/时间表不稳定,预留空间给开发方(性能、内容、游戏性),移动和用户选项的结果参差不齐,技术创新高度成功,媒体/平台上凸起的可视栏。人工移动已经存在并将继续存在,用户界面/用户体验还有很长的路要走,VR性能并不难,峰值可以
在主流硬件上实现高保真,到目前为止,只是触及表面。下图是VR系统场景的组件:

输入处理器、模拟处理器、渲染处理器和世界数据库关系如下:

VR分类可以基于两个因素:使用的技术类型和精神沉浸程度,具体如下图:

解决未来关键的XR技术挑战包含显示、照明、运动追踪、电量和散热、连接等。

15.2.1.1 软件架构

VR应用常涉及实现所有事情!如硬件故障,需要支持一切(太古代),从SDK提取输入,管理SDK,UI框架等。其中的一种VR分层架构如下:

  • 特定于SDK的输入类:每个硬件/SDK一个类,没有特定于项目的逻辑!监听设备输入,调用抽象处理程序,调用工具的down/hold/up,调用常规输入的down/hold/up。

  • 输入组件:SDK特定组件类包含对硬件功能的特定引用:

    public class ViveControllerComponents : WandComponents 
    {
        public SteamVR_Controller.Device viveController;
    }
    

    特定于类别的组件类包含硬件类型的公共属性:

    public class WandComponents : InputComponents 
    {
        public Transform handTrans;
        public override Vector3 Position { get { return handTrans.position; } }
        public override Vector3 Forward { get { return handTrans.forward; } }
        public override Quaternion Rotation {get{ return handTrans.rotation; }}
    }
    

    InputComponents基类包含大多数抽象数据:

    public class InputComponents 
    {
        public virtual bool Valid { get { return true; } }
        public virtual Vector3 Position { get { return Vector3.zero; } }
        public virtual Vector3 Forward { get { return Vector3.forward; } }
        public virtual Quaternion Rotation { get { return Quaternion.identity; } }
    }
    
  • 工具基类。

    // 每个SDK的向下/保持/向上挂钩
    public virtual void DoToolDown_Sixense(SixenseComponents sxComponents) 
    {
        DoToolDown_Wand(sxComponents);
    }
    public virtual void DoToolDown_Leap(LeapComponents leapComponents) 
    {
        DoToolDown_Optical(leapComponents);
    }
    public virtual void DoToolDown_Tango(TangoComponents tangoComponents) {
        DoToolDown_PointCloud(tangoComponents);
    }
    
    // 每个类别的向下/保持/向上挂钩
    public virtual void DoToolDown_Wand(WandComponents wandComponents) 
    {
        DoToolDown_Core(wandComponents); 
    }
    public virtual void DoToolDown_Optical(OpticalComponents opticalComps) 
    {
        DoToolDown_Core(opticalComps); 
    }
    public virtual void DoToolDown_PointCloud(PCComponents pcComponents) 
    {
        DoToolDown_Core(pcComponents); 
    }
    
    // 工具基础函数
    DoToolDown_Core
    DoToolDownAndHit*
    DoToolHeld_Core
    DoToolUp_Core
    DoToolDisplay_Core
        
    public virtual void DoToolDown_Core(InputComponents comp) 
    {
        if (Physics.Raycast(comp.Position, comp.Forward, out hit, dist, layers)) 
        {
            DoToolDownAndHit(comp);
        }
    }
    
  • 特定工具类型。

    // 可以覆盖DoToolDown_Core等,实现完全平台无关逻辑
    public class MoveTool : Tool 
    {
        protected override void DoToolHeldAndHit(InputComps comps) 
        {
            selectedTrans.position = hit.point;
        }
    }
    
    // 可以覆盖任何类别或特定于SDK的挂钩,以实现更定制的行为
    public class MoveTool : Tool 
    {
        // ...
        protected override void DoToolHeld_Optical(OpticalComps comps) 
        {
            // Move mechanic that’s more appropriate for optical control
        }
    }
    
  • 硬件输入基类。非工具抽象输入,适用于一般游戏功能和一次性交互,三种处理方法:

    // 比如Unity的原生输入类
    bool HardwareInput.ButtonADown/Held/Up
    // 当想要那个观察者的时
    event HardwareInput.OnButtonADown
    // 集中输入/游戏逻辑
    void HardwareInput.HandleButtonADown()
    
  • 游戏性/一般输入类...。

    // 一次性输入
    public class GameplayController : MonoBehaviour 
    {
        void Update() 
        {
            if(HardwareInput.TriggerDown) 
            {
                WorldConsole.Log("Fire ze missiles!");
            }
        }
    
        void Awake() 
        {
            HardwareInput.OnButtonADown += HandleButtonA;
        }
    
        void HandleButtonA() 
        {
            WorldConsole.Log("Boom!"); // Btw: use a “world console”!
        }
    }
    
    // 组件的一般输入, 更新的三种方法:
    // 添加硬件输入/位置/向前等
    HardwareInput.ButtonADown/Held/Up
    // 传递包含组件的事件参数
    HardwareInput.OnButtonADown(args)
    HandleButtonADown(components)
    

所有SDK都以Libs/dir的形式存在于项目中:

SDK太多了!SDK之间的AndroidManifest和插件冲突,在某些情况下,可以通过合并清单来解决(例如Cardboard+Nod),在许多情况下,只需要将冲突的SDK移入或移出Asset文件夹,可以连接到构建管线中。对于多SDK场景设置,将场景设置为支持所有SDK,Player对象包含用于ViveInput、GamepadInput、CardboardInput、NodeInput、LeapInput、TangoInput的组件...好处是场景之间没有重复的工作,所有设备都可以同时启用(例如Vive+Leap)。好处是让多种设备类型交互意味着新的设计挑战,更多平台==更复杂的场景,可以将播放器拆分为更易于管理的预置体,并在运行时或使用编辑器脚本组装这些预置。对于SDK管理器编辑器脚本,在编辑器中或在构建时启用/禁用每个平台的组件和对象。

public void SetupForCardboard() 
{
    Setup(
        // Build settings
        bundleIdentifier: "io.archean.cardboard",
        vrSupported: false,
        // GameObjects
        cameraMasterActive: true,
        sixenseContainerActive: false,
        // MonoBehaviours
        cardboardInputEnabled: true
    );
}

此外,可以自定义输入模块将允许向uGUI添加新的硬件支持。块状和点击用户界面(Block-and-pointer UI),点击或按下时,<设备>将光线投射输入用户界面(例如Vive),或简单的碰撞(如Leap)。自定义按钮组件:

ButtonHandler类中有一个巨大的switch语句来映射所有动作:

switch(button.action) 
{
    case ButtonStrings.Action_TogglePalette: TogglePalette(button, state); break;
    case ButtonStrings.Action_ChangePage: ChangePage(button, state); break;
    case ButtonStrings.Action_ChangePagination:ChangePagination(button); break;
    case ButtonStrings.Action_SelectProp: SelectProp(button, state); break;
    case ButtonStrings.Action_SelectTool: Tool.