与图形显示相关的VR官方教程总结



01TEXEL:PIXEL
Render Scale
根据VR互动应用场景的复杂度和所运行的硬件环境,你可能需要更改render scale设置。通过此项设置可以调整镜头校正前texel:pixel的比率,这样可以牺牲游戏性能来换取画面的清晰度。
这项设置应该通过代码进行,可以参考这里:

http://unity3d.com/cn/VRSettings.renderScale

通过使用以下代码可以改变render scale的设置:

using UnityEngine;
using System.Collections;
using UnityEngine.VR;
namespace VRStandardAssets.Examples
public class ExampleRenderScale : MonoBehaviour
[SerializeField] private float m_RenderScale = 1f;
//The render scale. Higher numbers = better quality, but trades performance
void Start ()
VRSettings.renderScale = m_RenderScale;


关于这项设置,可以参考我们的VR Samples,具体示例是Scenes/Examples/RenderScale场景。此外在MainMenu场景中也有该项设置的应用。

更改render scale的效果示例如下:

Unity的默认render scale是1.0,效果如下:

如果将render scale设置成1.5,可以看到显示效果更锐利:

接下来把renderscale设置成0.5,可以看到像素化很严重:

根据游戏场景的不同,可以考虑降低render scale来提升游戏运行性能,或者通过增加render scale的数值让画面效果更锐利,但会以牺牲游戏运行性能作为代价。



02UI
将十字准星渲染到其它游戏对象的表面

如果十字准星恰好和某个对象的位置相同,那么准星可能会嵌入到临近的对象中。

为了解决这个问题,我们需要确保将准星渲染到场景中所有对象的前面。在VR Samples中,我们提供了一个shader,基于Unity现有的名为UIOverlay.shader的”UI/Unlit/Text” shader。在选择某个材质的shader时,可以在”UI/Overlay”中找到。

这个shader对UI 元素和文本都适用,会在场景中其它物体的前面绘制。


Non-diegetic(非剧情型UI)

在传统的非VR项目中,UI通常显示在界面的顶部,用来显示生命值、得分之类的信息,通常被称为HUD。这就是所谓的非剧情型UI-用户界面跟游戏世界没有什么关联度,但是对玩游戏的玩家有一定的作用。

在电影中也有所谓的“画外音”,比如电影或电视中的背景音乐。与此不同的是,剧情音通常跟故事紧密相连-比如角色之间的对话,或是实际发生的自然音效。

在Unity中,添加HUD样式的非剧情型UI相对简单,只需要在UI Canvas的Render Mode中选择使用Screen Space- Overlay或是Screen Space- Camera。

但这种UI界面对VR基本不适用,我们的眼镜无法聚焦在如此近的物体上,而Unity VR中根本就不支持Screen Space-Overlay。

Spatial UI(空间UI)

和前一种UI不同的是,我们需要将UI放置到环境之中,并在Canvas的Render Mode中选择使用World Space模式。通过这种方式,就可以让用户的眼镜聚焦到UI上。这就是所谓的Spatial UI(空间UI)。

将UI元素放在世界的哪个位置也需要认真考虑。太靠近用户会导致眼部疲劳,离得太远会感觉聚焦在地平线上-这种情况可能发生在室外环境,而不是在小屋子里。此外我们还需要对UI的比例进行适当调整,具体要根据产品的实际需求来定。

我们最好把UI放在一个舒适的可读距离,并进行相应的缩放。关于这一点可以参考Main Menu场景中的UI:它被放置在几米远的位置,因此图片和文字都比较大,看起来很舒服。
当我们把UI放在离用户有一定距离的时候,可能会发现UI重叠到其它物体上。关于这一点可以查看上一篇教程,看看如何修改shader让其绘制在其它对象上,或者直接使用VR Samples项目中的shader。这个shader也适用于文本。

很多开发者想要把UI关联到摄像机上,这样当玩家移动的时候,UI会保持在一个固定的位置。这样做对十字准星或其它小物体可能会比较合适,不过对于比较大的UI元素,就好比把一张报纸放到你的脸上,很容易让用户感到不舒服,甚至是眩晕。我们可以看一看Shooter 360(Target Arena)场景中的UI,其中UI会在一个较短的延迟后移动到视野中,从而可以让用户四处查看进而熟悉身边的环境,而不是直接把UI固定到他们的视野中,导致视觉模糊。


Menu(菜单)场景
Menu场景中的UI使用了定制的纹理来创造一个弯曲的密封环境。

Flyer场景

游戏简介和游戏结束的UI使用静态的方式放置在世界空间中。

不过为了呈现跟游戏相关的信息,我们可以使用跟太空飞船关联的世界空间UI,也就是剧情型UI。

考虑到飞船必须时刻出现在用户的视野中,因此在飞船四周显示相关信息是靠谱的。

与此同时,UI元素会旋转以面向摄像机,这样就会避免倾斜,同时确保UI的显示对用户友好。

Maze场景

在Maze 场景中,我们使用Spatial UI来提供游戏引导和结束。

