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