作者luyaoting (luyaoting)
看板VR
标题[技术] 目前三大VR设备使用的再投影技术简介
时间Sat Oct 15 19:45:36 2016
什麽是Reprojection(再投影)?
Reprojection是能够降低延迟、避免晕眩的安全机制,HTC Vive、Oculus Rift、Playstation VR等VR设备都有使用Reprojection。
Reprojection会应用在下面两种情形:
A.VR设备先取得使用者头部的位置,再交由电脑运算画面,但电脑运算、资料处理需要一段时间,画面运算完成後使用者头部已经移动到新的位置了。
B.电脑无法在时间内画面将画面运算完成(例如无法达到90FPS)。
遇到上述两种情形时,如果透过Reprojection,便能够校正画面的位置,产生一张新的画面,更接近使用者新的位置。
其中最主要需要校正的项目包括使用者头部转动、头部移动以及虚拟物体的移动(例如VR世界中有一只飞鸟)。
各家Reprojection的做法略有不同,以下会分开介绍。
HTC Vive + SteamVR , Asynchronous Reprojection(ASR) + Interleaved Reprojection
11/16更新:SteamVR在此次更新中加入了Asynchronous Reprojection功能,目前版本仅校正头部转动,类似下方介绍Oculus的Asynchronous Timewarp。可以自行选择是否开启Asynchronous Reprojection、是否开启Interleaved Reprojection(预设是两种都开启)。
https://goo.gl/BMtiJk
HTC Vive的定位系统会预测使用者在24.22ms後的位置,藉此克服电脑运算、资料处理造成的时间差,以减轻上述情形A造成的影响。
Asynchronous Reprojection,其中Asynchronous是表示Reprojection这个动作是独立运行的,不受CPU、GPU正在进行的工作影响,每一张画面都会先经过校正(稍微扭转原本的画面,只校正头部转动)再显示。电脑如果在时间内处理完画面,会先经过校正再显示,电脑如果来不及处理完,则会自动拿前一张旧画面,经过校正再显示。当遇到偶发性来不及处理完画面的情形,Asynchronou Reprojection能够即时补上,使用者不易感觉到掉帧,是其一大优点。透过Asynchronous Reprojection,能够同时减轻上述情形A和情形B所造成的影响。
然而由於目前SteamVR的Asynchronous Reprojection只校正头部转动,没有校正头部移动以及虚拟物体的移动,如果软体跑不到90FPS,会看到移动中的物体动作不连贯、不流畅(物体会突然跳一下或是跳来跳去),如果前後左右上下移动身体、头部,也会看到场景一震一震的。
为了避免场景一震一震或是物体跳来跳去造成不好的观感,甚至导致晕眩,SteamVR发现软体一直跑不到90FPS时,SteamVR会启用Interleaved Reprojection,让软体改成跑在45FPS,再将这45张画面经过Reprojection处理,产生新的45张画面。运算出的45张画面(正确的画面)跟校正後的45张画面(有误差的画面)交错显示,便会形成类似残影的效果。由於固定在45FPS,残影是稳定的(不会跳来跳去),因此不会有晕眩的问题。
下图左侧是90FPS看起来的样子,下图右侧则是45FPS+Interleaved Reprojection看起来的样子。
http://i.imgur.com/wZgy7WC.png
依据个人实测结果,在只有转动头部的时候,Asynchronous Reprojection效果很好,不容易察觉掉帧,适合坐着玩的VR游戏。不过对於Room-scale游戏来说,常常需要前後左右上下移动身体、头部,或者是在眼前挥舞两支动态定位控制器,这时就很容易看出
Asynchronous Reprojection造成的副作用。
由於开启Asynchronous Reprojection後每一张画面都会经过校正,会耗用额外的效能,因此如果软体本来就将电脑性能使用到接近极限,开启Asynchronous Reprojection後反而会一直触发Asynchronous Reprojection,导致效果变得更差。
若是最佳化做得比较差的软体,CPU、GPU使用率不稳定,可能会一下子触发Asynchronous Reprojection、一下子触发Interleaved Reprojection,这种状况就相当恼人了。
因此如果发现画面一直震、移动的物体跳来跳去,这时关闭Asynchronous Reprojection、Interleaved Reprojection其中一个,可能会有较好的效果。
未来Valve有打算替SteamVR加入「motion-vector frame generation technique」,能够校正物体移动,类似下方介绍Oculus的Asynchronous Spacewarp,相信到时用在Room-scale游戏上会有更好的效果。
https://goo.gl/Fnojx1
更多相关资讯可以参考:
Advanced VR Rendering
https://goo.gl/svX8Jf
Advanced VR Rendering Performance
https://goo.gl/BIio9R
Oculus Rift + Oculus SDK , Asynchronous Timewarp(ATW) + Asynchronous Spacewarp(ASW):
Oculus将他们使用的Reprojection技术称为Timewarp和Spacewarp,而Asynchronous则是表示Reprojection这个动作是独立运行的,不受CPU、GPU正在进行的工作影响。
Oculus也有动作预测技术,配合上Asynchronous Timewarp,显示的每一张画面都会先经过校正(只校正头部转动)。电脑如果在时间内处理完画面,会先经过校正再显示,电脑如果来不及处理完,则会自动拿前一张旧画面,经过校正再显示。当遇到偶发性来不及处理完画面的情形,Asynchronous Timewarp能够即时补上,使用者不易感觉到掉帧,是其一大优点。
Asynchronous Spacewarp是和Asynchronous Timewarp互补,当Asynchronous Spacewarp启用时,会让软体跑在45FPS,并利用前两张画面预估使用者头部、虚拟物体"未来"的动向,对使用者头部和虚拟物体的移动进行校正,补上不足的45张画面。
Asynchronous Spacewarp不会有前述的残影问题,但由於不可能用两张旧画面就100%准确预测未来的动作,而且假设一颗球由A点移到B点,也不可能凭空得知原本在A点後面有什麽东西,因此Asynchronous Spacewarp会造成移动的物体边缘有一些变形的情形,但比起只校正转动造成残影仍是好得多。
下面连结中的图片可以看到Asynchronous Spacewarp造成移动中的蓝色球边缘变形(第1、3、5张图是电脑一般运算出来的,第2、4张图是透过Asynchronous Spacewarp补上的,图片中残影则是拍摄者相机造成的)
http://imgur.com/a/V6XeP
可以说目前Oculus使用的Reprojection技术是最进步的,造成的「副作用」也最少。
更多相关资讯可以参考:
The Latent Power of Prediction
https://goo.gl/1Rl9Ea
Asynchronous Timewarp on Oculus Rift
https://goo.gl/OmJT8E
Asynchronous Spacewarp
https://goo.gl/d7ZDZg
Under the Hood of the Rift SDK Building for Touch
https://youtu.be/eAl2l_1KfqQ
Playstation VR , Asynchronous Reprojection:
有关Playstation VR使用的Reprojection技术的资料不多,只知道其头戴显示器萤幕支援90Hz和120Hz的更新频率,开发者可以选择让其软体跑在90FPS、120FPS,或者是跑在60FPS并透过Reprojection补上不足的60FPS。(但考量到PS4性能较弱,多数软体可能会选择60FPS+Reprojection。)
此外开发者也可以选择是否要每一张画面都经过Reprojection校正再显示。
更多相关资讯可以参考:
Embrace Virtual Reality with PlayStation® VR
https://youtu.be/3RNbZpcfAhE
总的来说,Reprojection能够有效地降低延迟、避免晕眩,但经过Reprojection产生的画面多少会有些「副作用」,提升硬体性能、软体效率、画面更新率仍旧是带来流畅VR体验的最佳解!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.241.149.29
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/VR/M.1476531943.A.C4E.html
※ 编辑: luyaoting (111.241.149.29), 10/15/2016 19:52:33
1F:→ kuma660224: 之前的资料,Daydream也会有类似技术。10/15 20:03
※ 编辑: luyaoting (111.241.149.29), 10/15/2016 20:04:01
2F:推 nfsong: 专业推 24.22ms感觉wireless 很困难阿10/15 20:04
3F:→ luyaoting: 不知道Vive的定位系统能够有效预测到多久以後,能预测10/15 20:10
4F:→ luyaoting: 越久,就有越多时间来做无线传输 10/15 20:10
5F:推 akilight: 不过Oculus其实也有说,ATW终究只是辅助手段,不是万灵丹 10/15 20:21
6F:→ akilight: 单纯的转动没问题,但是最麻烦的还是位移处理10/15 20:22
7F:→ akilight: 在一些情形下,ATW处理位移补差造成的judder会被使用者10/15 20:22
8F:→ akilight: 注意到,就会失去减少晕眩的效果10/15 20:23
9F:→ akilight: 而在最坏的情形中反而会增加使用者的晕眩,所以他们建议10/15 20:23
10F:→ akilight: 开发者还是尽量不要依赖这个效果,尽量让画面能达到原生10/15 20:23
11F:→ akilight: 90FPS,ATW当作偶尔掉格时的应急手段就好10/15 20:24
12F:推 akilight: 不过最新的ASW看起来有大幅改善ATW在位移处理上的短处10/15 20:29
13F:→ akilight: 似乎还满不错的10/15 20:30
14F:→ akilight: 至於PSVR,之前看到的一些资讯是只有类似ATW的处理10/15 20:30
15F:→ akilight: 没有ASW,所以在某些情形下会出现一些artifacts10/15 20:31
16F:→ luyaoting: PSVR看国外体验心得,有些人有提到快速移动的物体有残10/15 20:48
17F:→ luyaoting: 影,感觉是比较像ATW10/15 20:48
18F:推 SULAjardin: 1080玩Onward, Reprojection直接关掉(原始设定on), 否10/15 21:07
19F:→ SULAjardin: 则只能超级取样1.0, 还要把游戏内画质降为low ...10/15 21:09
20F:→ SULAjardin: 听教我的老外说, 每次SteamVR更新都要去关一次,10/15 21:11
21F:→ SULAjardin: SteamVR更新完常会又把Reprojection打开...10/15 21:12
※ 编辑: luyaoting (111.241.149.29), 10/15/2016 21:15:01
※ 编辑: luyaoting (111.241.149.29), 10/15/2016 21:16:02
22F:→ luyaoting: SteamVR的Interleaved Reprojection是比较单纯的安全 10/15 21:21
23F:→ luyaoting: 机制,能跑到90FPS的话不会作用。我没玩Onward,你可10/15 21:21
24F:→ luyaoting: 以照我前一篇文的方式,分别在允许/不允许再投影的情 10/15 21:21
25F:→ luyaoting: 况下检查看看CPU、GPU负载。 10/15 21:21
※ 编辑: luyaoting (111.241.149.29), 10/15/2016 21:53:58
26F:推 ashinet: 好文,的确daydream也有动手脚 10/16 00:57
27F:推 SULAjardin: 谢谢, 刚依照你教的方法执行, 发现多人驳火时, CPU会 10/16 01:31
28F:→ SULAjardin: 像针刺一样超过11.11ms ,GPU一直都在安全范围内. 10/16 01:32
29F:→ SULAjardin: 把Reprojection又打开了, 当初为了最佳化Onward效果,10/16 01:33
30F:→ SULAjardin: 同时尝试了许多步骤有成, 现在想想, 关Reprojection 10/16 01:34
31F:→ SULAjardin: 或许是不必要DER, 非常感谢 10/16 01:34
32F:→ abc2090614: 启动onward时按住alt把电脑萤幕的视窗拉小可以改善10/16 03:10
33F:→ abc2090614: 很多掉祯的问题 这算是Unity游戏的问题10/16 03:10
34F:推 SULAjardin: 我是把电脑桌面的Onward游戏画面最小化,当初抓超采和10/16 13:40
35F:→ SULAjardin: 显卡风扇转速&温度时, 发现这样可以降GPU温度5~10度. 10/16 13:41
※ 编辑: luyaoting (1.160.112.53), 10/16/2016 19:55:13
※ 编辑: luyaoting (1.160.112.53), 10/16/2016 19:59:09
※ 编辑: luyaoting (1.160.112.53), 10/16/2016 20:00:08
36F:推 zebb: 推好文! 10/17 09:04
37F:推 yannicklatte: 推 10/18 19:55
38F:推 giintaipei: 好清楚呀!! 推 10/20 18:53
※ 编辑: luyaoting (220.141.115.38), 10/26/2016 06:57:29
※ 编辑: luyaoting (36.227.245.57), 11/20/2016 17:32:29