13
本文作者: 王銳 | 2016-03-22 18:48 |
按:作者王銳,VR領(lǐng)域資深從業(yè)者。
這個標題看上去很瘋狂,而且筆者正試圖讓它變得更瘋狂一些:沒錯,我們可不打算讓用戶還得專門插個手機進去播全景小電影——我們要做VR頭盔,能duang地運行起一個PC端的正經(jīng)VR游戲的那種!
然而,如今的虛擬現(xiàn)實頭盔正呈現(xiàn)出OculusVR,HTC Vive和PSVR三分天下之勢,國內(nèi)也有樂相、3Glasses、星輪等廠商投入重金攻關(guān)。筆者在這里突然自詡為“極客”,然而實際上又算是哪根蔥呢?嘴上說要做一款正經(jīng)的虛擬現(xiàn)實頭盔,實際上卻恐怕連入行的廟門都找不到才對吧:三星OLED屏的渠道有么,菲涅爾鏡片長什么樣認識么,屏幕分辨率和刷新率能達標么,Unity或者Unreal程序能寫出一行么,以及渲染優(yōu)化,工業(yè)設(shè)計,外觀內(nèi)襯,人體工學種種……至少,看起來這樣繁多和艱險的任務(wù),能在短短的一篇文章里解決么?
也許不能;不過,這并不代表我們就不去嘗試一些事情。極客的準則首先是實踐。然后才看它與我們理想中的結(jié)果還有多遠。
那么,我們這就開始。首先,是用什么來顯示的問題。
所謂媒介也就是選擇顯示畫面的一塊屏幕。
傳統(tǒng)的液晶顯示屏大都是采用薄膜晶體管(Thin Film Transistor,TFT)作為核心技術(shù),在基板的背部設(shè)置光源主動控制屏幕上的各個像素,它的屏幕反應(yīng)時間通??梢赃_到60-80ms左右。這樣的延遲作為電腦和電視屏幕沒有任何問題,但是作為頭顯設(shè)備顯然是無法接受的。目前基本上也沒有廠商會選擇這種屏幕作為顯示的載體。
IPS屏幕(In-Plane Switching)改變了液晶分子顆粒的排列方式,雖然本質(zhì)上還是TFT屏幕的衍生品,但是擁有很好的清晰度和可視角度表現(xiàn),甚至可以做到接近180度的視角。IPS屏幕的刷新率也遠高于傳統(tǒng)的TFT液晶屏,可以達到60Hz的水準,對于VR應(yīng)用來說基本上差強人意。絕大部分國內(nèi)頭顯廠商都使用了IPS屏幕作為自己方案的一部分。
OLED屏幕則是目前高質(zhì)量VR頭盔實現(xiàn)的首選(包括三大家和國內(nèi)的樂相Deepoon),它具有自發(fā)光的特點,因此不需要額外的背光板,也改善了因此產(chǎn)生的余暉(Persistence)和拖影現(xiàn)象;同時它的反應(yīng)時間很快,足以做到75Hz甚至更高的刷新率。但是OLED小尺寸屏幕做到更高的屏幕分辨率,目前難度還比較大,良品率較低;同時因為有源的AMOLED供電需求較高,通常需要大于8V的電壓和穩(wěn)定電流,因此電壓管理的設(shè)計更為復(fù)雜,要找到穩(wěn)定可靠的生產(chǎn)和供貨渠道也更為困難(不過據(jù)說只要付給三星60萬,就可以開啟新世界的大門了)。
筆者并不想在這里挑戰(zhàn)自己的財務(wù)底線,因此選擇了更容易購買散件的IPS屏幕,并且為了能夠得到更好的顯示效果,顯然至少要達到2K的屏幕分辨率(2560 x 1440)才能讓觀眾感到滿意。
從上圖以及之前的OculusVR拆解圖中,我們都可以看到一塊與屏幕直接連接的電路板,它被稱作驅(qū)動板。它負責與屏幕連接,將來自外部的數(shù)字視頻信號通過HDMI或者MDL接口輸入并轉(zhuǎn)換到屏幕上顯示,同時還要負責電壓管理和保護。
對于OLED來說,復(fù)雜封閉的接口規(guī)格說明以及頗為棘手的電源管理問題,限制了很多國內(nèi)廠家為它制作驅(qū)動板的能力;而IPS屏的驅(qū)動板使用則更為成熟,基本上可以直接連接電腦并作為擴展顯示屏使用;或者燒錄新的EDID信息,從而將屏幕識別為Oculus DK1和DK2設(shè)備(前者已經(jīng)開源),并且直接連入OculusVR接口和游戲內(nèi)容。
顯示和驅(qū)動的問題看起來有了眉目,另一個問題也是絕對不可忽視的,那就是鏡片的選擇。
VR頭盔中的菲涅爾透鏡隔在人眼和顯示屏的中間,主要負責改變光路并產(chǎn)生畫面的放大效果,盡可能與人眼的實際FOV(視場角度)相匹配,從而帶來包裹感和沉浸感。然而透鏡的色散效應(yīng)會在邊緣產(chǎn)生不正確的畫面色差,透鏡的形狀也會極大影響畫面的成像質(zhì)量。這些問題不妨參考另一位老師發(fā)表過的文章(點擊查看)。
除此之外,如何將這些設(shè)備連接到一起,形成一個外觀和內(nèi)里排布都足夠合理的結(jié)構(gòu),以及與使用者頭部的連接和固定方法。這些與工業(yè)設(shè)計密切相關(guān)的問題也都是相關(guān)從業(yè)者們所必須要關(guān)注和考慮的。當然了,選擇三維打印外殼也是一個不錯的主意,不過對于這樣一次極客式的嘗試而言,我們遠不需要做到那么復(fù)雜。筆者選擇了Cardboard作為示范的頭盔外殼,并且將剛才的東西一股腦塞進去粘好,點亮!也許,這一切也許并不是那么具有山寨的氣息?
看起來有一點進展了,至少現(xiàn)在有了一塊可以用來看看日本小電影的袖珍屏幕。事實上,如果我們現(xiàn)在就能找到一些以左右眼分隔方式輸出的視頻的話,把它放大到全屏播放就可以看到正確的圖像了!真是令人激動的成果啊,但是買點屏幕和驅(qū)動板就拉倒,這顯然不應(yīng)該是VR頭盔的全部;至少,不能連最基本的交互行為都沒有。
(視頻源來自:360heros.com)
沒錯,我們下一步要解決的問題,就是讓顯示的畫面能夠跟隨頭部的旋轉(zhuǎn)變化,讓使用者真的可以有身臨其境進行觀察的感覺。既然是模擬頭部的旋轉(zhuǎn)姿態(tài)輸出,自然少不了一個重要的參與者:慣性傳感器(IMU)。
筆者在另一篇拙文中曾經(jīng)提及IMU的實現(xiàn)原理,參見其中第(4)節(jié):《成為VR的利器之前,運動捕捉技術(shù)是如何發(fā)展過來的?》
那么,我們從IMU傳感器中能夠得到什么樣的數(shù)據(jù)呢?通常一個九軸的IMU傳感器(包含三軸加速度計,陀螺儀與地磁傳感器)可以輸出如下所示的數(shù)據(jù)內(nèi)容:
958 65517 268 0 0 0 38 70 65497
958 65517 268 0 65535 0 38 70 65497
958 65518 269 0 65535 0 38 70 65497
958 65517 270 0 65535 0 38 70 65497
958 65517 270 0 65535 65535 38 70 65497
……
(注意,對于int16格式的傳感器數(shù)據(jù),實際上這里的65535 = -1)
這顯然無法用來表達任何的姿態(tài)信息,并且因為民用傳感器的設(shè)備精度很低,直接采用陀螺儀(即角速度傳感器)數(shù)據(jù)乘以時間間隔的結(jié)果,也基本上完全無法表達真實的轉(zhuǎn)動情況。幸好,偉大的數(shù)學家們發(fā)明了Sensor Fusion(傳感器融合)方法。
Sensor Fusion,顧名思義就是把各路并不精準的傳感器數(shù)據(jù)合在一起,取得一個更好的整體結(jié)果值。事實上加速度計、陀螺儀和地磁傳感器確實可以相互彌補弱點,從而有效地填補空白數(shù)據(jù),從而得到反應(yīng)更靈敏也更流暢的輸出結(jié)果。
常見的Sensor Fusion算法主要包括Kalman Filter,Mahony filter以及Madgwick filter等等,其基本共性是對輸入的數(shù)據(jù)進行濾波和融合處理,得到平滑、低延遲、低抖動的結(jié)果數(shù)據(jù)(通常是世界坐標系下的旋轉(zhuǎn)姿態(tài)值,歐拉角度或者四元數(shù)形式)。很顯然,IMU本身的輸出頻率越高,最終結(jié)果的頻率也就越高,這也是為什么GearVR會采用高達1000Hz頻率的單一傳感器作為姿態(tài)計算的依據(jù),而不是手機本身的陀螺儀(根據(jù)手機品牌的不同,有些傳感器的質(zhì)量可能會很差,甚至被閹割)的原因。國內(nèi)廠商(例如焰火工坊等)也采取了類似的做法,以求整個Sensor Fusion和姿態(tài)計算過程高效且可控。
(Via vimeo.com)
毫無疑問,如果選擇九軸IMU作為姿態(tài)傳感和輸出設(shè)備,那么就可以直接得到使用者頭部的世界旋轉(zhuǎn)角度信息,進而控制內(nèi)容的渲染以及交互。但是地磁傳感器本身非常容易受到環(huán)境磁場的影響,例如附近有磁性的設(shè)備,抑或是鐵制的桁架和管路,都可能改變地磁傳感器的輸出,進而產(chǎn)生一個錯誤的融合結(jié)果!此外,地磁傳感器本身也需要預(yù)先進行標定,畢竟融合算法是需要對地磁數(shù)據(jù)進行歸一化(取當?shù)氐卮抛钚『妥畲笾?,然后重映射到[0,1]區(qū)間)之后才能準確計算的,而北京和澳大利亞的磁場參數(shù)顯然大相徑庭。
另一種選擇是放棄地磁傳感器,轉(zhuǎn)而采用僅包含三軸加速度計和陀螺儀的六軸IMU來計算相對旋轉(zhuǎn)姿態(tài)。這樣避免了標定和場地的限制,并且也有研究表明,單純采用六軸IMU計算的響應(yīng)速度更快,數(shù)據(jù)穩(wěn)定后的抖動幅度更低。不過因為沒有地磁數(shù)據(jù)作為參照,因此每次開機后頭盔的初始姿態(tài)是無法預(yù)知的,因此也就無法確定游戲者是否一開始就能看到重要的三維提示信息,還是需要困惑地四處轉(zhuǎn)頭去尋找入口(如下圖OculusVR的Demo場景,一個簡單的Start按鈕):
設(shè)備接口的選擇也是有講究的,USB無疑是目前最為常見的方案,事實上無論Oculus VR還是HTC Vive都選擇使用USB接口來輔助供電和傳遞姿態(tài)信息。當然這一切在起步階段都沒有必要自己去制板和焊接,因此筆者根據(jù)上述的選擇條件,在淘寶上毫不猶豫地相中了下圖一款封裝完整,物美價廉的IMU傳感器模組:
它采用了九軸IMU傳感器,數(shù)據(jù)通過UART轉(zhuǎn)換到USB接口輸出,并且已經(jīng)做好了片上融合,即硬件已經(jīng)通過Sensor Fusion算法計算得到了真實的世界旋轉(zhuǎn)姿態(tài),并且提供了簡單的標定方案。因此現(xiàn)在要做的就是把這個傳感器粘貼到紙質(zhì)頭盔的合適位置上,然后將姿態(tài)數(shù)據(jù)傳遞給自己的程序,及時改變當前用戶觀察的視角和渲染內(nèi)容。
現(xiàn)在我們有了一個看起來像模像樣的VR頭盔,雖然一切都是硬紙殼子加上3M膠帶組成,但它至少可以播放來自電腦的任意豪華分辨率的立體電影,并且通過簡單的程序進行視角控制;最關(guān)鍵的是,整個系統(tǒng)的延遲似乎完全在我們能夠接受的范圍內(nèi)——勝利在望了嗎?那么隨后我們要解決的,是顯示內(nèi)容開發(fā)的問題。
很顯然,只是做了一個粗糙的影片播放器,這并不能滿足一名極客的進取欲望。要讓別人制作的游戲接入到我的頭盔里面,然后構(gòu)建自己的SDK開發(fā)接口和游戲內(nèi)容平臺,這也許才是我們內(nèi)心的狂野獨白——當然這并不是小小的一篇文章所能承載的龐大構(gòu)想。不過至少,現(xiàn)在才應(yīng)該是有著十年圖形學和底層渲染引擎開發(fā)經(jīng)驗的筆者發(fā)威的時間。
筆者選擇自己熟悉的OpenSceneGraph開源引擎來做一個簡單場景的渲染,為了確保它在山寨VR頭盔里的顯示是正確的,我們需要將場景畫面重復(fù)渲染兩次,分別對應(yīng)人的左右眼所見的內(nèi)容。大腦會根據(jù)這兩幅畫面在視網(wǎng)膜的成像,主動對比和生成具有強烈立體感的畫面。然而人的雙眼之間存在著一定的間隔,因此在觀察同一個場景的時候會存在著方向上的偏差,也就是視差。使用程序執(zhí)行渲染時,需要對左右眼的觀察矩陣和投影矩陣做一個偏移處理,以模擬這個視差現(xiàn)象,從而欺騙大腦讓它以為自己置身于虛擬世界。
我們現(xiàn)在把程序的畫面全屏輸出到VR頭盔的顯示屏上,再加上IMU的姿態(tài)輸入來改變觀察矩陣,看起來一切都很美了,只是感覺有點變形?沒錯,別忘了眼睛和顯示屏之間的那個透鏡,它很可能會造成桶形畸變(Barrel distortion)的現(xiàn)象,也就是說,靠近邊緣的畫面中,直線將不再以直線的形式出現(xiàn),而是產(chǎn)生了彎曲變形。
(Via www.programmipermac.com)
我們需要一個全屏后處理的方案來糾正這種畸變。
簡單來說,就是剛才渲染的場景不再直接輸出到屏幕上,而是輸出到一處顯卡內(nèi)存區(qū)域(Frame buffer object),然后對這張內(nèi)存中的圖像進行進一步的處理:包括處理失真,鏡片引起的色散,改變對比度和亮度,修正色彩曲線,等等,就像是我們在Photoshop中做的一樣。注意這里我們對原始輸出的場景畫面做了變形,從而與鏡片的畸變參數(shù)進行匹配,在視野中得到正確無失真的結(jié)果。
現(xiàn)在再把畫面接入到頭盔中,是不是好了很多呢?當然了,如何處理失真,如何處理色散,這些都是與鏡片以及顯示屏的參數(shù)密切相關(guān)的,并非一個統(tǒng)一的數(shù)值。如果真的要完成某種VR頭盔的生產(chǎn)流程的話,那么類似的校正參數(shù)計算和設(shè)置工作顯然要在設(shè)備出廠的時候完成,交到消費者手中的顯然應(yīng)該是即插即用的成品了。
當然了,這樣一副VR頭盔能否讓人有身臨其境的感受,并不僅僅是把零件組合起來再編寫程序那么簡單。硬件的參數(shù)和工裝設(shè)計,內(nèi)容本身的渲染精細程度,以及因為這種精致渲染而帶來的額外的計算延遲,都是影響體驗品質(zhì)的重要環(huán)節(jié)。
而所有這些細節(jié)的處理,是不能在短小的文章中統(tǒng)統(tǒng)得到體現(xiàn)的——如何在一個看起來很美的原型基礎(chǔ)上實現(xiàn)真正可以商用和民用的VR頭盔,以及如何確保每個環(huán)節(jié)的供應(yīng)鏈和渠道暢通,產(chǎn)品大賣,這都不再是我們以極客范兒能夠面對的問題了,那需要一支龐大而高效的團隊去不斷努力完善,就像如今VR行業(yè)眾多創(chuàng)業(yè)公司們所追求的一樣。
那么,我們?yōu)榇嘶ㄙM了多少成本呢?
2K IPS顯示屏和驅(qū)動板:1400元,老板說多買可以半價哦。
九軸IMU傳感器與USB底板:128元。
Cardboard硬紙外殼和鏡片:19元,總覺得好像沒這么貴才對啊,另外鏡片也建議自己選配更好的菲涅爾透鏡組。
程序開發(fā):自己動手,豐衣足食。
這篇文章有自己的終點,但是鉆研的道路事實上遠遠沒有達到盡頭。虛擬現(xiàn)實頭盔是我們沉浸在全新世界的第一步,即取代了人們的視覺。但是無法與世界互動終究是十分無趣的,交互要如何來做,手柄?手套?動捕?空間定位?聲音?手勢?抑或其它稀奇古怪的方式,這又是一個完全不一樣的命題,也是下一個VR熱點話題的聚集地。
對于畫面質(zhì)量的提升和延遲感的降低,也是人們不斷去追求的目標。
例如Time Warp以及Asynchronous Time Warp這樣的算法,可以通過對當前渲染畫面進行插值計算得到一些模擬的中間畫面,避免因為幀速率不足而產(chǎn)生的抖動和遲滯感。不過這并非仙丹妙藥,優(yōu)化場景渲染速率以真正達到無延遲的畫面隨動才是正途。然而畫面的優(yōu)化往往又意味著渲染質(zhì)量的降低,真實感隨之下降。如何在其中權(quán)衡利弊,甚至投機取巧做一些戲法似的效果,這又是對眾多內(nèi)容開發(fā)者們的一個全新的挑戰(zhàn)。
多說一句的話,筆者也曾經(jīng)實現(xiàn)過一種基于單次渲染GBuffer數(shù)據(jù)然后在后處理階段構(gòu)建雙目畫面顯示的方法,可以適用于各類開闊場景和沒有復(fù)雜管道結(jié)構(gòu)的室內(nèi)場景,對效率的提升當然也是不言而喻的。
更多的腦洞還在開啟當中,例如基于眼動追蹤的渲染,可以基于NVIDIA的MultiRes架構(gòu)將眼球聚焦位置之外的場景用低分辨率處理,從而減少像素著色過程的計算時間;又比如VR一體機的興起,用高性能的移動開發(fā)板(例如Tegra X1)與顯示屏直接構(gòu)成一體化的頭盔,不再從電腦或者手機上輸出場景畫面,而是采用配套的SDK工具編寫專屬游戲。
總之,一切還遠遠沒有到達盡頭,未來很美,只愿越來越多的從業(yè)者們能夠選擇腳踏實地,從技術(shù)和產(chǎn)品化的角度更多地思考問題,讓更多的原型產(chǎn)品和忽悠概念能夠最終落到實處。
王銳【VR系列】文章推薦:
1 、從60Hz到75Hz,完成一次VR的場景優(yōu)化需要遍歷哪些血淚史?
3、在討論全景視頻的未來之前,我們先搞清楚全景視頻是如何實現(xiàn)的
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。