您的位置:首页 > 其它

解释VR的时间扭曲(time-warp)

2017-04-05 19:54 260 查看

解释时间扭曲

原文英文链接.翻译中有一些个人添加的辅助信息,以括号标识,”注:”开头,以粗体表示,例如(注:以下为个人翻译,水平有限,欢迎指正).

在虚拟现实的背景下,时间扭曲是一项减少运动和图像之间延迟的技术.

在理想的情况下,渲染引擎发送给显示之前使用测量好的实时的头部姿态(方向和位置).但是,在现实情况下,渲染需要耗费时间,所以渲染引擎使用的姿态是发送显示设备之前几毫秒的.在这几毫秒的时间里,头部运动了,但是图像是会比实际情况延迟一些的.

让我们举一个带数值的例子,假设我们需要每秒渲染90帧(90FPS),这种情况下每一帧渲染需要11毫秒的时间.我们假设头部追踪数据是连续不断的,但渲染需要10毫秒.已知渲染时间,渲染引擎开始渲染的时间越晚越好,需要发送到显示设备的是10毫秒之前的桢.因此渲染引擎使用头部追踪的数据是10毫秒之前的.如果头部旋转的速度是200度每秒,这样10毫秒就是旋转了2度(200*0.01=2).如果HMD水平视场角是100度,在水平视野上横向排列有1000个像素,2度的延迟意味着图像与实际图像延迟了20个像素点.

但是,实验证明即使是2度的变化在远处图像上是不容易被人察觉的.因此,如果有一种方法在屏幕上移动20个像素(例如,在例子中的2度).那么最终的图像是相当准确的.

这正是时间扭曲(或简称为”TW”):它非常迅速的(小于1毫秒)转换图像,这个转换基于渲染引擎使用头部信息的时间和时间扭曲之间这段时间的头部旋转(渲染开始到执行TW之间的时间).

处理时间扭曲相当的简单:渲染引擎执行渲染,然后渲染引擎执行完毕时,这时候将时间扭曲迅速的运用到最终的图像上.

但是如果渲染引擎需要的时间大于帧与帧时间的时间,会如何?这种情况下,时间扭曲的一种版本,叫做异步时间扭曲(“ATW”)通常会被使用.ATW使用最后一个有效的帧加上时间扭曲来处理这种情况.如果渲染引擎没有及时完成(图像渲染的工作),ATW使用前一帧,并用时间扭曲处理它.如果使用的是前一帧,头部很可能已经不再当时的位置,所以需要更大的移位.不能指望渲染引擎都能准时的完成,ATW使用先前一桢的数据来进行处理,仍然会比丢失一桢的数据所带来明显的抖动画面要来的要好.这就是为什么ATW被称为渲染的”安全网络”,当渲染不能准时完成时这个动作很有用.ATW的异步来自于ATW是一个独立于渲染引擎的线程或进程,并运行在比渲染引擎更高的优先级,以便于在渲染引擎没有按时完成渲染的情况下更新帧(插入帧).



这里对技术要点进行详细说明:

时间扭曲的例子可以解决左右侧(yaw方向)的头部运动得到补偿.实际上,所有三个旋转方向-yaw,pitch和roll-都可以补偿,以及在某些假设的情况下的头部位置.例如,OSVR实际上执行6DOF扭曲基于假设物体与投影中心2米的距离.它处理关于实现方向的旋转,并接近所有其他的平移和旋转.

在场景中的物体例如:手,如果渲染引擎没有及时渲染一个帧,尽管加入时间扭曲,将仍然会出现抖动的情况.

为了使时间扭曲工作的更好,渲染帧需要略大于显示器分辨率的尺寸.否则,最终可能会看到空的像素(例如图像向左移动20像素位置,那么屏幕最左边的20个像素位置即为空像素).实际上渲染真需要多大,依赖于帧率,以及预测头部旋转的速度.更大的帧图像意味着更多的像素要被渲染,占用更多的内容,所以时间扭曲并不是完全”免费”的.

如果HMD里的图像是被渲染到一个单一的显示屏上(而不是两个显示屏,每个眼睛对应一个显示屏),时间扭曲需要对每个眼睛使用不同的扭曲程度,因为一只眼睛刷新的图像比另外一个早(60FPS的情况下,一只眼睛比另一只眼睛早1/60/2,大概8毫秒).

一些对象,例如在头部空间里的菜单(例如,应该相对于头部时固定的),需要单独的代码来渲染和提交,因为他们不应用于头部运动投影的修正.

预测追踪(估计未来的姿态,这基于先前读到的方向,位置以及角速度)可以帮助提供输入信息给渲染引擎,但实际测量的数据往往比预测未来的姿态的更加准确.

依赖于HMD显示配置,左眼比右眼的渲染来的更迟一些(例如,如果屏幕是竖屏,渲染从上到下,左眼对应的是屏幕的上半部分).在这种情况下,需要对每个眼睛使用不同的时间扭曲(这2个眼睛刷新的时间相差1/FPS/2秒).
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  VR time-warp 时间扭曲
相关文章推荐