360全景在Unity(二)(V客学院知识分享)

Unity2018的版本增加了许多新功能,在Unite2018上分享了许多这些新功能在项目中的使用,其中就有一项非常有意思的做法,那就是使用360的静态图片或者360的视频作为游戏场景来大幅度优化游戏场景的方式。

以下使用官方的一个完整游戏实例《Stealth》的资源做一下简单演示,将场景拖入Hierarchy中 简单调整一下摄像机的位置, 并在场景放置了两个可以运动的物体--一个转动的桶子,一个围着桶子走路的ethan 。效果如下:

 

 

此时大家注意一下stats面板的信息  Batches 为1456 , SetPass Calls 为254  这个是在原场景没有做优化和改动的前提下 。直接运行的结果

接下来 我们将这个场景改成使用360静态图片的形式来实现一次,还是这个视角

看起来效果很类似吧 ,不过少了些许东西 , 我们再来看一下states面板的信息:  Batches 为28, SetPass Calls 为18 ,而角色和桶子的影子却没有了。

经过简单的处理,虽然牺牲了光影的效果,却获得了极高的性能提升,而没有牺牲画质,这是如何做到的呢?

Unity在升级了2018版本后,提供了两个新的API,可以让我们非常方便的将当前摄像机所拍摄到的东西录制成一张全景视图

 Camera.main.RenderToCubemap(renderTex1);

在这里我将主摄像机所拍摄到的画面渲染到了一张RenderTexture 上 ,在此之前,我先把角色和桶子的设置为与场景其他物体不同的layer,并且在相机的Culling Mask中取消渲染这一layer的物体,在调用RenderToCubemap这一方法的时候,角色和桶子就不会出现在渲染好的RenderTexture上。想要获得比较高的显示质量,可以将RenderToCubemap的size设置大一点 这里我设置为了4096*4096 ,经过尝试,如同官方所说,更大的size并没有将显示效果获得更好的提升,官方也推荐设置为4K的大小。

接着,与上期在Unity中播放360全景视频的方法类似,我在场景中创建了一个内置球体,并新建了一个材质,这次我将材质的shader修改为了Unity内建的Skybox/Cubmap,将渲染好的RenderTexture 制定给这个材质,再将材质赋予这个球体。将球体的位置保持与摄像机的位置一致。这时 ,我禁用掉场景中除摄像机与这个球体以外的所有物体,设置摄像机的Clear Flags为Solid Color, 运行有游戏,便能获得以下的效果

同时我还为摄像机添加了视角转动的功能,效果真的很不错

接下来,我们将我们需要角色和桶子放回场景,启用场景中的所物体,并将球体的layer设置为与角色和桶子相同的layer,摄像机的Culling Mask中设置为只显示该layer,我这里设置的名字为Front 。经过这些设置,并能达到以上的效果。

相对于此 官方的做法更为彻底,官方设置了2甚至更多个球体,一个球体用于显示背景,另外的球体用于显示场景中的一些在角色运动时会遮挡角色和会被角色遮挡的物体,如我这个场景中的桶子,当角色运动至该物体后面时,角色会被桶子遮挡;而当角色运动至桶子前面时,角色又会将桶子遮档。官方将这一类物体也同样采用了渲染场景的方式进行了处理,所不同的是,处理这些前景五物体时,需要在渲染时将摄像机的Clear Flags设置为Solid Color,颜色设置为绿色,然后再使用一个修改后的天空盒shader,将绿色部分抠掉,这个做法和拍摄电影时采用的绿幕处理是差不多的,并在运行时根据角色的位置动态地去设置前景的球shader的Render Queue,以确保前景的球会正确地在角色所处的位置显示,以达到被角色遮挡和遮挡角色的效果。最后再将场景中所有物体的其他组件都去掉,只留下该留下的Collider组件,并可以简化Collider。

而对于光影的处理,也有多种方式:动态的物体比如:人物相对于地面的影子,可以在人物脚底放置一块plane,并切让plane时刻处于人物的脚底下,跟随角色移动,让人物在plane上投射阴影,再利用shader实时将plane上阴影以外的其他部分挖掉,还可以将阴影的强度调低一些,以透出地板的纹理;对于场景中其他的前景物体也可以采用类似的方式。那么对于场景中一些类似光线透过玻璃窗照射在墙壁上的效果,也可以在光源上添加一张该场景图片的灰阶图作为光源的cookie来实现,场景中的镜子效果亦可以采用RenderTexture来制作,将RenderTexture放置在场景中镜子的大概位置,其后使用另外的摄像机来帮助采集图像显示,只需要将摄像机的显示层设一下, 并在合适的时机将这个RenderTexture启用就可以了。

具体的操作步骤,详细的操作步骤这里并不说明,这里只做一些方式和思路介绍。

以上是采用静态图片来制作场景的方式,而360的视频也是可以采用类似的方式去制作的。

这样的处理方式,原理也是利用了人的眼睛在固定的点时,只有一双眼睛所看的画面并没有深度信息,场景渲染到屏幕上之后就已经扁平化了,这个就好比在很多层极薄的玻璃上,各自画上不同的图案,然后把这些玻璃叠在一起,从正面去看这些玻璃你是无法分辨出对应玻璃上的图案是在其他的玻璃的前还是后的。利用这一原理,我们就可以在这个视角上去叠加无数层前景,通过设计不同的遮挡区域来达到跟真实3D场景一样的前后效果。

那么场景中有需要交互的物体时,就直接将这个需要交互的物体的真实3D模型放置于场景中就可以了,如我这个场景中的这个桶子。

这样的处理方式有不少的优点,能让手机或者其他的移动平台能获得的非常好的显示效果,只要你的美术团队足够强大,让手机显示3A级的场景也是完全不是问题,并且能获得非常优秀的性能,还能将使用360全景设备所拍摄的现实场景搬进游戏场景来,或者将现实场景与3D模型结合,以达到不同的游戏体验,然而缺点是镜头不能移动。但是是可以360的度转动视角的。这种处理方式也能用于类似Cardboard或者GearVR这种镜头不能自由移动的VR项目,但是不能用于HTC VIVE这种设备的项目。可以用于制作各种平台上的类似过山车,定点移动游历项目或者密室逃脱类游戏等等,凡是处于当前视角时,镜头不需要移动的项目都可以采用方式进行。

在Unity2018中,对于全景图片和视频,unity还增加了更多的功能,比方说能将这张Cubemap类型的RenderTexture转为一张适用于 Skybox/Panoramic内建shader的RenderTexture,API如下

 renderTex1.ConvertToEquirect(frontTex);

也推出了一个叫做Recorder的官方插件,用于录制全景视频,图片,游戏Game视窗视频以及GIF动图等等,该插件还能配合Timeline以及Cinemachine使用,功能同样非常强大,以往需要靠收费插件比如VRPanorama实现的功能,完全可以使用官方推出的该免费插件实现。

(PHP开发、web前端、UI设计、VR开发专业培训机构--V客IT学院版权所有,转载请注明出处,谢谢合作!)

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值