MTP(Motion-To-Photon Latency):实际人体发生运动到图像显示到屏幕上的时间延迟。早期一些vr产生晕动症的主要原因。
ATW(Asynchronous Timewarp):主要解决两个问题,一是延迟,二是补帧。其原理是,应用程序输出图像以后,交给另一个渲染管线,后者在上屏的时候拿新的姿态数据做重投影计算。这样新的姿态更接近显示时的真实数据,弥补了MTP。同时应用掉帧的时候,ATW拿前一帧的图像重投影,一定程度上也可以弥补了。
OTW(Orientation Timewarp):可以认为是ATW重投影计算的3DOF版本,把图像视为无限远处的画面,仅引入HMD旋转带来的变量。早期VR设备都是3DOF的,这种计算非常有效。
PTW(Positional Timewarp):6DOF版的ATW,重投影中同时包括旋转和位移。必须要深度图,通过深度信息还原每个点的距离。理论上说每个像素都参与计算是最准确的,但是计算量太大,需要用其他办法来平衡。据oculus的说法:
“多年来,我们尝试了许多不同的 PTW 技术来评估各种权衡。一些技术(例如视差遮挡贴图)更加准确,但会消耗更多 GPU 时间。我们选择的技术类似于稀疏视差映射技术,因为它可以帮助我们认识上述所有要点。与 OTW 相比,使用我们的 PTW 方法的开销极低,同时也足以帮助解决 OTW 中由于 HMD 位移而出现的抖动伪像。”
这里边说的“类似于稀疏视差映射技术”到底如何实现,还不清楚。
ASW(Asynchronous Spacewarp):是用来补帧的,和ATW叠加使用,才能纵享丝滑。前面说的ATW的补帧,弥补的是场景里相机的运动,这里弥补的场景里物体运动带来的变化。oculus已经迭代了两版,下面是官方文章说的:
“
为了更好地理解ASW如何与PTW配合使用,我们首先需要了解ASW的流程。以下是 Oculus 运行时利用 ASW 的步骤的详细分解:
- ASW捕获由焦点 VR 应用程序提交的先前和当前 ovrLayerEyeFov 帧的纹理。
- ASW通过对前一帧进行时间扭曲来生成“预扭曲帧”以使用当前帧的姿势。
- ASW将当前和预变形帧纹理转换为 GPU 视频编码器友好的资源。
- ASW将两个帧纹理发送到 GPU 视频编码器进行对应分析。
- ASW从 GPU 视频编码器输出中收集“运动向量”。
- ASW对运动矢量进行后处理和转换以进行帧外推。
- ASW打包内容并注入合成器层,就像来自 VR 应用程序一样。
- 合成器像往常一样使用 ASW 注入的 ovrLayerEyeFov 图层内容进行时间扭曲和扭曲。
正如您在步骤 #2 和 #8 中看到的,我们依赖 Timewarp (TW)。在我们最初的 ASW 实现中,由于我们没有可用于 PTW 的深度缓冲区,因此在这些情况下使用的 TW 重投影技术是方向时间扭曲 (OTW)。然而,随着越来越多的 VR 应用程序开始提供深度缓冲区,我们可以利用 PTW 的数据。诀窍是确保上述两个步骤中使用的 TW 重投影技术(无论是 OTW 还是 PTW)属于同一类型。这可确保在 ASW 或 TW 中校正 HMD 运动重投影,但不能同时在两个位置校正,因为这会导致视觉伪影。当深度不可用时(即 VR 应用程序提交 ovrLayerEyeFov 而不是 ovrLayerEyeFovDepth),Oculus 运行时会自动恢复为该 VR 应用程序的 ASW 1.0 方法。
”
个人理解最大的区别就是利用了PTW,能把场景中没有发生运动的点都剔除出来。
Motion Vector:运动矢量,ASW里的关键信息,直观理解就是上面图片中的小箭头。高通GPU提供了该能力,在OpenGL里提供了QCOM_motion_estimation extension扩展接口。
void TexEstimateMotionQCOM(uint ref,uint target,uint output) ;void TexEstimateMotionRegionsQCOM(uint ref,uint target,uint output,uint mask) ;
参考链接:
https://developer.oculus.com/blog/developer-guide-to-asw-20/
Improving VR Performance Using Motion Estimation OpenGL Extensions