翻译:https://www.oculus.com/blog/asynchronous-timewarp/
异步时间扭曲(AsynchronousTimewarp时间扭曲,即调整时长)调查
关于作者:
在这篇博客中,我们分析了这些限制和导致特殊困难的原因,您将看到,ATW有时是有用的,但是还不能让虚拟现实引擎满帧运行,没有达到完美体验的程度。
的一篇文章中有详细介绍(参见我翻译的RamblingsinValueTime.)
在虚拟现实设备中,为了正确在虚拟世界里呈现一个人们的感知,必须要在显示器上的定时更新图像,然而,如果渲染时间太长,一帧就会丢失了,产生的结果就是抖动,这是由于新的一帧图像还没有被渲染出来,显示器显示了上一帧的图像,如果一帧图像被两次渲染就会产生下面结果,如图:
这里,眼睛转向左侧,这时图像又被渲染一次,图像落在视网膜的不同部分,导致双影抖动。
当然,双影并不是唯一的结果,如果同样的帧显示三次,就会产生三重影,以此类推。
’s所支持的位置跟踪开始探讨。
位置抖动(PositionalJudder):
近场对象多重抖动的图像示例。
那么,这种影响有多严重?
这个颤抖的程度取决于玩家的运动方式,如果你保持你的头部相对静止并且只看风景,这种颤动将并不显著,可以忽略不计。
如果看远处物体,头部运动不太可能引起明显抖动。在这种情况下。ATW可以使你自由的看中远处场景,并且没有明显的抖动。
位置扭曲(PositionalTimewarp):
运动的物体和动画:
这个伪影表现为这些移动的物体,即抖动的多幅图像。
场景中移动物体产生的抖动效果。
镜面反射:
计算镜面反射需考虑眼睛的方向,或摄像机的方向,,由此生成一个图片。
由于眼睛或头部运动,镜面反射不再是正确的,这可能导致镜面反射抖动。
像镜面高光和反射依赖于眼睛位置一样,还有许多其他依赖于眼睛位置的着色技巧也有类似的问题,例如,视差贴图和浮雕纹理映射将有类似的效果。
实现:
实现ATW是有挑战性的,主要有两个原因:
1:它需要GPU硬件支持合理的抢占粒度。
2:它要求操作系统和驱动程序支持使GPU抢占。
让我们从抢占粒度开始,在90赫兹,帧之间的间隔大约是11ms(1/90),这意味着为了使ATW有机生成一帧,它必须能够抢占渲染线程并且运行时间少于11ms,然而11ms实际上不够好,如果ATW在一帧时间区间内任意随机点开始运行,那么起潜伏期(执行和帧扫描之间的时间)也将随机,我们需要确保我们不跳跃任何游戏渲染的帧。
我们真的期望ATW运行一直非常的短,短到在视频卡产生新的一帧之前结束,刚好有足够的时间来完成中间帧的生成,缺少自定义的同步ATW中断例程,我们可以获得高优先级抢占粒度和调度,在最长2ms或更少的时间内。
原来,对现在的图形卡和驱动实现来说,2ms抢占是一个艰巨的任务,虽然许多GPU支持有限的形式的抢占,但执行存在显著差异。
1:一些显卡实现厂商和驱动程序允许抢占任一批处理或回执调用粒度,虽然有帮助,但不是十分完美(举一个极端的例子,一个复杂的并包含很多绘制指令着色器可以很容易在10ms完成)。
2:其他显卡实现厂商和驱动程序允许抢占计算着色器,但需要特定扩展来支持。
放弃那些不愿放弃的,容忍那些不可容忍的。