vr开发_unity vr开发 - CSDN
  • VR原理讲解及开发入门

    万次阅读 2017-02-15 21:31:46
    本文是作者obuil根据多年心得专门为想要入门的VR开发者所写,由52VR网站提供支持。
    本文是作者obuil根据多年心得专门为想要入门的VR开发者所写,由52VR网站提供支持。

    1. VR沉浸感和交互作用产生的原理:

    在之前,我们观看一个虚拟的创造内容是通过平面显示器的,52VR上次发布过一篇文章《一张图让你认识VR》,在其中,你会看到很多10年前的虚拟现实装备,他们基本是平面显示器,或者将产生的画面投影到一个弧形甚至是球形屏幕上;或者在这些屏幕上叠加左右眼分别的图像,从而产生更加立体的效果。
    而这类装置往往很大型,也很昂贵。

    而近几年发展起来的VR头戴显示器,则达到了更好的使用效果:更好的沉浸感和更便宜的价格,目前一套主流的VR眼镜是不到1万元RMB的。

    这种VR眼镜 能够达到更好的沉浸感的原理是什么呢?

    221205hhs7jiqziit8ls8k

    我们看到,VR眼镜,主要通过三方面来达到沉浸感的目的:

    190802wi70spi4g7646785

    1)通过凸透镜来放大人眼看到的即时图像范围,现在的VR眼镜大概会产生90-120度范围的图像视野,这样的视野大概和一个良好的三通道环幕投影系统产生的效果差不多,不过VR眼镜要更加贴近人眼一些,人眼被干扰的可能性大大降低。

    221326sn5tccljtq8rn95n

    2)通过头部的陀螺仪,当人转动头部时,陀螺仪能够及时的通知图像生成引擎,及时的更新画面,从而使人感觉到,自己是在看一个环绕的虚拟空间,从而产生360度的三维空间感。

    221326wkqjpdvev9qmvzdv

    3)左右眼每一时刻看到的图像是不一样的,是两幅区别左右眼位置的不同头像,从而产生很强烈的立体纵深感。
    以上三个原因,就是VR眼镜的沉浸特点。

    185306ucp1ljbljclxrlxm


    2. 关于沉浸感和交互作用的定义

    对于这两个名词的定义,我认为大概可以如此解释:
    1)所谓沉浸感

    使用户处于一个四维的虚拟世界之内,用户各种感觉器官、特别是视觉器官对虚拟世界发生适应性正向反馈。

    就目前的VR眼镜来讲,主要通过两方面来达到沉浸感的目的:

    1. 一是通过经过放大的显示屏技术,能够在用户眼前显示出一个放大的局部虚拟时间景象,目前显示视场角在90-110度左右,在这个显示范围内,主要通过三维引擎技术,产生实时的立体图像。
    2. 二是通过和头部的位姿传感采集的数据配合,让三维引擎响应头部转动方向(和当前头部位置变化),以很高的频率实时改变显示的三维头像,用户头部转动的角度刚好和三维引擎模拟的三维画面视觉一致,让用户觉得放佛是通过一个大窗口 在观察一个虚拟的三维世界。



    2)所谓交互作用

    用户通过动作、手势、语言等人类自然的方式能够与虚拟世界进行有效的沟通。
    通常来讲,用户的双手动作,双脚行走,在虚拟世界中产生用户能够理解的变化,用户就认为该虚拟世界对用户发生了反馈,那么用户的动作和虚拟世界对用户的反馈,组合在一起,就形成一次交互作用




    那么主题来了,要达到目前VR眼镜所具有的沉浸互动效果,是需要有一整套软件和内容的配合。


    3. 如何生成符合VR要求的虚拟世界

    生成一个三维的虚拟世界,自从三维游戏诞生时,就不缺乏工具,基本可以认为,凡是具备三维构建和渲染能力的图形学引擎,都可以生成三维的虚拟图像世界,很多引擎拥有完整的游戏引擎功能,不仅仅限于图像方面,还能够产生声音,模拟物理现象等功能,这些目前还存在于世的引擎包括但不限于:


    1)世界上最知名的引擎排名前十,其中包括各大游戏公司出品的引擎
    1. The Dead Engine,美国EA公司重制过的引擎
    2. Avalanche Engine,
    3. Mt Framework引擎,鬼泣游戏大家知道吧?就是这个做的
    4. Anvil引擎,UBsoft的引擎
    5. EGO引擎
    6. 寒霜引擎
    7. CryEngine
    8. IW引擎
    9. 顽皮狗引擎
    10. Unreal Engine

    2)还有一堆开放源代码的渲染引擎,有兴趣的同学可以下载下来尝试下18
    OGRE、Irrlicht、Panda3D、Crystal Space、jME、Blender Game Engine、Reality Factory、The Nebula Device 2、RealmForge、OpenSceneGraph

    何谓引擎:

    这些引擎都是基于计算机操作系统API和显卡驱动接口构建的,目的是方便上层应用开发人员快速生产内容,在引擎和操作系统之间,其实普遍还有一层中间件,基础图形接口:

    在windowsPC和移动操作系统上,是directx基础图像api

    在工业领域,在linux、苹果PC和IPhone上,在安卓操作系统上,是一系列OpenGL基础图形接口(移动端为opengl es,是简化的opengl版本)


    几乎所有引擎都是基于上述两者或者其中之一进行构建的。



    4.最主流的VR开发引擎

    上述引擎由于其难易程度,功能完善度,开发成本等原因,在经历了长时间的兴衰过程后,目前最为流行和最适合开发VR内容的三大引擎为:


    unity Unreal Engine CryEngine

    在手机游戏爆发的时代,迅速崛起,成为开发游戏最多最为流程的引擎

    ,其主要特点为:

    不开源

    上手容易

    多平台开发容易



    目前的unreal第四代版本大有青出于蓝之势,依然是引擎中的No.!。

    其特点简单归纳为:

    开放源代码

    软件体系完整,不太需要额外插件。

    视觉表现和功能都极为强大

    上手入门不易

    最牛逼的孤岛引擎了,其代表作在效果上,大部分人认为比unreal更强,其特点概括为:

    开放源代码

    编辑器强大

    入门难

    三多:插件多、资源多、文档多 文档不少 文档并不多
    上述引擎比较,大家可以看我的另一篇文章:《目前VR游戏开发,使用Unity还是Unreal4?》

    上述三种引擎对VR的支持力度如何?
    上述三大引擎在不同程度上,已经内置对VR的支持

    Unity Unreal Engine CryEngine
    内置 steamVR插件
    内置OSVR插件
    内置SteamVR插件
    内置OSVR插件
    内置OSVR插件
    有了上述引擎提供的SteamVR和OSVR插件原生支持,开发者无需担忧跟不上VR眼镜中功能API和设备本身的发展变化,可利用插件打造兼容不同设备的虚拟现实体验。

    SteamVR插件是什么?
    SteamVR 是Value公司的一个VR 游戏平台,其开源SDK 是,OpenVR,OpenVR SDK是由原本的SteamWorks SDK更新而来,其包含对几大VR设备的支持和封装,这样开发者可以不用面对具体的设备接口,而只需要面对 OpenVR SDk的统一接口了,该SDK 包含了对HTC ViveOculus Rift开发者版本的支持,也包含Steam VR的控制器及定位设备的支持。相关的API是以C++实作,已有C++经验的开发人员可以直接 学习。

    OSVR插件是什么

    雷蛇及其合作伙伴联合创建了一个虚拟现实开放式平台:OSVR开源虚拟现实系统(Open-Source Virtual Reality)。OSVR旨在支持软件插件(Unity 3D、虚幻引擎4和英雄引擎(HeroEngine)、输入硬件(Sixsense和Leap Motion等)及其他虚拟现实的设备,包括Oculus rift DK2和Vrvana Totem。


    有了上述主流引擎和专用VR插件,那么你就可以开张了,来到52VR.COM一起来学习这几个主流制作工具吧,我们会继续推出下面的链接:




    展开全文
  • 浅谈Unity与VR产业,用Unity开发VR应用

    千次阅读 2018-07-01 18:40:04
    VR(Virtual Reality的缩写,中文翻译—虚拟现实)概念早在80年代初就被提出来的,其具体是指借助计算机及最新传感器技术创造的一种崭新的人机交互手段。 中国VR产业仍在摸索阶段,亟缺复合型专业人才。据领英的全球...

    VR(Virtual Reality的缩写,中文翻译—虚拟现实)概念早在80年代初就被提出来的,其具体是指借助计算机及最新传感器技术创造的一种崭新的人机交互手段。


    中国VR产业仍在摸索阶段,亟缺复合型专业人才。据领英的全球人才库数据显示,正在起步期的中国VR产业,单以绝对人数来看,并不缺乏VR从业者。但高质量、专业的VR人才的储备不完善,当前很多VR人才都是为了业务发展需求而从企业其他部门抽调而来的,同时,产业生态建设和产业链部分环节的缺失,成了限制产业发展的一大重要因素。前段时期,小米CEO雷军接受《日本经济新闻》专访,雷军表示小米已经成立研发中心开发VR产品,未来5年才能成熟。3月18日下午,阿里巴巴宣布成立VR实验室,4月1日下午,淘宝推出全新购物方式Buy+,利用计算机图形系统和辅助传感器,生成可交互的三维购物环境。 
    三维购物环境 
    这样炫酷的三维视觉技术,不仅是可以让你随时随地的身临其境的购物,更是可以随意切换场景,对比买回家之后的效果。据阿里巴巴透露,该计划将于四月后上线。是不是很期待?


    VR发展的障碍仍然是如何加入其它的感知,比如嗅觉、味觉、触觉。为了达到这一目的,计算机必须能够实现和人脑的交互,这是技术上的最大的难点。中国的VR产业迅速爆发,在短期内资本大量注入,商业展示、线下体验店等多种形式的商业化进程遍地开花,但一方面又缺乏足够成熟的产业生态体系支持长期发展。众多的VR 线下体验店基本主打单一内容体验,盈利来源于消费者对于VR的好奇心。但单一化的内容体验能够持续多久,或许是商家最难预判的难题。因此,商家更需要的是内容提供商在内容差异化上做出更多创新,才能让其商业模式得到可持续发展。


    2016年,虚拟现实迎来井喷式发展,数据显示,预计到2018年,VR用户将达到675.2万,2020年将近3000万。而最近除了国美与暴风魔镜在北京国美马甸店正式揭幕号称国内最大移动VR线下体验馆——“暴风魔镜国美移动VR体验馆”。随后,苏宁控股董事长张近东在2016中国电子商务大会上表示,未来3个月将在全国建设300个VR体验馆,打造中国最大的VR体验平台。如今,不少一二线城市各种VR体验店犹如雨后春笋,成为VR线下体验的急先锋。如万达院线、IMAX,也相继宣布加入VR线下体验的阵营。据此,距离中国VR市场成熟已经不远了,很快VR将进入人们的生活中。


    还有一个大家关心的问题,就目前而言,虚拟现实技术还属于新生事物,由于使用了各种的高科技配置,因此成本较高。去年Facebook的首席执行官马克·扎克伯格展示的Oculus Rift头盔,预售价格为399美元(约合人民币3920元),这对普通用户来说是一笔不小的金额,所以,这也是阻碍VR市场成熟的阻力。 
    这里写图片描述



    浅谈Unity与VR

    对于大多数人来说,可能不知道Unity3D是什么,但是却知道VR虚拟现实是什么,更不会把VR虚拟现实和Unity3D联系在一起,外行的人根本不知道这两者之间有什么关系。那么,今天奇酷学院(www.qikuedu.com)Unity3D培训老师来给你讲解一下Unity3D与VR虚拟现实之间的区别和联系分别是什么?

      了解Unity3D与VR虚拟现实之间的区别和联系之前,我们首先要弄明白,什么是Unity3D?什么是VR虚拟现实?搞清楚这两个名词的含义,有助于帮助我们接下来对这两者之间的区别和联系的理解。

      

      什么是Unity3D?Unity3D是一软专业3D游戏引攀,其具备跨平台发布、离效能优化、高性价比,AAA级游戏画面演染效果等特点。目前Unity3D应用范围广泛,从手机游戏到联网的大型游戏,从严肃游戏到电子商务,再到VR虚拟现实均可完美呈现。

      什么是VR虚拟现实?虚拟现实(VirtualReality,简称VR),是由美国VPL公司创建人拉尼尔(JaronLanier)在20世纪80年代初提出的。具体内涵是:综合利用计算机图形系统和各种现实及控制等接口设备,在计算机上生成的、可交互的三维环境中提供沉浸感觉的技术。

      

      通过什么是Unity3D?什么是VR虚拟现实?这两个名词的解释,不难发现,VR虚拟现实是通过Unity3D开发引擎,结合其他语言基础做出来的效果,也就是说,学会Unity3D开发引擎,可以从事VR虚拟现实的相关工作。简单来说Unity3D开发引擎是工具,VR虚拟现实是结果。

      目前全球已超过九十万名开发者使用Unity3D,而且作品数量不断与日俱增,尤其目前在AppStore内有超过1500种移动平台游戏以及横跨许多国家上百个网页游戏都是以Unity3D为平台所开发的。这些开发者也包含许多国际知名厂商,例如法国育碧Ubisoft,美商艺电ElectronicArts,德国游戏巨头Bigpoint公司、迪斯尼Disney、乐高LEGO等。

      Unity3D开发引擎的产品特点

      1.支持多种格式导入:

      整合多种DCC文件格式,包含3dsMax,Maya,Lightwave,Collade等文档,可直接拖拽到Unity中,除原有内容外,还包含Mesh、多UVs,Vertex,Colors、骨骼动画等功能,提升7游戏制作的资源应用。

      2.AAA级图像渲染引擎:

      Unity渲染底层支持DirectX和OpenGL。内置的100组Shader系统,结合了简单易用,灵活,高效等特点,开发者也可以使用ShaderLab,建立自己的Shader。先进的遮挡剔除(OcclusionCulling)技术以及细节层级显示技术(LOD),可支持大型游戏所需的运行性能。

      3.高性能的灯光照明系统:

      Unity为开发者提供高性能的灯光系统,动态实时阴影、HDR技术、光羽&镜头特效等。多线程渲染管道技术将渲染速度大大提升,并提供先进的全局照明技术(GI),可自动进行场景光线计算,获得逼真细腻的图像效果。

      4.NVIDIA专业的物理引擎:

      Unity支持NVIDIAPhysX物理引擎,可模拟包含刚体&柔体、关节物理、车辆物理等。

      5.高效率的路径寻找与人群仿真系统:

      Unity可快速烘焙三维场景导航模型(NavMesh),用来标定导航空间的分界线。目前在Unity的编辑器中即可直接进行烘焙,设定完成后即可大幅提高路径找寻(Path-finding)及人群仿真(CrowdSimulation)的效率。

      6.友善的专业开发工具:

      包括GPU事件探查器、可插入的社交API应用接口,以实现社交游戏的开发;专业级音频处理API、为创建丰富通真的音效效果提供混音接口。引擎脚本编辑支持Java,C#,Boo三种脚本语言,可快速上手、并自由的创造丰宫多彩、功能强大的交互内容。

      7.逼真的粒子系统:

      Unity开发的游戏可以达到难以皿信的运行速度,在良好硬件设备下,每秒可以运算数百万面以上的多边形。高质量的粒子系统,内置的Shuriken粒子系统.可以控制粒子颜色、大小及粒子运动轨迹,可以快速创建下雨、火焰、灰尘、爆炸、烟花等效果!

      8.强大的地形编辑器:

      开发者可以在场景中快速创建数以千计的树木,百万的地表岩层,以及数十亿的青青草地。开发者只铸完成75%左右的地貌场景,引擎可自动填充优化完成其余的部分。

      9.智能界面设计,细节凸显专业:

      Unity以创新的可视化模式让用户轻松建构互动体验,提供直观的图形化程序接口,开发者可以玩游戏的形式开发游戏,当游戏运行时,可以实时修改数值、资源甚至是程序,高效率开发,拖拽即可。

      10.市场空间:

      iOSAndroid,Wii,Xbox360,PS3多平台的游戏发布。仅需购买iOSPro或AndroidPro发布模块就可以在iPhone或iPodTouch或Android系统等移动终端上创建任何酷炫的二维三维、多点触控、体感游戏,随后可将游戏免费发布到自己的移动设备上测试运行,增添修改的方便性。

      11.单机及在线游戏发布:

      Unity3D支持从单机游戏到大型联网游戏的开发,结合Legion开发包和Photon服务器的完美解决方案,轻松即可创建MMO大型多人网路游戏。而且在开发过程中,Unity3D提供本地客户《NativeClient)的发布形式,使得开发者可以直接在本地机器进行测试修改.带助开发团队编写更强大的多人连线应用。

      12.TeamLicense协同开发系统:

      TeamLicense可以安装在任何Unity里,新增的界面可以方便用来进行团队协同开发。避免不同人员重复不停的传送同样版本的资源至服务器,维持共用资源的稳定与快速反应其中的变化,过长的反应更新时间将会影响团队协同开发的正确性与效率。

      13.可视化脚本语言u:

      可视化脚本编辑语言u,具有高度的友好界面、整合性高、功能强大、修改容易等特点。开发者只祷将集成的功能模块用连线的方式,通过逻辑关系将模块连接,即可快速创建所铸脚本功能,非常适合非编程人员与项目制作使用。

      14.Substance高写真动态材质模块:

      Substance是一个功能强大的工具,通过任何的普通位图图像,直接生成高品质的次时代游戏设计专用材质(法线图,高度图,反射贴图等》,为DCC工具或游戏引擎(如Unity3D)提供高级的渲染效果。

      在Unity3D这么强大的技术支持下,VR虚拟现实的效果是可以轻而易举的实现,其中人机交互技术是密不可分的组成部分,人机交互技术主要研究方向有两个方面,分别是:人如何命令系统;系统如何向用户提供信息。众所周知,人在使用计算机方面的感受(即人机交互部分的友好度)直接影响到人对系统的接受程度,而这两个方面直接决定了人机交互部分的友好度,这是Unity3D与VR虚拟现实之间的主要关联。

      虚拟现实在各个行业和领域应用得越来越广泛,而同时也暴露出了一些不可忽视的问题,如对现实世界的隔离,与人类感知外部世界的方式有冲突等等。这些问题,都需要Unity3D开发引擎进行调整和研发,Unity3D开发引擎将计算机生成的虚拟物体或关于真实物体的非几何信息叠加到真实世界的场景之上,实现了对真实世界的增强,同时,由于用于与真实世界的联系并未被切断,交互方式也就显得更加自然,这就是两者之间亲密结合的成果,也是目前最热门的VR虚拟现实受大家喜欢的根本所在。



    用Unity开发第一款VR应用

    随着Oculus宣布1月6日开启预售,2016年很可能成为VR游戏元年,但很多的调研显示,手游设备才是市场增长的关键,SuperData发布的报告显示,2016年全球VR游戏市场规模预计在51亿美元左右,消费者设备安装量在3890万左右,凭借价格门槛的优势,以谷歌Cardboard和三星Gear VR为代表的移动VR设备很大可能成为用户量最大的设备,可能占据2016年虚拟现实设备安装量71%的份额,达到2700万。


    最近,一位从事VR游戏研发的开发者在自己的博客中展示了如何用Unity和Cardboard把一款3D游戏变成VR游戏的方法,他在文章最后还表示,你甚至可以用这种方法把游戏转化为AR游戏,或者从头开始做新的VR游戏,以下是Gamelook编译的博文:


    很多的科幻电影都展示了用人类意志控制物体的能力,但到目前为止,这仍旧是一种幻想,目前还没有技术可以实现这一点。在这份新手教学博客中,你可以学到如何用Unity做一款兼但的虚拟现实游戏,配合谷歌Cardboard创造比较简单的VR体验,本文主要讲的是:


    把Cardboard摄像头集成到你的游戏中;调整UI元素以适应VR模式;做VR模式下可以选择的按钮;在游戏运行的时候程序化地把游戏在常规和VR模式下进行切换。


    什么是谷歌Cardboard?


    理论上说,创造VR体验是非常直接的,你在屏幕上展示的并不是一个单独的图片,而是需要2个。因为它们来自位置相隔几英寸距离的两个摄像头,玩家们从左摄像头看到的是左边图像,右边看到的则是右边图像,这就创造了游戏景深。


    此外,再加上一些不错的动态传感器,你可以探测到用户面朝哪个方向。把这些和你所创造的3D世界结合起来的话,就可以获得一个沉浸感很强的游戏体验。在实际情况中,在一个高分辨率的屏幕上展示两个图像需要非常复杂的硬件,还需要可以追踪玩家的头部运动,把所有的功能集成到一个设备商,还要控制其重量,以免让用户戴起来太累。


    然而,随着谷歌Cardboard的出现,每一台智能机都有可能与Cardboard协作,可以用你手机的屏幕与传感器,把它们变成VR设备的一种,而你所需要的,只是一些Cardboard和塑料镜片。


    开始准备


    需要注意的是,你可能大量用到Unity GUI,所以如果从来没有尝试过这个工具,那么最好是看看Unity GUI教程。想要用Google Cardboard做出自己的VR游戏,你需要以下工具:


    Unity专业版,版本5以上;一部智能机,可以是iPhone 5代以后的iOS设备,也可以是4.3以上版本的Android设备。需要说的是,本文假设你是在用iPhone获得VR游戏体验。


    如果你从来没有用过Unity而且也不熟悉界面,那最好是去读Unity教程介绍

    可能会有人说,我如何获得一个Cardboard硬件呢?


    当然,如果还没有Cardboard设备的话,最好是从供应商那里选购,价格加运费大约是20-30美元,如果你觉得自己非常善于DIY,也可以动手做自己的版本。在购买Cardboard的时候,要注意提到V2或者Cardboard 2.0的字样,因为它们适配大量的手机,包括大屏幕的iPhone 6+在内,它们还支持用户通过按钮进行输入操作。


    没有Cardboard设备可以吗?


    从某种程度上说,是可以的,你仍然可以在自己的设备上运行做出来的游戏,它看起来会是这样的(下图):

    在玩游戏的时候,如果你用恰当的方式盯着屏幕看,也可以找到VR的感觉。如果你四处移动手机,就可以进行控制。虽然你也可以玩这款游戏,还能够看到游戏的实际效果,但这种体验是比较有限的。


    长话短说,如果你没有足够的耐心等待Cardboard到货,你仍然可以从本文中学到东西,只是,如果有合适的设备,你能够学的东西更多。


    样本游戏:Ninja Attack is Back!


    投入一些时间尝试这个样本游戏,下载并解压这个Unity新手项目。接下来就是运行Unity,在欢迎界面,选择打开(Open)-找到StarterNinja文件夹,打开NinjaAttack项目。


    在项目浏览器(Project Browser)中,在Assets里双击MainScene按钮,然后点击Play尝试一下这款游戏。在图片中,你是左边的忍者,随着怪兽在屏幕中出现,你可以在屏幕上点击任何地方释放一个忍者之星消灭怪兽,在击杀20个怪兽之后,你就赢了,但是,如果怪兽到达了左边的红色区域,你就输了。

    这款游戏看起来很熟悉是吗?熟悉的读者可能会发现,它其实就是我之前介绍SpriteKit以及Cocos2D教程用到的游戏,不过与之不同的是,这里的游戏是用3D渲染的。当然,你并不一定能够真正地看到非常酷炫的3D效果,这款游戏使用的是上帝视角,所以对所有的polygon进行渲染总觉得浪费时间,所以,你现在可以发现为什么这款游戏非常适合做成VR了。


    开始使用Cardboard


    你需要做的第一件事就是为Unity下载Cardboard SDK。接下来,把它导入到你的项目中。从Unity的主菜单,选择Assets\Import Package\Custom Package,然后选择你刚刚下载的CardboardSDKForUnity.unitypackage。确保所有东西都被选中,反选Legacy文件夹,然后点击Import按钮。

    为了让你的游戏作为一个VR体验,你需要用到一些技巧,在Project Browser中的Cardboard\Prefabs文件夹里,把CardboardMain Prefab拖拽到你的场景中,在Inspector中,给其赋予和你的忍者角色一样的位置(5.53,1.13,0.122),并且要进行90度Y Rotation。


    你会发现的是,它比忍者的中心部位略高,这样可以展现出你在看他的眼睛。

    接下来,选择主摄像头(Main Camera)并且在Inspector中反选,做raccoon忍者对象的时候也需要同样的操作。现在,把游戏在Unity编辑器中再次运行,你就会看到一些类似于3D场景的东西。如果你在移动鼠标的时候按住选择键,你的摄像头就会随着头部的运动进行旋转。

    在iOS设备上运行你的游戏场景


    在Unity编辑器中运行你的游戏是非常不错的,但最后一次检查的时候,用VR头盔配上电脑显示器看起来会让人很痛苦,所以我们需要适配到iPhone上。

    选择File\Build Settings,iOS应该已经被选为你的默认平台,点击Click Player Settings然后转换到Inspector。


    在Resolution and Presentation菜单下,把Default Orientation设置成Landscape Left。


    在其他设置(Other Settings)中,把Bundle Identifier改成你的公司所需要的东西,比如com.(你的公司名).NinjaAttackVR。


    把目标设备改为iPhone,把iPhone和电脑进行连接,选择Build和Run,然后给输出文件夹命名,这个名字你可以随意取。

    这时候,Unity就会导出你的项目,然后它就会自动在Xcode中打开,如果没有打开,启动Xcode并且手动打开生成后的项目,运行然后在手机上尝试。首次运行游戏的时候,你需要一系列的设置过程,比如可以在Cardboard硬件上扫描二维码,这样Cardboard SDK就可以根据你的设备、距离等进行画质微调。


    需要注意的是,如果设置过程中,你在扫描二维码的时候出现了 网址打开错误,那就必须调整Xcode项目中的info.plist,苹果开发者论坛中有说到这个问题,感兴趣的童鞋可以亲自查阅。

    接着,把你的手机插入Cardboard当中,来回转头以调整摄像头视角,你就可以看到相对不错的3D画面了。


    再一次把它做成游戏


    能够看到你的游戏世界是非常不错的,但初次之外,你还需要把玩法加入到游戏中,特别是你需要从忍者面朝的方向扔出忍者之星,这是你将要做的第一个玩法。


    对于UI来说,Cardboard支持一个按钮,看起来可能是比较有限,但如果把它和头部的动态追踪相结合的话,它可以做出更为复杂的互动。在《Ninja Attack》中,你通过Cardboard.SDK.VRModeEnable资源侦测玩家是否开始了VR模式,检查按钮是否和Cardboard.SDK.Triggered资源同时按下去了,如果这些值都对,就可以在用户面朝的方向扔出忍者之星。


    打开你的NinjaStarLauncher.cs脚本,你会发现它在Inspector里是和GameLogic GameObject连在一起的。


    创造一个新的private变量:


    private Vector3 _vrShooterOffset;


    把它在Start() method中初始化:


    _vrShooterOffset = new Vector3(0.0f, -0.4f, 1.0f);


    用以下代码替换Update ():

    这就可以运行了,接下来我们看看Update()是做什么的:


    你首先检查游戏是否在VR模式,用户是否按下了按钮检查Cardboard.SDK singleton object上的资源。


    在此之后,你可以调用LaunchNinjaStarFrom()释放一个忍者之星,你需要用到两个parameter:


    第一个是GameObject头文件,Cardboard库会为你调出来,所以它应该是已经指向了正确的位置;第二个是轻微偏移,这样你面前的忍者之星就会看起来更真实,否则的话你扔出去的忍者之星就像是在四只眼之间进行运动,虽然看起来很cool,但给人的感觉很奇怪。


    由于你的Ninja Star GameObject已经被设计飞往特定方向,所以它会朝着正确的方向进攻。


    再试一次,这时候,你可以转头扔向坏人,输赢logic仍旧起作用。

    解决Game Over菜单


    你可能已经注意到了,当游戏结束的时候,用之前的Game Over按钮,你的角色仍旧是在屏幕的左边。这款游戏用到了Display Canvas来展示Game Over界面,Unity最新的GUI教程中有讲到这一点,它总是出现在游戏窗口的顶部。这个标签适用于大多数的游戏GUI,因为它可以自动适应到你屏幕的上方,不论你的摄像头在做什么,而且它可以非常不错地适应不同屏幕尺寸。

    但在这个案例中,你需要一个存在于游戏世界中的GUI canvas,有一部分原因是它可以在3D环境中更好渲染,但还因为不希望把玩家爱是叫锁定到摄像头上。你的玩家们需要可以上下自由地看,这样他们可以看到不同的UI元素,找到最活跃的然后点击按钮。


    创造一个新的Canvas


    在Hierarchy菜单下选择GameOverCanvas,右击并且选择复制,重命名为VRGameOverCanvas,这样可以使它与原来的进行区别开来,把GameOverTxt重命名为VRGameOvertxt。

    在VRGameOverCanvas组件中,把渲染模式改为World Space。


    在Rect Transform组件中,把位置改为(-2.24,1.1,0.07),然后进行90度Y Rotation

    最后,把X和Y Scale改为0.009,当所有一切完成的时候,VRGameOverCanvas看起来因该是这样的:


    你可以在Game View视角下看到两个canvas是大致重叠的(当游戏不运行的时候):

    这些值是哪里来的呢?坦白地说,我其实是调整到自己通过Cardboard摄像头看起来比较不错为止。有时候,编程更多的是一门艺术而不是学科。


    支持两个Canvas


    接下来,你需要更改GameController.cs,这样它才会发现两个Canvas打开和GameLogic GameObject脚本,它也是和GameLogic GameObject联系在一起的。把以下的两个公共变量加入到你的class里:


    public Canvas VRGameOverCanvas;
    public Text VRGameOverTxt;


    在resetGame()的开始加入如下代码:


    VRGameOverCanvas.enabled = false;


    用以下代码取代Gameover():


    public void GameOver(bool didIWin) {
    isGameOver = true;
    _didIWin = didIWin;
    string finalTxt = (_didIWin) ? “You won!” : “Too bad”;
    if (Cardboard.SDK.VRModeEnabled) {
    VRGameOverCanvas.enabled = true;
    VRGameOverTxt.text = finalTxt;
    } else {
    gameOverCanvas.enabled = true;
    gameOverTxt.text = finalTxt;
    }
    }


    这个展示了正确的Canvas和Text对象,取决于你是否在VR模式(开启Cardboard.SDK.VRMode).

    在你保存了脚本之后,你需要把正确的对象分配到新的公用变量。在Inspector里找到GameController,点击每个新变量旁边的目标,然后选择VRGameOverCanvas对象作为你的VR游戏Over Over Canvas变量,把VRGameOverTxt对象选为你的VR Game Over Txt变量。


    需要注意的是,可能你会奇怪,为什么是很麻烦地支持两个Canvas而不是至改变现有的一个呢?原因是,你既需要支持上帝视角,还需要支持VR模式,所以一定要进行优化。


    如果你准备现在就运行游戏,就可以发现VR模式里的游戏结束界面展示的很自然。你可以上下看界面的不同部分,现在所有缺少的东西就是再来一次的按钮。

    增加Gaze输入方式


    幸运的是,Unity内置了‘在使用world-space GUI Canvas的时候,摄像头中心点可以作为鼠标使用’,但你需要提供额外的脚本才能使它在VR界面中进行使用。

    首先,扩展Cardboard Main\Head,找到主摄像头并把它重命名为VR Main Camera。选中VRGameOverCanvas对象,你们应该可以看到一个事件摄像头,点击Hierarchy里的EventSystem项目,点击增加组件按钮,并增加GazeInpute Module脚本。这个脚本可以确保Unity的GUI系统了解Cardboard摄像头的工作方式。


    检查VR Mode Only,因为在VR模式下的时候,只需要这么运行就可以了。最后,点击你刚刚增加的Gaze Input Module Component,然后选择Move Up,重复一次,确保它可以出现在触屏输入和独立输入模式中,这可以确保Gaze Input Module在游戏进行的同时优先选择输入方式。当所有都做好的时候,它看起来应该是这样的:

    现在,你就可以进行尝试了。这一次,当你把视角放到Play Again按钮的时候,它就会变绿,让你重新开始一场新的游戏。

    玩法微调


    或许你会发现这个版本的游戏在VR模式下玩起来有点难,这是因为你的视角是缩水的,所以在你看着错误的方向时,敌人很容易从你身边溜过去。而且,你无法迅速改变瞄准方向,你会因为脖子转速的限制而影响到游戏操作。你让玩家体验VR模式并不是为了惩罚他们,所以,你该如何调整呢?当然,可能会有人建议把敌人速度降低。


    在Prefabs文件夹中选中EvilSlimeEnemy Prefab,然后打开EnemyMover.cs,把以下代码增加到Start(),随后设置速度:


    这会让你的游戏在VR模式下变得更简单,所以玩家们不至于因为选择了VR模式就获得糟糕体验。


    解决屏幕上的分数显示问题


    你还需要解决的一个UI问题是屏幕上的分数,这个就需要不同的方式来处理了。虽然它仍然需要在VR模式中恰当的被显示出来,但你更希望它在你看任何方向的时候都固定在摄像头上。


    选中Cardboard Main\Head,右击并选择UI\Canvas,重命名新的canvas为VRScoreCanvas,把渲染模式调整为World Space,为其赋予以下值:


    位置(0,1,2.5)、宽度400、高度100、旋转(0,0,0)、Scale(0.0115,0.0115,1)。当完成之后,游戏看起来该是这样的:

    看起来可能你的文本很奇怪地放在了屏幕中央,但在VR模式里,你能够看到的世界比正常情况下是少很多的,所以你在游戏中看到分数的时候应该是在边缘部位的,你可以自由进行位置调整,以使其适应你的手机。


    接下来,使用文本对象展示你的分数,这个过程和Game Over的做法类似。

    打开GameController.cs并增加一个新的公用变量:


    public Text VRScoreTxt;


    接下来,你每次更新scoreTxt的时候都需要更新VRScoreTxt,在ResetGame() method中,把以下代码加在每次更新后的scoreTxt之后:


    VRScoreTxt.text = “–“;


    然后把这行代码增加到GotOne(),也放在更新scoreTxt的后面:


    VRScoreTxt.text = “” + _currScore;


    保存你的脚本,回到Unity,然后你会发现GameLogic当中的GameController Component如今可以输入VR Score Txt变量了,点击临近的目标然后选择你的VRScoreTxt文本对象。

    再次体验你的游戏,现在,你就可以看到分数出现在左上角了,还可以允许你的头部进行运动。


    VR模式的切换


    由于你的游戏同时支持上帝视角和VR模式,你应该给用户自由切换的选择,UI做起来是很直观的,你只需要在上帝视角模式中加入一个简单的按钮,让玩家们来回切换模式即可。


    首先,你需要增加切换的代码,选择Hierarchy里的GameLogic,点击增加组件,选择新脚本(New Script)然后把脚本命名为CardboardSwapper。
    打开并用以下内容替换class代码:

    这个class里最重要的method就是ActiveVRMode,它是用来激活Cardboard的VR模式的。其余的logic负责控制场景中的多个GameObject,取决于是否处于VR模式,你在上帝视角是看不到某些东西的。


    你还可以发现的是,当你侦测后面按钮的时候调用了Switch(),这个功能非常适合测试。


    你还需要为GameController脚本增加更多的logic,这样它才能在切换模式的时候展示或者隐藏一些东西,打开GameController.cs,把这个method加进去:


    public void RefreshGameOver() {
    gameOverCanvas.enabled = false;
    VRGameOverCanvas.enabled = false;
    if (isGameOver) {
    GameOver(_didIWin);
    }
    }


    保存一切然后重新回到Unity界面,选择GameLogic然后向下滚动到Cardboard Swapper组件,对于Cardboard Object数列,把它的大小赋值为1,然后放到场景中的CardboardMain GameObject中。这样不仅可以禁用你的Cardboard Head让你回到上帝视角摄像头模式,还可以禁用VRScoreCanvas。


    对于Mono Object数列,把它的大小赋值为3,然后为你的场景选择Canvas、Main Camera和raccoon ninja,不要从Assets里选择。


    最后你需要在上帝视角canvas为用户增加一个按钮,为了节约时间,我已经把它做好了,位于prefabs文件夹中。


    从Assets\Prefabs中把CardboardButton推拽到Hierarchy,这样它就成为了你的Canvas对象的子对象,确保其位置设定是(-50,50,0):


    在你的按钮对象底部,把它们连接起来,这样点击按钮的时候就可以调用CardboardSwapper.Switch() method,你可以从这个动画看看是如何做出来的:

    再次尝试你的游戏,点击屏幕右下方的按钮切换至VR模式,然后单机Cardboard界面背后的按钮切换到上帝视角模式。做到这里,你的VR模式切换就已经完成了。

    现在,你可以把Unity中的任何3D游戏做成VR游戏了,而且只需要一个Cardboard和一些塑料镜片,这是可以让所有人都能够体验的VR游戏。Android版本的做法和iOS大致相同,谷歌的Unity Developer指南还提供了更多的技术信息。最后,你甚至可以为你的VR游戏增加AR功能。


    最后,你可以尝试Unity里所有的3D游戏,看是否能够顺利地做成VR体验,或者,这个教程也可以让你做出全新的VR游戏。



    ——————————————————————————————————————–
    【转】Unity3D关于VR的Demo:
    ——————————————————————————————————————–
    Unity3D官方VR的Demo:
    ——————————————————————————————————————–

    声明

    欢迎转载,但请保留文章原始出处
    作者:Jaiky_杰哥 
    出处:http://blog.csdn.net/jaikydota163/article/details/52743770


    by Wang

    展开全文
  • VR开发

    2017-10-19 13:30:29
    UE4下的VR开发– author:longlongwaytogolink: 本文主要通过一个案例,讲述UE4下使用HTC Vive设备,对VR项目的开发过程。1. 开发准备:VR设备: Htc Vive 软件: UE4.17 2. 主要步骤: 使用UE4的VR模版创建VR工程 ...


    author:longlongwaytogo
    link:
    https://github.com/longlongwaytogo/UE4VRDemo/blob/gitHub_master/docs/VR%E5%BC%80%E5%8F%91.md


    本文主要通过一个案例,讲述UE4下使用HTC Vive设备,对VR项目的开发过程。

    1. 开发准备:

    VR设备: Htc Vive
    软件: UE4.17

    2. 主要步骤:

    • 使用UE4的VR模版创建VR工程
    • 分离左右手柄
    • 添加右手手柄
    • 给右手绘制射线
    • 导入fbx场景测试
    • 对左手添加Navgation Mesh

    2.1. 使用UE4的VR模版创建VR工程

    • UE4本身包含有创建VR项目的template,可以通过该template创建VRDemo项目,如图:

      • 对项目进行修改:
        删除startMap,配置启动map

        打开:编辑->项目设置,找到”地图模式”选项,将Editor start map 修改为 MotionControllerMap。

    2.2 分离左右手柄

    打开资源浏览器,Content\VirtualRealityBP\Blueprints目录,如图:

    选择蓝图MotionControllerPawn,并打开,删除右手RightController的相关操作。

    现在,右手手柄已经不起作用了。

    2.3 添加右手手柄

    切换到Content\VirtualRealityBP\Blueprints目录,创建新的蓝图类(Actor类型),命名为:RightController。
    打开该蓝图,在组件栏添加MotionController组件,命名为:MotionController_R,并将Motion Controller的属性改为Right(绑定右手手柄)。再添加子节点skeletal Mesh,命名为:HandleMesh,HandleMesh下再添加Spline组件(是Utility中的spline,不是spline Mesh),命名为:spline(用于后面绘制射线),如图:


    选中handleMesh,在其Detail属性面板中,设置Mesh为:MannequinHand_Right,在视口中即可看到手柄模型:

    修改HandleMesh的偏移和旋转坐标为:(参考左手手柄)

    然后,在蓝图添加Hand变量,类型为:EController Hand:

    同时,需要对hand变量的属性作如下设置,以保证Hand变量可以在蓝图中显示:

    切换到MotionControllerPawn蓝图,找到RightController变量,修改其类型为:Right Controller的对象类型:

    修改Create RightController的蓝图逻辑,关联RightController:

    此时,已经将左右手柄分离。

    2.4 给右手绘制射线

    射线的绘制,需要用到spline组件来完成,具体的spline用法,可以参考:
    https://www.youtube.com/watch?v=MqPeFIEJUmg
    打开RitghtController蓝图的事件图表,添加允许接受手柄输入(GetPlayer的输出做为EnableInput的PlayerController的输入,不要连接错了,否则无法触发事件):

    添加TeleportRight事件,添加TracedEnable 布尔类型变量,设置spline的可视性。

    添加ClearSpline函数:

    添加Destanation变量为:Vector类型,绘制Teleport的主要逻辑:

    添加射线求交逻辑:

    添加bHit为布尔型变量
    添加SplineMesh为Spline commponent类型的变量数组:

    编写spline的计算逻辑,图太大了,分为两张:

    完成以上蓝图,其工作量也不小,但不是看不到射线,还有一个步骤要做,添加mesh:
    可以通过3max制作一个Cylinder,导入UE中或使用系统的BeamMesh,并创建一个绿色材质:

    spline Mesh 绑定模型:Cylinder

    ok,启动看看:发现右手手柄可以求交,但射线显示错误:

    怎么成了弯的了,应该是spline的法线有问题,果然,以下逻辑少了根连线:

    经过修改后如下,但material无效:

    找了半天也没有结果,明天接着查。

    第二天:google了几个答案,这个链接比较靠谱:
    https://answers.unrealengine.com/questions/438758/material-wont-be-placed-on-spline.html,
    意思就是Material需要勾选”Used with Spline Meshes”选项,OK:


    测试了下,发现射线无法在未hit下显示,原来又有线连接错了:

    2.5导入fbx场景测试

    自己可以导入外部fbx

    2.6对左手添加Navgation Mesh

    导入新的fbx场景,需要手工添加Navgation Mesh,否则左手手柄无法求交。


    OK,总算完工了。

    展开全文
  • VR 与 AR 开发实战

    千次阅读 2019-07-05 10:04:31
    从虚渺的膨胀到实质的沉淀,本期 VR 与 AR 开发实战专题我们汇聚一线技术开发者,围绕性能优化、人机交互技术、新平台开发等话题,分享实践中心得与体验。 HoloLens 开发与性能优化实践(张昌伟,微软(中国)有限...

    内容简介

    从虚渺的膨胀到实质的沉淀,本期 VR 与 AR 开发实战专题我们汇聚一线技术开发者,围绕性能优化、人机交互技术、新平台开发等话题,分享实践中心得与体验。

    • HoloLens 开发与性能优化实践(张昌伟,微软(中国)有限公司 PFE 工程师)
    • Unreal Engine 4 VR 应用的 CPU 性能优化和差异化(王文斓,英特尔软件与服务事业群的资深软件工程师)
    • VR 中的交互之熵(王锐,开源图形引擎 OpenSceneGraph 的核心贡献者和推广者)
    • ARKit:简单的增强现实(张嘉夫,专注于 Apple 平台的个人开发者)

    本书内容

    Web 端 VR 开发初探

    文/张乾

    随着硬件和软件技术的发展,产业界对虚拟现实(Virtual Reality)用户体验产生了重大期望。技术的进步也使我们可能通过现代浏览器借助开放 Web 平台获得这种用户体验。这将帮助 Web 成为创建、分发以及帮助用户获得虚拟现实应用和服务生态系统的重要基础平台。

    引言

    2016年最令科技界激动的话题,莫过于 VR 会如何改变世界。一些电影已开始涉足 VR,让用户不仅能看到 3D 影像,更能以“移形换影”之术身临其境,带来前所未有的沉浸式观影体验;此外,游戏领域也开始 VR 化,用户再也不用忍受游戏包里单一的场景。这些酷炫效果带来了巨大想象空间,VR 正在走近人们的生活。然而现实是,除了偶尔体验下黑科技的奇妙外,VR 并没有真正普及,在资本和硬件厂商狂热的背后,质疑声也此起彼伏。

    目前,虽然 VR 硬件的发展已经走上了快车道,但内容却非常单薄。一部 VR 电影的成本相当高昂,VR 游戏也不逊色。内容创作成本的居高不下,导致了 VR 的曲高和寡。要想脱下那一层高冷的贵族华裳,飞入寻常百姓家,VR 尚需解决内容供给这一难题。以 HTML5 为代表的 Web 技术的发展,或将改变这一僵局。目前,最新的 Google Chrome 和 Mozilla Firefox 浏览器已经加入面向 HTML5 技术的 WebVR 功能支持,同时各方也正在起草并充实业界最新的 WebVR API 标准。基于 Web端的这些虚拟现实标准将进一步降低 VR 内容的技术创作成本及门槛,有利于世界上最大的开发者群体—HTML5(JavaScript)开发者进入 VR 内容创作领域。这不仅是 Web 技术发展历程上的显著突破,也为 VR 造就了借力腾飞的契机。

    Web 端 VR 的优势

    Web 可降低 VR 体验门槛

    Web 技术不仅使创作 VR 的成本更加低廉,而且大大降低技术门槛。WebVR 依托于 WebGL 技术的高速发展,利用 GPU 执行计算以及游戏引擎技术针对芯片级的 API 优化,提高了图形渲染计算能力,大大降低开发者进入 VR 领域的门槛,同时 WebVR 还可以更好地结合云计算技术,补足 VR 终端的计算能力,加强交互体验。可以肯定,Web 扩展了 VR 的使用范围,广告营销,全景视频等领域已经涌现一批创新案例,很多生活化的内容也纳入了 VR 的创作之中,如实景旅游、新闻报道、虚拟购物等,其内容展示、交互都可以由 HTML5 引擎轻松创建出来。这无疑给其未来发展带来更多想象空间。

    Web 开发者基数庞大

    除了技术上的实现优势,Web 还能给 VR 带来一股巨大的创新动力,因为它拥有着广泛的应用范围与庞大的开发者基数,能帮助 VR 技术打赢一场人民战争,让 VR 不再只是产业大亨们的资本游戏,而是以平民化的姿态,进入广大用户日常生活的方方面面。

    相信假以时日,VR 应用会像现在满目皆是的 App 一样,大量的 VR 开发者借助于 Web 端开发的低门槛而大量进入,同时各种稀奇古怪的创意层出不穷,虚拟现实成为电商商家必须的经营手段等。若到了这个阶段,VR 离真正的繁荣也就不远了。

    开发 Web 端的 VR 内容

    接下来我们通过实践操作来真正制作一些 Web 端的 VR 内容,体验 WebVR 的便捷优势。我们知道,许多 VR 体验是以应用程序的形式呈现的,这意味着你在体验 VR 前,必须进行搜索与下载。而 WebVR 则改变了这种形式,它将 VR 体验搬进了浏览器,Web+VR = WebVR 。在进入实践之前,下面先来分析一下 WebVR 实现的技术现状。

    WebVR 开发的方式

    在 Web 上开发 VR 应用,有下面三种方式:HTML5+ JavaScnipt + WebGL + WebVR API传统引擎 + Emscripten[1]第三方工具,如A-Frame[2]第一种方法是使用 WebGL 与 WebVR API 结合,在常规 Web 端三维应用的基础上通过 API 与 VR 设备进行交互,进而得到对应的 VR 实现。第二种是在传统引擎开发内容的基础上,比如 Unity、Unreal 等,使用 Emscripten 将 C/C++ 代码移植到 JavaScnipt版本中,进而实现 Web 端的 VR 。第三种是在封装第一种方法的基础上,专门面向没有编程基础的普通用户来生产 Web 端 VR 内容。在本文中我们主要以第一和第三种方法为例进行说明。

    WebVR 草案

    WebVR 是早期和实验性的 JavaScript API,它提供了访问如 Oculus Rift、HTC Vive 以及 Google Cardboard 等 VR 设备功能的 API。VR 应用需要高精度、低延迟的接口,才能传递一个可接受的体验。而对于类似 Device Orientation Event 接口,虽然能获取浅层的 VR 输入,但这并不能为高品质的 VR 提供必要的精度要求。WebVR 提供了专门访问 VR 硬件的接口,让开发者能构建舒适的 VR 体验。

    WebVR API 目前可用于安装了 Firefox nightly 的 Oculus Rift、Chrome 的实验性版本和 Samsung Gear VR 的浏览器。

    使用 A-Frame 开发 VR 内容

    如果想以较低的门槛体验一把 WebVR 开发,那么可以使 MozVR 团队开发的 A-Frame 框架。A-Frame 是一个通过 HTML 创建 VR 体验的开源 WebVR 框架。通过该框架构建的 VR 场景能兼容智能手机、PC、 Oculus Rift和 HTC Vive。MozVR 团队开发 A-Frame 框架的的是:让构建 3D/VR 场景变得更易更快,以吸引 Web 开发社区进入 WebVR 的生态。WebVR 要成功,需要有内容。但目前只有很少一部分 WebGL 开发者,却有数以百万的 Web 开发者与设计师。A-Frame 要把 3D/VR 内容的创造权力赋予给每个人,其具有如下的优势与特点:

    • A-Frame 能减少冗余代码。冗余复杂的代码成为了尝鲜者的障碍,A-Frame 将复杂冗余的代码减至一行 HTML 代码,如创建场景则只需一个<a-scene>标签。

    • A-Frame 是专为 Web 开发者设计的。它基于 DOM,因此能像其他 Web 应用一样操作 3D/VR 内容。当然,也能结合 box、d3、React 等 JavaScript 框架一起使用。

    • A-Frame 让代码结构化。Three.js 代码通常是松散的,A-Frame 在 Three.js 之上构建了一个声明式的实体组件系统(entity-component-system)。另外,组件能发布并分享出去,其他开发者能以 HTML 的形式进行使用。

    代码实现如下:

    // 引入A-Frame框架<script src="./aframe.min.js"></script><a-scene>  <!-- 定义并创建球体 -->  <a-sphere position="0 1 -1" radius="1" color="#EF2D5E"></a-sphere>  <!-- 定义交创建立方体 -->  <a-box width="1" height="1" rotation="0 45 0" depth="1" color="#4CC3D9" position="-1 0.5 1"></a-box>      <!-- 定义并创建圆柱体 -->  <a-cylinder position="1 0.75 1" radius="0.5" height="1.5" color="#FFC65D"></a-cylinder>  <!-- 定义并创建底板 -->  <a-plane rotation="-90 0 0" width="4" height="4" color="#7BC8A4"></a-plane>  <!-- 定义并创建基于颜色的天空盒背景-->  <a-sky color="#ECECEC"></a-sky>  <!-- 设置并指定摄像机的位置 -->  <a-entity position="0 0 4">    <a-camera></a-camera>  </a-entity></a-scene>

    上述代码在 A-Frame 中执行的效果如图1所示。

    图1  A-Frame运行结果

    图1 A-Frame 运行结果

    使用 Three.js 开发 VR 内容

    上文中我们提到另外了一种更加靠近底层同时更加灵活生产 WebVR 内容的方法,就是直接使用 WebGL+WebVR 的 API。这种方法相对于 A-Frame 的优势在于可以将VR 的支持方便地引入到我们自己的 Web3D 引擎中,同时对于底层,特别是渲染模块可以做更多优化操作从而提升 VR 运行时的性能与体验。

    如果没有自己的 Web3D 引擎也没有关系,可以直接使用成熟的渲染框架,比如 Three.js 和 Babylon.js 等,这些都是比较流行且较为出色的 Web3D 端渲染引擎(框架)。接下来就以 Three.js 为例,说明如何在其上制作 WebVR 内容。

    首先,对于任何渲染程序的三个要素是相似的,即是建立好 scene、renderer、camera。设置渲染器、场景以及摄像机的操作如下:

    var renderer = new THREE.WebGLRenderer({antialias: true});renderer.setPixelRatio(window.devicePixelRatio); document.body.appendChild(renderer.domElement);// 创建Three.js的场景var scene = new THREE.Scene();// 创建Three.js的摄像机var camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 0.1, 10000);// 调用WebVR API中的摄像机控制器对象,并将其与主摄像机进行绑定var controls = new THREE.VRControls(camera);// 设置为站立姿态controls.standing = true;// 调用WebVR API中的渲染控制器对象,并将其与渲染器进行绑定var effect = new THREE.VREffect(renderer);effect.setSize(window.innerWidth, window.innerHeight);// 创建一个全局的VR管理器对象,并进行初始化的参数设置var params = {  hideButton: false, // Default: false.  isUndistorted: false // Default: false.};var manager = new WebVRManager(renderer, effect, params);

    上述代码即完成了渲染前的初始化设置。接下来需要向场景中加具体的模型对象,主要操作如下所示:

    function onTextureLoaded(texture) {  texture.wrapS = THREE.RepeatWrapping;  texture.wrapT = THREE.RepeatWrapping;  texture.repeat.set(boxSize, boxSize);  var geometry = new THREE.BoxGeometry(boxSize, boxSize, boxSize);  var material = new THREE.MeshBasicMaterial({    map: texture,    color: 0x01BE00,    side: THREE.BackSide  });  // Align the skybox to the floor (which is at y=0).  skybox = new THREE.Mesh(geometry, material);  skybox.position.y = boxSize/2;  scene.add(skybox);  // For high end VR devices like Vive and Oculus, take into account the stage  // parameters provided.  setupStage();}// Create 3D objects.var geometry = new THREE.BoxGeometry(0.5, 0.5, 0.5);var material = new THREE.MeshNormalMaterial();var targetMesh = new THREE.Mesh(geometry, material);var light = new THREE.DirectionalLight( 0xffffff, 1.5 );light.position.set( 10, 10, 10 ).normalize();scene.add( light );  var ambientLight = new THREE.AmbientLight(0xffffff);scene.add(ambientLight);var loader = new THREE.ObjectLoader();loader.load('./assets/scene.json', function (obj){    mesh = obj;    // Add cube mesh to your three.js scene    scene.add(mesh);    mesh.traverse(function (node) {        if (node instanceof THREE.Mesh) {            node.geometry.computeVertexNormals();        }    });    // Scale the object    mesh.scale.x = 0.2;    mesh.scale.y = 0.2;    mesh.scale.z = 0.2;    targetMesh = mesh;    // Position target mesh to be right in front of you.    targetMesh.position.set(0, controls.userHeight * 0.8, -1);});

    最后的操作便是在 requestAnimationFrame 设置更新。在 animate 的函数中,我们要不断地获取 HMD 返回的信息以及对 camera 进行更新。

    // Request animation frame loop functionvar lastRender = 0;function animate(timestamp) {  var delta = Math.min(timestamp - lastRender, 500);  lastRender = timestamp;  // Update VR headset position and apply to camera.  //更新获取HMD的信息  controls.update();  // Render the scene through the manager.  //进行camera更新和场景绘制  manager.render(scene, camera, timestamp);  requestAnimationFrame(animate);}

    最后,程序运行的效果如图2所示,可以直接在手机上通过 VR 模式并配合 Google Cardboard 即可体验无需下载的 VR 内容[3]。

    enter image description here

    图2 Three.js 运行结果

    上述示例中的代码实现可从[4]中下载。

    经验与心得

    通过上述介绍我们基本可以实现一个具有初步交互体验的 Web 端 VR 应用,但这只是第一步,单纯技术上的实现距离真正的可工程化还有一定差距。因为最终工程化之后面向用户的产品必须比技术原型要考虑更多具体的东西,比如渲染的质量、交互的流畅度、虚拟化的沉浸度等,这些都最终决定用户是否会持续使用产品、接受产品所提供的服务等,所以将上述技术在工程化应用之前还有很多的优化与改进工作要做。以下是个人在做 Web 端 VR 应用过程中体会的一些心得经验,分享出来供读者参考。

    • 引擎的选用。如果是使用已有的 WebGL 引擎,则可参考[5]中的文档来进行 VR SDK 集成。这里边需要做到引擎层与 VR SDK 层兼容,以及 VR 模式与引擎的工具部分的整合,也可以参考桌面引擎如 Unity3D 和 Unreal 在 VR SDK 集成上的开发模式。如果选用第三方的 WebGL 引擎则有 Three.js 或 Babylon.js 等可选,这些主流的 WebGL 引擎都已经(部分功能)集成了 VR SDK。

    • 调试的设备。调试 Web 端的 VR 应用同样需要有具体的 VR 设备的支持。对于桌面 WebM 内容还是要尽量使用 HTC Vive 或 Oculus 等强沉浸感 VR 设备。对于移动 Web 应用,由于 Android 平台上的各浏览器的差异较大,表现也会不太一致,所以建议使用 iOS 设备进行开发与调试,但是在最终发布前仍要对更多的 Andnoid 设备进行适配性测试与优化。

    • 性能的优化。在 Web 端做三维的绘制与渲染,性能还是主要瓶颈,因而要尽可能的提高实时渲染的性能,这样才能有更多资源留给 VR 部分。目前的 WebVR 在渲染实时中并没有像桌面 VRSDK 一样可以调用众多的 GPU 底层接口做诸如 Stereo rendering 等深层次的优化,因而对性能的占用还是较多。

    • 已知的问题。目前,WebVR 仍然不太稳定,还会有诸多的 Bug,比如某些情况下会有设备跟踪丢失的情况,而且效率也不是太高。大多数 WebVR 应用可以作为后期产品的储备和预研,但要推出真正可供用户使用并流畅体验的产品,还是有较长的路要走。

    结束语

    许多人将即将过去的2016称为 VR 元年,在这一年中 VR 的确经历了突飞猛进的发展,体现在技术与生态等各个方面。在新的2017年,相信 VR 必将会有更大的发展与进步,作为技术工作者,我们更应该从自身的技术专长作为出发点,参与到新技术对社会与生活的变革中来。

    参考链接

    [1] http://kripken.github.io/emscripten-site/
    [2] https://aframe.io/
    [3] http://www.shxt3d.com/ WebVR /index.html
    [4] https://github.com/bugrunnerzhang/hello WebVR.git
    [5] https://mozVR.com/

    PC VR 游戏的 CPU 性能分析与优化

    文/王文斓

    伴随着全新 VR 体验所带来的双目渲染、高分辨率和低延时等要求,对 CPU 和 GPU 都造成了极大的计算压力,一旦 VR 应用出现性能问题,非常容易造成用户眩晕并带来极差的用户体验,因此性能问题对于 VR 体验的好坏格外重要。本文将集中介绍 VR 需要高计算量的原因,以及分享如何利用工具查找 VR 应用的性能问题和 CPU 瓶颈所在。

    自从三大头显厂商 Oculus、HTC 和 Sony 在2016年发布了虚拟现实(VR)头显产品后,由于能够带来卓越的沉浸式体验,VR 越来越受到市场的关注和重视,而 VR 也被认为会取代智能手机成为下一代的计算平台。然而,尽管虚拟现实能给用户带来身临其境般的沉浸式体验,但相比传统应用,其具有双目渲染、低延迟、高分辨率以及高帧率等严苛要求,因此极大地增加了 CPU 和 GPU 的计算负载。鉴于此,性能问题对于虚拟现实应用尤为重要,因为 VR 体验如果没有经过优化,容易出现掉帧等问题,让用户使用时发生眩晕的情况。在本文中,我们将介绍一种适用于所有游戏引擎及虚拟现实运行时(VR runtime)的通用分析方法,分析基于 PC 的 VR 游戏面临的性能问题。我们以腾讯的一款 PC VR 游戏《猎影计划》为例展示如何利用这套方法进行分析。在此之前我们先来了解一下 VR 游戏对性能要求较传统游戏高的四大原因。

    VR 游戏和传统游戏在硬件性能需求上的区别

    相较于传统游戏,VR 游戏由于存在高帧率、双目渲染及容易产生眩晕等特性,导致对于硬件计算能力的需求显著上升。下面从四个方面比较一下 VR 游戏和传统游戏的区别:

    像素填充率

    以一个 1080p 60fps 游戏为例,像素填充率为 124M pixels/sec。如果是支持高端 VR 头盔(Oculus Rift、HTC Vive)的游戏,像素填充率为 233M pixels/sec(分辨率 2160x1200,帧率 90fps)。但是中间需要一个较大的渲染目标,避免图像经过反形变校正后产生用户可见并且没被渲染到的区域,导致视角(FOV)降低。根据 SteamVR 的建议,需要放大的比率为1.4倍,所以实际的像素填充率为 457M pixels/sec(分辨率 3024x1680,帧率90fps),我们可以通过 stencil mesh 把最终不会被用户看到的区域剔除掉以减少需要渲染的像素,经过优化后的像素填充率为 378M pixels/sec,但仍然是传统 1080p 60fps 游戏的3倍像素填充率。

    图1  传统游戏渲染流程

    图1 传统游戏渲染流程

    双目渲染

    从游戏渲染管线的角度来看,传统游戏中每一帧的渲染流程大致如下,其中蓝色的部分是 CPU 的工作,绿色的部分是 GPU 的工作。但由于视差的关系,VR 游戏需要对左右眼看到的画面分别渲染不同的图像,所以下面的渲染管线也要对左右眼各做一次,从而增加了计算需求(在 VR 中两眼的视差较小,可以利用 GBuffer 或提交渲染指令后用 view matrix 变换等方法降低实际计算)。

    用户体验

    对于传统游戏来说,平均帧率达标往往就代表了一个流畅的游戏体验。然而对于 VR 游戏来说,即使平均帧率达标,但只要出现了连续掉帧,哪怕只有非常少数的情况下才发生,都会破坏了整个游戏体验。这是由于连续掉帧会使用户产生眩晕,一旦产生眩晕的感觉,即使后续的画面不掉帧,用户已经感觉到不适,游戏体验已经打了折扣。所以在游戏设计的时候,需要确保场景在最差的情况下也能达标(高端头显下为 90fps),否则会影响游戏体验。另外,由于在 VR 场景中用户可以跟可移动区域内的对象作近距离观察和交互,所以必须开启抗锯齿以保证画面的清晰度。

    延迟

    在传统游戏里从控制输入到画面输出的延迟往往达到约 100ms 的等级[1],FPS 类别的游戏对延迟要求较高,但一般也在约 40ms 的等级。而 VR 里 MTP 延迟(motion-to-photon latency,从用户运动开始到相应画面显示到屏幕上所花的时间)低于 20ms 是基本要求,研究发现对于部分比较敏感的用户,延迟需要达到 15ms 甚至 7ms 以下[2]。

    低延迟的要求除了使 VR 游戏必须运行在高帧率外,同时也降低了硬件的运行效率,导致同样的工作量需要更强的硬件来驱动,原因正是低延迟要求使 VR 游戏的渲染管线必须和传统游戏不一样,而其中 CPU 对 VR 性能的影响扮演了重要的角色。

    VR 游戏和传统游戏在渲染管线上的区别

    我们先来看看 VR 渲染管线和传统渲染管线的区别。如图2所示为传统游戏的渲染管线,其中 CPU 和 GPU 是并行处理的,以实现最高的硬件利用效率。但此方案并不适用于 VR,因为 VR 需要较低和稳定的渲染延迟,传统游戏的渲染管线无法满足此项要求。

    图2  传统游戏的渲染管线

    图2 传统游戏的渲染管线

    以图2为例,第 N+2 帧的渲染延迟会远高于 VR 对延迟的最低要求,因为 GPU 必须先完成第 N+1 帧的工作,再来处理第 N+2 帧的工作,因而使得第 N+2 帧产生了较高的延迟。此外,由于运行情况不同,我们可以发现第 N 帧、第 N+1 帧和第 N+2 帧的渲染延迟也会有所差异,这对 VR 的体验也是不利的,因为一直变动的延迟会让用户产生晕动症(simulation sickness)。

    因此,VR 的渲染管线实际上如图3所示,这样能确保每帧可以达到最低的延迟。在图3中,CPU 和 GPU 的并行计算被打破了,这样虽然降低了效率,但可确保每帧实现较低和稳定的渲染延迟。在这种情况下,CPU 很容易成为 VR 的性能瓶颈,因为 GPU 必须等待 CPU 完成预渲染(绘制调用准备、动态阴影初始化、遮挡剔除等)才能开始工作。所以 CPU 优化有助于减少 GPU 的闲置时间,提高性能。

    图3  VR游戏的渲染管线

    图3 VR 游戏的渲染管线

    《猎影计划》VR 游戏背景

    《猎影计划》是腾讯旗下利用 Unreal Engine 4 开发的一款基于 PC 的 DirectX 11 FPS 虚拟现实游戏,支持 Oculus Rift 和 HTC Vive。为了使《猎影计划》在英特尔处理器上实现最佳的游戏体验,我们与腾讯紧密合作,努力提升该游戏的性能与用户体验。测试结果显示,在本文所述的开发阶段,经优化后帧率得到了显着提升,从早期测试时跑在 Oculus Rift DK2(分辨率 1920x1080)上的每秒 36.4fps 提升至本次测试时跑在 HTC Vive(分辨率 2160x1200)上的每秒 71.4fps。以下为各阶段使用的引擎和 VR 运行时版本:

    1. 初始开发环境:Oculus v0.8 x64 运行时和 Unreal 4.10.2;
    2. 本次测试的开发环境:SteamVR v1463169981 和 Unreal 4.11.2。

    之所以在开发阶段会使用到不同的 VR 运行时的原因在于,《猎影计划》最初是基于 Oculus Rift DK2 开发的,稍后才迁移至 HTC Vive。而测试显示采用不同的 VR 运行时在性能方面没有显着的差异,因为 SteamVR 和 Oculus 运行时采用了相同的 VR 渲染管线(如图3所示)。在此情况下,渲染性能主要由游戏引擎决定。这点可在图6和图15中得到验证,SteamVR 和 Oculus 运行时在每帧的 GPU 渲染结束后才插入 GPU 任务(用于镜头畸变校正),而且仅消耗了少量 GPU 时间(约 1ms)。

    图4  优化前(左)后(右)的游戏截图

    图4 优化前(左)后(右)的游戏截图

    如图4所示为优化工作前后的游戏截图,优化之后绘制调用次数减少至原来的1/5,每帧的 GPU 执行时间平均从 15.1ms 缩短至 9.6ms,如图3和4所示:

    测试平台的规格:

    1. 英特尔酷睿 i7-6820HK 处理器(4核,8线程)2.7GHz
    2. NVIDIA GeForce GTX980 16GB GDDR5
    3. 图形驱动程序版本:364.72
    4. 16GB DDR4 RAM
    5. Windows10 RTM Build 10586.164

    初步分析性能问题

    为了更好地了解《猎影计划》的性能瓶颈,我们先综合分析了该游戏的基本性能指标,详情见表1。表中数据通过几种不同的工具收集,包括 GPU -Z、TypePerf 和 Unreal Frontend 等。将这些数据与系统空闲时的数据比较可得出以下几点结论:

    表1 优化前游戏的基本性能指标

    表1 优化前游戏的基本性能指标

    1. 游戏运行时的帧率低(36.4fps)而且 GPU 利用率也低(GTX980 上为49.64%)。如果能够提高 GPU 利用率,帧率也会提高。
    2. 大量的绘制调用。DirectX 11 中的渲染为单线程渲染,虽然微软提出 deferred rendering context[3]可以用另一线程对渲染指令进行缓存以实现多线程渲染,但结果差强人意[4]。所以相对于 DirectX 12,DirectX 11 渲染线程具有相对较高的绘制调用开销。由于该游戏是在 DirectX 11 上开发的,并且为了达到低延迟,VR 的渲染管线打破了 CPU 和 GPU 的并行计算,因此如果游戏的渲染线程工作较重,很容易会出现 CPU 瓶颈导致帧率显着降低。在这种情况下,较少的绘制调用有助于缓解渲染线程瓶颈。
    3. 由表中可以看出, CPU 利用率似乎不是问题,因为其平均值只有13.58%。但从下文更进一步的分析可以看出,《猎影计划》实际上存在 CPU 性能瓶颈,而平均 CPU 利用率高低并不能说明游戏是否存在 CPU 性能瓶颈。

    下面我们会利用 GPU View 和 Windows 评估和部署工具包(Windows Assessment and Deployment Kit,Windows ADK)[5]中的 Windows 性能分析器(Windows Performance Analyzer,WPA)对《猎影计划》的性能瓶颈进行分析。

    深入探查性能问题

    GPU View[6]工具可用于调查图形应用、CPU 线程、图形驱动程序、Windows 图形内核等性能和相互之间的交互情况。该工具还可以在时间轴上显示程序是否存在 CPU 或 GPU 性能瓶颈。而 Windows 性能分析器可用于跟踪 Windows 事件(Event Tracing for Windows,ETW),并生成相应事件的数据和图表;WPA 同时具备灵活的用户界面(UI),通过简单操作即可查看调用堆栈、 CPU 热点、上下文切换热点等,它还可以用来定位引发性能问题的函数。 GPU View 和 Windows 性能分析器都可以用于分析由 Windows 性能记录器(Windows Performance Recorder,WPR)采集到的事件追踪日志(Event Trace Log,ETL)。Windows 性能记录器可通过用户界面或命令行运行,其内建的配置文件可用来选择要记录的事件。

    对于 VR 应用,最好先确定其计算是否受限于 CPU、GPU 或二者皆是,以便将优化工作的重点集中在对性能影响最大的瓶颈,最大限度提升性能。

    图5   GPUView分析《猎影计划》时间线视图

    图5 GPUView 分析《猎影计划》时间线视图

    图5为优化前《猎影计划》在 GPUView 中的时间线视图,其中包括 GPU 工作队列、CPU 上下文队列和 CPU 线程。根据图表我们可以看出:

    1. 帧率大约为 37fps。
    2. GPU 负载大约为50%。
    3. 此版本容易使用户眩晕,因为运行帧率远低于 90fps。
    4. 如 GPU 工作队列所示,只有两个进程向 GPU 提交了任务:Oculus VR 运行时和游戏本身。Oculus VR 运行时在帧渲染的最后阶段插入后处理工作,包括畸变校正、色彩校正和时间扭曲等。
    5. 从图中可以看出《猎影计划》同时存在 CPU 和 GPU 瓶颈。
    6. 在 CPU 瓶颈方面, GPU 有大约50%的时间都处于空闲状态,主要原因是受到了一些 CPU 线程的影响而导致 GPU 工作没法及时被提交,只有这些线程中的 CPU 任务完成后 GPU 任务才能被执行。这种情况下如果对 CPU 任务进行优化,将能够极大地提升 GPU 的利用率,使 GPU 能执行更多的任务,从而提高帧率。
    7. 在 GPU 瓶颈方面,从图中我们可以看出,即使所有 GPU 空闲时间都能够被消除,GPU 仍然需要大于 11.1ms 的时间才能完成一帧的渲染(这里约为 14.7ms),因此如果不对 GPU 进行优化,此游戏的帧率不可能达到 Oculus Rift CV1 和 HTC Vive 等 VR 头显要求的 90fps。

    改善帧率的几点建议:

    1. 物理和 AI 等非紧急的 CPU 任务可以延后处理,使图形渲染工作能够尽早被提交,以缩短 CPU 瓶颈时间。
    2. 有效应用多线程技术可增加 CPU 并行性,减少游戏中的 CPU 瓶颈时间。
    3. 尽量减少或优化容易导致 CPU 瓶颈的渲染线程任务,如绘制调用、遮挡剔除等。
    4. 提前提交下一帧的 CPU 任务以提高 GPU 利用率。尽管 MTP 延迟会略有增加,但性能与效率会显着提高。
    5. DirectX 11 具有高绘制调用和驱动程序开销。绘制调用过多时渲染线程会造成严重的 CPU 瓶颈。如果可以的话考虑迁移至 DirectX 12。
    6. 优化 GPU 工作(如过度绘制、带宽、纹理填充率等),因为单帧的 GPU 处理时间大于 11.1ms,所以会发生丢帧。

    为了更深入探查 CPU 的性能问题,我们结合 Windows 性能分析器来分析从 GPUView 中发现的 CPU 瓶颈(通过分析同一个 ETL 文件),以下介绍分析和优化的主要流程(Windows 性能分析器也可用于发现 CPU 上下文切换的性能热点,对该主题有兴趣的读者可以参考了解更多详情)。

    图6   GPUView分析《猎影计划》时间线视图(单帧)

    图6 GPUView 分析《猎影计划》时间线视图(单帧)

    首先我们需要在 GPUView 中定位出 VR 游戏存在性能问题的区间。在 GPU 完成一帧的渲染后,当前画面会通过显示桌面内容(Present)函数被提交到显示缓存,两个 Present 函数的执行所相隔的时间段为一帧的周期,如图6所示(26.78ms,相当于 37.34fps)。

    注意导致 GPU 闲置的 CPU 线程。

    注意在 GPU 工作队列中有不少时间 GPU 是闲置的(例如一开头的 7.37ms),这实际上是由 CPU 线程瓶颈所造成,即红框所圈起来的部分。原因在于绘制调用准备、遮挡剔除等 CPU 任务必须在 GPU 渲染命令提交之前完成。

    如果使用 Windows 性能分析器分析 GPUView 所示的 CPU 瓶颈,我们就能找出导致 GPU 无法马上执行工作的对应 CPU 热点函数。图7-11显示 Windows 性能分析器在 GPUView 所示的同一区间下,各 CPU 线程的利用率和的调用堆栈。

    图7  Windows性能分析器分析《猎影计划》时间线视图,与图6为同一时间段

    图7 Windows 性能分析器分析《猎影计划》时间线视图,与图6为同一时间段

    接下来让我们详细分析每个 CPU 线程的瓶颈。

    由图8的调用堆栈可以看出,渲染线程中最主要的三个瓶颈是:

    图8  渲染线程T1864的调用堆栈

    图8 渲染线程 T1864 的调用堆栈

    1. 静态网格的基本信道渲染(50%);
    2. 动态阴影初始化(17%);
    3. 计算视图可视性(17%)。

    以上瓶颈是由于渲染线程中存在太多的绘制调用、状态变换和阴影图渲染所造成。优化渲染线程性能的几点建议如下:

    1. 在 Unity 中应用批处理或在 Unreal 中应用 actor 融合以减少静态网格绘制。将相近对象组合在一起,并使用细节层次(Level Of Detail,LOD)。合并材质以及将不同的纹理融入较大的纹理集都有助于提升性能。
    2. 在 Unity 中使用双宽渲染(Double Wide Rendering)或在 Unreal 中使用实例化立体渲染(Instanced Stereo Rendering),减少双目渲染的绘制调用提交开销。
    3. 减少或关闭实时阴影。因为接收动态阴影的对象将不会进行批处理,从而造成绘制调用问题。
    4. 减少使用会导致对象被多次渲染的特效(反射,逐像素光照,透明或多材质对象)。

    图9显示游戏线程最主要的三个瓶颈是:

    图9  游戏线程T8292的调用堆栈

    图9 游戏线程 T8292 的调用堆栈

    • 设置动画评估并行处理的前置工作(36.4%);
    • 重绘视口(view port)(21.2%);
    • 处理鼠标移动事件(21.2%)。

    以上三大问题可以通过减少视口数量,以及优化 CPU 并行动画评估的开销来解决,另外需要检查 CPU 方面的鼠标控制使用情况。

    图10  工作线程T8288的调用堆栈

    图10 工作线程 T8288 的调用堆栈

    图11  工作线程T4672的调用堆栈

    图11 工作线程 T4672 的调用堆栈

    图12  工作线程T8308的调用堆栈

    图12 工作线程 T8308 的调用堆栈

    工作线程(T8288,T4672,T8308):这些工作线程的瓶颈主要集中在物理模拟,比如布料模拟、动画和粒子系统更新。表2列出了在 GPU 闲置(等待执行)时的 CPU 热点。

    表2 优化前 GPU 闲置时的 CPU 热点

    表2 优化前 GPU 闲置时的 CPU 热点

    优化

    在实施了包括细节层次、实体化立体渲染、动态阴影消除、延迟 CPU 任务以及优化物理等措施后,《猎影计划》的运行帧率从 Oculus Rift DK2(1920x1080)上的 36.4fps 提升至 HTC Vive (2160x1200)上的 71.4fps;同时由于 CPU 瓶颈减少,GPU 的利用率从54.7%提升至74.3%。

    如图13和图14所示,分别为《猎影计划》优化前后的 GPU 利用率,如 GPU 工作队列所示。

    图13  优化前《猎影计划》的 GPU 利用率

    图13 优化前《猎影计划》的 GPU 利用率

    图14  优化后《猎影计划》的 GPU 利用率

    图14 优化后《猎影计划》的 GPU 利用率

    图15所示为优化后《猎影计划》的 GPUView 视图。从图中可见优化后 CPU 瓶颈时间从 7.37ms 降至 2.62ms,所用的优化措施包括:

    图15  优化后 GPUView分析《猎影计划》时间线视图

    图15 优化后 GPUView分析《猎影计划》时间线视图

    1. 提前运行渲染线程(一种通过产生额外的 MTP 延迟来减少 CPU 瓶颈的方法);
    2. 优化绘制调用,包括采用细节层次、实体化立体渲染和移除动态阴影;
    3. 延迟处理逻辑线程和工作线程的任务。

    图16  渲染线程T10404的调用堆栈

    图16 渲染线程 T10404 的调用堆栈

    如图16所示为优化后 CPU 瓶颈期的渲染线程调用堆栈,即图15的红框标记起来的部分。

    表3列出了优化后 GPU 闲置(等待执行)时的所有 CPU 热点,注意相对于表2,许多热点和线程已从 CPU 瓶颈中被移除。

    表3 优化后 GPU 闲置时的 CPU 热点

    表3 优化后 GPU 闲置时的 CPU 热点

    更多的优化措施,比如 actor 融合或者精简材质,都可以优化渲染线程中的静态网络渲染,进一步提高帧率。假若能对 CPU 任务进行充分的优化,单帧的处理时间能进一步减少 2.62ms(单帧的 CPU 瓶颈时间),达到 87.8fps。

    表4 优化前后游戏的基本性能指标

    表4 优化前后游戏的基本性能指标

    结论

    利用多种工具分析 VR 应用可以帮助我们了解该应用的性能表现和瓶颈所在,这对于优化 VR 性能非常重要,因为单凭性能指标可能无法真正反映问题所在。本文讨论的方法与工具可用于分析使用任何游戏引擎及 VR 运行时开发的 PC VR 应用,确定应用是否存在 CPU 或 GPU 瓶颈。由于绘制调用准备、物理模拟、光照或阴影等因素的影响,有时候 CPU 对 VR 应用性能的影响比 GPU 更大。通过分析多个存在性能问题的 VR 游戏,我们发现其中许多都存在 CPU 瓶颈,这意味着优化 CPU 可以提升 GPU 利用率、性能及用户体验。

    参考链接

    [1]http://www.anandtech.com/show/2803
    [2]http://blogs.valvesoftware.com/abrash/latency-the-sine-qua-non-of-ar-and-vr/
    [3]https://msdn.microsoft.com/en-us/library/windows/desktop/ff476891(v=vs.85).aspx
    [4]https://www.pcper.com/reviews/Editorial/What-Exactly-Draw-Call-and-What-Can-It-Do
    [5]https://developer.microsoft.com/en-us/windows/hardware/windows-assessment-deployment-kit
    [6]http://graphics.stanford.edu/~mdfisher/GPUView.html

    VR 与 AR 开发实战——HoloLens 开发与性能优化实践
    Unreal Engine 4 VR 应用的 CPU 性能优化和差异化
    VR 中的交互之熵
    ARKit:简单的增强现实

    阅读全文: http://gitbook.cn/gitchat/geekbook/5a68274cd7affd0b5cf01e43

    展开全文
  • VR开发需要掌握哪些技术?

    千次阅读 2017-09-14 13:38:29
    时下,随着互联网和科学技术的快速发展,VR虚拟现实应用技术以燎原的气势引爆各个行业,所以现在VR开发工程师可谓是名副其实的高薪职业,而且越来越多的人有意向希望加入VR开发工程师的大军中去,那么作为一名VR开发...
  • WebVR开发教程——标准入门

    万次阅读 2018-01-11 14:17:11
    WebVR即web + VR的体验方式,本文介绍如何开发一个WebVR网页,在此之前,我们有必要了解WebVR的体验方式。 WebVR体验模式 体验WebVR的方式 WebVR的体验方式可以分为VR模式和裸眼模式 VR模式 1.Mobile ...
  • VR开发教程汇总

    千次阅读 2016-10-11 22:07:30
    1.下面是关于VR开发相关的教程进行汇总,包含主流VR开发教程,并在不断的更新中…欢迎大家关注。2.HTC VIVE开发教程1.HTC VIVE开发教程(一)2.HTC VIVE开发教程(二)3.HTC VIVE开发教程(三)3.VR开发教程之 ...
  • VR各平台开发环境搭建

    万次阅读 2016-09-23 16:21:16
    自己从网络整理出来VR开发环境搭建,请尊重原创,转载请注明。 (1)Google VR(Cardboard与Daydream) (2)HTC Vive (3)Oculus (4)Hololens 第一部分:关于Google VR 开发平台的搭建 一...
  • VR 技术菜鸟入门级综述

    千次阅读 2018-08-15 17:05:21
    最近也接触了解了VR技术快一个月了,作为一只瞬时记忆&gt;&gt;长时记忆的程序猿,还是照惯例把一些收获和心得写下来趁着它们还在我的缓存里。 这次blog就采取自问自答的形式吧,交代一下VR的几个key points...
  • 《Unity3D平台AR与VR开发快速上手》针对没有编程经验的初学者,通过详细的讲解,《Unity3D平台AR与VR开发快速上手》将Unity3D开发增强现实和虚拟现实的方法介绍给读者,《Unity3D平台AR与VR开发快速上手》使读者能够...
  • 初识UE4 VR开发

    2020-01-30 16:23:14
    初始UE4 VR开发开篇 开篇 我是一个2020年毕业软件专业的毕业生,快要毕业了,已经厌倦了用java去创建一个工程,编写一个软件,所以在毕业设计选题时,我没有选择软件开发,因为对软件开发流程太熟悉了,感觉没有...
  • Daydream VR入门基础教程,VR开发基础知识——VR view基本介绍。VR view是Google在2016年4月推出的一个VR基本概念,是一种“客户端”VR显示技术,可将 360 度照片或视频部署在各种设备上的简易方式,囊括 PC 端和...
  • OpenVR开发源代码

    2020-07-19 23:33:16
    OpenVR开发源代码,OpenVR开发源代码OpenVR开发源代码
  • 初识UE4 VR开发

    2020-01-30 16:22:47
    初识UE4 VR开发三UE4入门虚幻编辑器介绍(From:百度百科)配置需求软件需求 UE4入门 很多天不写了,因为我发现我电脑配置不太够,不太支持HTC VIVE的头显,所以想办法上了RTX2060,打算先建一下大场景。 虚幻...
  • 摘要: 6月25日,由CSDN主办的“【VR技术开放日】VR开发从何入手”在北京辽宁大厦隆重举行,会议邀请到小米互娱VR技术专家房燕良、焰火工坊CTO王明杨、资深VR开发工程师王秋林、奥秘游戏CTO冀盼以及火石镇CEO卞安...
  • 小米VR开发(二)

    2020-04-10 19:59:03
    小米VR开发流程(二) 这篇文章接着小米开发流程(一),在以上的文章中已经为小米VR的开发做了一定的准备工作,剩下的开发流程就很轻松了,小米VR中的交互及实现方法在开发文档中很详细了。在这里还是以一个简单...
  • 本章我们来介绍一下如何在移动VR设备的佼佼者GearVR上进行开发,之前我们在桌面端的VR开发想法可以直接应用在移动端,但是仍然会有些不一样的技术需要注意。这次,我们仍然采用Unity3D引擎构建示例,在开始编码之前...
  • 同时运营“CSDN VR 开发群”,面向 VR/AR 专业开发者间做深入讨论和交流,欢迎加微信 tm_forever_miss 申请入群(请备注姓名+公司+职位,以快速审核通过) 版权声明:文中实质性观点归内容原创作者所有,感谢授权...
  • VR开发UI设置

    2019-01-22 17:21:54
    VR开发时,之前单纯采用世界坐标系下UI放在VR中Camera (eye)下,发现位置关系很难控制,容易和替他物体遮挡。 后发现,在 [CameraRig]下添加单独相机渲染UI可解决问题。 1、拖入的目标VR预制体 2、添加专属UICamera...
  • SteamVR+Unreal4 VR开发心得(一)

    千次阅读 2016-06-23 00:29:16
    最近开始使用SteamVR(HTC Vive)+Unreal4做VR开发,平时没事的时候就把开发过程中一些心得写一下。 现在国内这两个开发方向的资料真心不多,自己想查些什么也是国外各种找博客论坛视频看文档,什么语言的都有,感觉很...
1 2 3 4 5 ... 20
收藏数 26,707
精华内容 10,682
关键字:

vr开发