[技術] 目前三大VR設備使用的再投影技術簡介
什麼是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://www.ptt.cc/bbs/VR/M.1476531943.A.C4E.html
※ 編輯: luyaoting (111.241.149.29), 10/15/2016 19:52:33
→
10/15 20:03, , 1F
10/15 20:03, 1F
※ 編輯: luyaoting (111.241.149.29), 10/15/2016 20:04:01
推
10/15 20:04, , 2F
10/15 20:04, 2F
→
10/15 20:10, , 3F
10/15 20:10, 3F
→
10/15 20:10, , 4F
10/15 20:10, 4F
推
10/15 20:21, , 5F
10/15 20:21, 5F
→
10/15 20:22, , 6F
10/15 20:22, 6F
→
10/15 20:22, , 7F
10/15 20:22, 7F
→
10/15 20:23, , 8F
10/15 20:23, 8F
→
10/15 20:23, , 9F
10/15 20:23, 9F
→
10/15 20:23, , 10F
10/15 20:23, 10F
→
10/15 20:24, , 11F
10/15 20:24, 11F
推
10/15 20:29, , 12F
10/15 20:29, 12F
→
10/15 20:30, , 13F
10/15 20:30, 13F
→
10/15 20:30, , 14F
10/15 20:30, 14F
→
10/15 20:31, , 15F
10/15 20:31, 15F
→
10/15 20:48, , 16F
10/15 20:48, 16F
→
10/15 20:48, , 17F
10/15 20:48, 17F
推
10/15 21:07, , 18F
10/15 21:07, 18F
→
10/15 21:09, , 19F
10/15 21:09, 19F
→
10/15 21:11, , 20F
10/15 21:11, 20F
→
10/15 21:12, , 21F
10/15 21:12, 21F
※ 編輯: luyaoting (111.241.149.29), 10/15/2016 21:15:01
※ 編輯: luyaoting (111.241.149.29), 10/15/2016 21:16:02
→
10/15 21:21, , 22F
10/15 21:21, 22F
→
10/15 21:21, , 23F
10/15 21:21, 23F
→
10/15 21:21, , 24F
10/15 21:21, 24F
→
10/15 21:21, , 25F
10/15 21:21, 25F
※ 編輯: luyaoting (111.241.149.29), 10/15/2016 21:53:58
推
10/16 00:57, , 26F
10/16 00:57, 26F
推
10/16 01:31, , 27F
10/16 01:31, 27F
→
10/16 01:32, , 28F
10/16 01:32, 28F
→
10/16 01:33, , 29F
10/16 01:33, 29F
→
10/16 01:34, , 30F
10/16 01:34, 30F
→
10/16 01:34, , 31F
10/16 01:34, 31F
→
10/16 03:10, , 32F
10/16 03:10, 32F
→
10/16 03:10, , 33F
10/16 03:10, 33F
推
10/16 13:40, , 34F
10/16 13:40, 34F
→
10/16 13:41, , 35F
10/16 13:41, 35F
※ 編輯: 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
推
10/17 09:04, , 36F
10/17 09:04, 36F
推
10/18 19:55, , 37F
10/18 19:55, 37F
推
10/20 18:53, , 38F
10/20 18:53, 38F
※ 編輯: luyaoting (220.141.115.38), 10/26/2016 06:57:29
※ 編輯: luyaoting (36.227.245.57), 11/20/2016 17:32:29