Oculus Rift和HTC Vive,刷新率为90HZ,每11.1ms刷新一次,使能VSYNC来禁止tearing。tearing是引起用户不舒服的主要原因。

    VR软件传递帧可分为两部分:VR Game和VR Runtime
    当时序要求得到满足以及流程工作正确时,以下流程还需要遵守:
    1.VR Game采样当前头显位置信息,并且更新Game中的摄像头位置信息以正确跟踪用户的位置。
    2.VR Game创建一个图像帧,并且GPU将这个新的帧渲染到一个texture上(这还不是最终显示的图像)。
    3.VR Runtime读取最新的texture,修改它,生成最终可渲染在显示器上的图像。其中两个有趣的修改优化项是:颜色矫正和镜头矫正。
    以下是时序图:
    理想的VR管线
    VR帧传递流程 - 图1

    当生成一个帧的时长超过刷新时隙时,Runtime的任务会变的更复杂。在这种情况下,VR Game和VR Runtime整合图像的时间过长,以致于新帧在下一个扫描时间点到来时还未准备好。
    在这种情况下,HMD一般会重新显示前一个的帧(在Runtime中已渲染好的),但是对于VR来说,这种体验是不可接受的。因为在一个VR头显内忽略掉头正在动这个事实,而去重复刷新一个旧帧,将会导致非常差的用户体验。
    Runtime使用各种技术来改善这种情形,包括使用算法来同步一个新帧而不是去重复旧的帧。大多数技术聚焦于重投射的想法,意思是使用最近时间头部的位置信息来调整旧帧,以匹配当前头部的位置。但是这还不能够改善内嵌在一帧中的动画的效果,从而导致低帧率和抖动。但是在带头动的HMD内跟踪效果会更好,获得一个更流畅的视觉体验。

    一些关键参数如下:
    1.丢帧。大多数为App错过或者App丢失。如果VR Game渲染的帧到达太晚,不能够在当前刷新时隙内显示时,就会产生丢帧以致游戏画面产生滞后拖影。
    VR帧传递流程 - 图2

    2.封装错过。

    封装错过对VR体验来说是一个更重要的问题。Runtime在当前刷新时隙内处理一个新帧(或者一个新的重投射帧)失败时导致封装错过。在前一副图中,GPU会重新show一个之前的封装帧。VR用户将会看到一个严重拖影延迟的固定帧。

    VR帧传递流程 - 图3

    3.帧时间数据。
    4.异步空间扭曲合成帧
    合成帧:异步空间扭曲(ASW)是一个进程,该进程用前一个渲染帧的动画来检测合成一个新的可预测的帧。
    VR帧传递流程 - 图4

    异步空间扭曲(ASW-Asynchronous Spacewarp):
    要理解异步空间扭曲,必须先了解异步时间扭曲(ATW-Asynchronous Timewarp)。异步时间扭曲是独立于主渲染线程的进程并且在Runtime中运行,可在接近VSYNC时隙处对HMD位置信息进行采样,计算出与前一个位置信息的不同点,基于这个不同点来转换最近时间完成的帧(没有完整重渲染情况下移动)来得到新的帧,将新的转换帧显示到HMD上。
    异步空间扭曲是一个对前一个渲染帧进行动画检测的进程,用来合成一个新的可预测的帧。
    如果一个App能够不间断地以90HZ渲染,则该合成的帧永远不会在HMD上显示。当帧不能够如常进行渲染时,ASW才会被激活。基于前一个渲染帧的动态监测来预测一个合成帧这种事情的发生的概率要比直接渲染一个新帧要小的多。
    当ASW被禁止时,如果此时一个App以90HZ的速率提交一个帧到Runtime失败,则Runtime将会选择最近的完整帧,且对它使用ATW技术处理。
    当ASW使能时,如果此时一个App以90HZ的速率提交一个帧到Runtime失败,则Runtime会以45HZ来渲染该App并且应用ATW技术到标准渲染帧以及ASW合成帧上面。这些ASW合成帧在标准渲染帧间充当一个中间帧的角色。最终用户可看到的是,以45HZ渲染实际上呈现出90HZ效果的流畅动画。

    转载:
    https://blog.csdn.net/huhaoxuan2010/article/details/76034324