Spatial UI还可以用来提示用户进行交互:
VR中的文本抗锯齿

为了在VR世界中实现免费的文本抗锯齿效果,这里有一个小技巧,在Worldspace Canva中使用Canvas Scaler。在相关设置中,我们需要将”Reference Pixels Per Unit”设置为1,然后调整”Dynamic Pixels Per Unit”,直到文本的边缘柔化。在下图中,我们可以看到不同设置的实际显示效果。


03

VR中的淡入/淡出和闪烁渐变
在虚拟的环境中实现运动的一个常用方法是使用淡入淡出或闪烁渐变,比如快速淡出到黑色,将摄像机移动到期望的位置,然后再淡入。除此之外,还可以考虑更复杂的方法,也就是使用闪烁渐变。关于这一点的具体说明,可以参考Oculus Connect 2014上的Tom Forsyth的讲解( https://www.youtube.com/watch?v=addUnJpjjv4&feature=youtu.be&t=40m5s

04优化

Overdraw

Overdraw可以让开发者查看哪些对象绘制在其它对象的顶部,但其实是在浪费GPU时间。我们应尽可能的减少使用overdraw。我们可以使用Scene View Control Bar(Unity - Manual: Scene View Control Bar)来查看场景视图中的overdraw。

正常的着色视图如下:

启用Overdraw之后的着色视图:


Level of Detail(LOD)细节层次

通过使用LOD,可以随着物体和摄像机之间的距离来减少物体渲染的三角形数目。除非所有的物体都离摄像机同样远,否则我们都可以使用LOD来减少硬件的负担。我们可以添加一个LOD组件,然后对远离摄像机的物体提供低精度模型。


使用Simplygon( Asset Store)可以自动完成对大多数asset的LOD预处理。

Light mapping

尽可能减少动态光照,尽量多使用光照烘焙,尽量避免实时阴影。


关于这部分的具体内容,请参考Unity官方的Lighting and Rendering( Unity - Unity 5

Light Probes


使用Light probes( Unity - Manual: Light Probes)可以让我们对场景中的光照点取样,然后应用到动态物体上。使用light probes通常更快,而且也能产生绝佳的视觉效果。

Occlusion Culling

Occlusion Culling(遮挡剔除)可以避免渲染那些不可见的物体。例如,如果玩家正处于某个房间中,而另外一个房间的门是关闭的,那么对玩家来说另外一个房间中的所有物体都是不可见的,也就完全没必要进行渲染。

根据项目和目标平台的不同,我们可能会希望实现Occlusion Culling,从而大幅提升游戏性能。

下图是一个frustum culling(视锥体剔除)的示例:

下图是Occlusion Culling(遮挡剔除)的示例:

Anti-Aliasing(抗锯齿)

抗锯齿对VR应用来说非常重要,因为使用这种技术可以让图像的边缘显得更加平滑,并减少毛边线下。如果我们在项目中使用Forward Rendering,那么就需要在Quality Setting中启用MSAA(Unity - Manual: Quality Settings)。而对于Gear VR项目来说,任何时候我们都需要启用该选项。

当然,在使用Deferred Rendering时我们无法启用MSAA,此时需要启用AntiAliasing作为后处理特效(所谓的“反走样”,Asset Store),或者考虑使用SMAA。

这里提供了一个相关的示例。



Textures

通常来说,在VR项目中我们应尽可能的使用Texture Atlasing(纹理贴图,Texture atlas),以减少单独纹理和材质的使用量。

为简化和加速这个过程,我们可以考虑使用MeshBaker(Asset Store)来烘焙游戏中所使用的纹理、模型和材质。

在Oculus Connect 2开发者大会上,来自Turbo Button的Holden曾分享过优化应用以及使用MeshBaker的相关经验。

https://www.youtube.com/watch?v=9vZ8SfXOlpI


有一点需要注意的是,在VR项目中normal maps看起来效果并不好,因此我们应该避免使用。关于纹理的更多知识,请参考Oculus documents( https://developer.oculus.com/documentation/intro-vr/latest/concepts/bp_app_rendering/)。

Shaders


在VR项目中,我们应尽可能使用最基本的shader。在Gear VR上,我们可能会需要考虑使用不那么消耗资源的Mobile>Unlit(Supports Lightmap) shader,并使用lightmap来给场景提供光照。

我们选择了低多边形的艺术风格,并使用少量的基本色彩,让物体从环境中脱颖而出。

在使用Forward Rendering时,我们需要在Edit > Project Settings > Quality Settings 中启用4x MSAA,(Unity - Manual: Quality Settings)以便获得更好的视觉效果:


Menu 场景中使用的优化技术:

跟该项目中所有的场景一样,Menu场景中使用了低多边形的美术资源,而且避免使用实时光照。


我们在菜单面板上使用了定制的shader,名为SeparableAlpha,可以为一系列的图像定义独立的alpha通道。这就意味着不是每一帧都需要自己的alpha通道。这样做可以节省文件大小,并去掉某些贴图。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值