Oculus分辨率爲1080P,單眼960 * 1080;song 的project morpheus爲1080P;HTC vive的爲單眼1200 * 1080;三星的Gear VR爲1440P。
僅從參數來說,四個設備能夠說處於同一層次,差距不大。反正都能看出像素顆粒感。
直覺來說,這樣的分辨率好像是夠了。但因爲眼睛離屏幕太近,並且經過透鏡的廣角放大(爲了更大的FOV),與常規設備相比相同分辨率下顆粒感確定更強。
並且對於Oculus來說,其採用的OLED屏的子像素排列方式爲PenTile(常說的P屏),而非RGB。
能夠說是用低分辨率模擬高分辨率,有點upscale的意思,效果天然要打折扣。php
變形復原app
上面也說了,爲了更大的FOV看到更寬的畫面,全部的VR設備都加了透鏡,如上圖。
中間還好,邊緣變形厲害。這種Optical Distortion效果只能經過後期效果來補償。工具
Oculus SDK裏已經把這種矯正作過了,並且特意強調:使用默認的變形Shader,若是本身作,即使看上去正確也極可能會引發不適。
不過若是本身作渲染,例如爲依附於Google Cardboard的各種國產眼鏡平臺開發內容等,應該特別注意優化這一點。性能
延遲
延遲爲使用者頭部移動到新圖像顯示的時間差(運動到顯示),還包括傳感器反映、傳感器數據融合、渲染、圖形傳送、顯示器刷新的時間總和。
延遲最小化是產生沉浸感而且保持溫馨的關鍵所在,Oculus認定引人入勝的延遲閥值爲20ms,固然越小越好。
解決這個問題有兩種方法:第一,儘量下降延遲;
第二真正渲染的時候不使用傳入的參數而是預測相機位置來彌補從傳感器讀數到最後圖形顯示的延遲時間差。
第一種方式受限於硬件太難,oculus採用的是第二種方法,稱做TimeWrap技術。
簡單來說,就是利用depth buffer反向計算出世界空間位置,再根據傳感器讀數進行「世界空間旋轉偏移」來抵消Present GPU的時間。具體原理點擊此處,這也是Oculus的核心競爭力之一。優化
效率優化
Oculus要求幀率至少在75以上且要保持足夠穩定。想像一下這麼大分辨率加上左右兩眼各渲染一遍(不只僅是double drawcalls),相對於傳統遊戲來說,優化壓力真是山大!
本覺得現有硬件已經足夠強大,但VR的出現讓人感受讓硬件水平一會兒回到了5年前。下圖是Oculus消費版CV1的推薦配置:動畫
UE4的PPT裏提過一次draw傳入兩個視口(view matrix),不過要對最底層渲染管線作出修改,難度頗大;
好消息是Nvidia和AMD也看到了VR的巨大潛力,正嘗試雙卡各畫一個視口,相信之後PC機能再也不是問題了。
(以前寫過一篇關於UE4的優化工具:UE4內置的性能調試方法和工具)spa
用戶界面
VR中界面最好作成3D世界的一部分,不要像傳統遊戲同樣懸浮在平面中。
一方面是這樣作更加逼真,另外很重要的緣由就是防止用戶在hud和遠處畫面之間切換視覺焦點形成眼睛疲勞和不適。
咱們最終的解決方案是用3D模型替代傳統HUD,這裏面分爲兩種:設計
o 功能性的HUD(如血條、進度條)。首先利用傳統制做UI的方法藉助UE4的UMG系統作出UI,而後藉助RenderTarget的方式往模型上貼。3d
o 純表現型的UI就和傳統制做模型無異了。由於hud有Touch(hower)、Click等狀態,因此要有材質變化或者動畫表現。這裏面最須要注意的就是理出製做規範!
考慮到弧面HUD很經常使用而且徹底能夠程序化自動生成,因此專門針對UE寫了一個可參數化生成弧面的Component;
UE4只支持把UMG 界面渲染到一個Quad上面,後面本身又擴展到可以支持美術提供的任意Mesh以及上面提到的程序化生成的弧面。調試
交互
一樣不一樣於傳統遊戲,用戶帶上VR眼睛以後直面虛擬世界,所以現實世界中的鼠標鍵盤等須要精準操做的傳統輸入方式通通歇菜。
Oculus消費版之後會提供Oculus Touch,左右手各一個,不過如今拿不到,聽說手感很不錯。
索尼的Project Morpheus有PS Move,問題不大
HTC和value合做的Vive也有雙手控制器,相似Wii Nunchuck的感受,不肯定是不是最終方案。
移動平臺:
o 三星的Gear VR在頭盔上有幾個按鈕不過至關雞肋;
o 國內暴風魔鏡能忽悠起來,相信其配套的藍牙遙控器加分很多,體驗下來雖沒有位置定位,但也能作不少事。
體驗過其餘遊戲,也發現一些其餘的控制方式,好比《神經元》中的頭部瞄準:眼睛盯着看2秒來觸發設計。
具體到咱們項目:
o 嘗試過Leap Motion,不過要把手限制於設備上方,不夠實用
o 正在嘗試razer hydra。有位置追蹤和不少按鍵,繼續優化體驗中。
o 主打Kinect操做。
關於Kinect操做
這種方式最大的優勢是很是天然,最有代入感。遊戲中利用Kinect捕獲的depth buffer,用點雲的方式渲染出本身的虛擬形象,科技感十足。
不過精度不理想,能識別的手勢有限;自定義的各類手勢之間也會有誤操做等,須要各類邊界條件來過濾掉。
舉例來講,握拳選中控件(控件由近及遠有層次分佈的概念),選中以後能夠:單手左右移動,拽着控件在當前層次上左右移動;單手先後移動,推拉控件切換層次。
裏面的誤操做有兩個:
o 握拳一瞬間手的位置會抖,而後控件位置跟着抖動了。這須要加一個握拳有效斷定時間來把這個抖動過濾掉。
o 左右和先後自己有衝突:左右移動時會夾帶着先後小幅度移動,反過來同樣。這就須要根據位移速度篩選出有效運動狀態。
相似的條件過濾有不少。須要不斷體驗,一步步去迭代優化。
其餘
o 對於Oculus Touch、razer hydra這類有位置追蹤的控制器,估計不少場合下要作手臂IK
o billboard型的面片特效在3D效果下極易穿幫,所以須要製做volume effect,以下圖
(圖來自於unreal著名VR demo: Showdown)
o 一樣2D屏幕下效果很好的normal map在3D效果下立體感大打折扣,換成複雜點的parallax mapping效果會好不少。
(用normal map雖然兩眼的光照計算會根據相機矩陣不一樣結果不一樣,但畢竟對於左右眼來講normal同樣,凹凸程度同樣;
加了bump offset的parallax map由於有UV偏移的存在,致使雙眼取得的normal不同,最終結果差別大,立體感很強)
總結總體來看,VR遊戲相對傳統遊戲差別沒想象中那麼大。VR相關的特定三大塊:渲染出左右兩幅圖像、頭部(相機)追蹤、變形復原,經常使用引擎如UE四、Unity等都有封裝,不須要太費心。即使不用通用引擎,再往下走別忘了還有平臺提供的SDK。特別須要操心的是效率優化、玩法以及交互方式。當前,國內外VR硬件平臺如雨後春筍般紛紛冒了出來,本次ChinaJoy上VR的火爆場面也讓人浮想聯翩。趨勢已經起來了,咱們須要作的就是作好積累、守在風口,等待飛起的那一刻!