關(guān)注微信公眾號(hào)
創(chuàng)頭條企服版APP
原標(biāo)題:研發(fā)實(shí)戰(zhàn):Oculus發(fā)布ASW 2.0開發(fā)者指南
來(lái)源:映維網(wǎng) 作者 廣州客
Oculus在2018年4月發(fā)布了涵蓋Asynchronous Spacewarp 1.0(異步空間扭曲;ASW)和Positional Timewarp(定位時(shí)間扭曲;PTW)的ASW 2.0,并旨在實(shí)現(xiàn)更高質(zhì)量和更低延遲的VR體驗(yàn)。
最近Oculus再次介紹了有關(guān)ASW 2.0的更多技術(shù)細(xì)節(jié),以及如何確保你的VR應(yīng)用能夠兼容ASW 2.0的技巧。下面是映維網(wǎng)的具體整理:
1. 從ASW到PTW
當(dāng)Oculus在2016年帶來(lái)了ATW(Asynchronous Timewarp;異步時(shí)間扭曲)之后,發(fā)布PTW是合乎邏輯的下一步,只是當(dāng)時(shí)Oculus發(fā)現(xiàn)了一個(gè)充滿前景的解決方案。這顯然是ASW。ASW可以在時(shí)間方面平滑各種運(yùn)動(dòng)線索(如動(dòng)畫和頭顯追蹤),而PTW只能在時(shí)間方面校正頭顯追蹤。從這個(gè)意義來(lái)說(shuō),ASW看起來(lái)像是一種升級(jí)版PTW,但Oculus很快意識(shí)到PTW存在ASW尚未完全能夠?qū)崿F(xiàn)的優(yōu)勢(shì)。
Oculus在2017年推出了Oculus Dash,以及允許VR應(yīng)用程序提供深度緩沖的選項(xiàng),從而支持其利用名為ovrLayerEyeFovDepth的新圖層類型來(lái)幫助深度合成。如下面的截圖所示,深度緩沖區(qū)用于在VR應(yīng)用程序的內(nèi)容穿插Oculus Dash內(nèi)容時(shí)應(yīng)用X射線效果。同時(shí),Oculus的Engine-Integrations團(tuán)隊(duì)開始在Unreal 4和Unity中使用這種圖層類型。
大多數(shù)VR應(yīng)用程序都經(jīng)過(guò)優(yōu)化并能夠以本機(jī)頭顯刷新率運(yùn)行,但只是在單獨(dú)運(yùn)行時(shí)是這樣。當(dāng)Oculus Dash出現(xiàn)并使得CPU或GPU超過(guò)其性能預(yù)算時(shí),這可能導(dǎo)致應(yīng)用程序出現(xiàn)丟幀。在這種情況下,Oculus運(yùn)行時(shí)系統(tǒng)將自動(dòng)將ASW應(yīng)用于VR應(yīng)用程序。但由于ASW在任何給定時(shí)間內(nèi)僅限于一個(gè)合成器層,如果Oculus Dash和VR應(yīng)用程序無(wú)法同時(shí)以所述速率運(yùn)行,將需要一種不依賴ASW并能平滑Oculus Dash內(nèi)容移動(dòng)的方法。這正是PTW有發(fā)揮作用的時(shí)候。當(dāng)Oculus為Oculus Dash打磨PTW時(shí),Oculus繼續(xù)優(yōu)化ASW,令其能夠以與PTW配合使用,并且進(jìn)一步提高時(shí)間穩(wěn)定性。這就是ASW 2.0的誕生過(guò)程。
2. ASW 1.0 vs 2.0
下面這個(gè)視頻是ASW 1.0和ASW 2.0應(yīng)用至《Robo Recall》時(shí)的效果對(duì)比。白色箭頭是調(diào)試指南,其說(shuō)明了每個(gè)圖塊的計(jì)算運(yùn)動(dòng)矢量,并由ASW用于內(nèi)容運(yùn)動(dòng)扭曲。
所述視頻幫助說(shuō)明了兩者的主要差異。對(duì)于ASW 1.0,請(qǐng)注意布告板的視差(由于頭部運(yùn)動(dòng))僅由ASW補(bǔ)償。由于ASW 2.0能夠利用PTW,相同的視差將注冊(cè)最小的ASW校正,因?yàn)樗饕蒔TW處理。如預(yù)期一樣,旋轉(zhuǎn)風(fēng)扇葉片依然由ASW校正,而椅子和幾何邊緣的微小校正則主要?dú)w功于在PTW之后由ASW運(yùn)動(dòng)矢量進(jìn)行的去除遮擋和視圖相關(guān)著色。
3. 結(jié)合ASW和PTW
為了進(jìn)一步理解ASW是如何與PTW結(jié)合使用,我們首先需要明白ASW的流程。以下是Oculus運(yùn)行時(shí)使用ASW所需步驟的細(xì)分:
ASW捕獲由合焦VR應(yīng)用程序提交的先前和當(dāng)前ovrLayerEyeFov幀的紋理。通過(guò)時(shí)間扭曲前一幀,ASW生成“pre-warp frame”并使用當(dāng)前幀的姿態(tài)。ASW將當(dāng)前幀和pre-warp frame紋理轉(zhuǎn)換為GPU視頻編碼器友好型資源。ASW將兩個(gè)幀紋理發(fā)送到GPU視頻編碼器以進(jìn)行對(duì)應(yīng)分析。ASW從GPU視頻編碼器輸出采集“運(yùn)動(dòng)矢量”。ASW后處理并轉(zhuǎn)換運(yùn)動(dòng)矢量以進(jìn)行幀外推。ASW將內(nèi)容打包并注入至合成器層,仿佛它是來(lái)自于VR應(yīng)用程序。Compositor像以往一樣利用ASW注入的ovrLayerEyeFov圖層內(nèi)容進(jìn)行時(shí)間扭曲和變形。
如步驟#2和#8所示,我們依賴于時(shí)間扭曲(Timewarp;TW)。在最初的ASW實(shí)現(xiàn)中,由于缺乏用于PTW的深度緩沖區(qū),所以當(dāng)時(shí)使用的TW重投影技術(shù)是Orientation Timewarp(方向時(shí)間扭曲;OTW)。但隨著越來(lái)越多的VR應(yīng)用程序開始提供深度緩沖區(qū),可以應(yīng)用PTW。訣竅是確保在上述兩個(gè)步驟中的TW-重投影技術(shù)(無(wú)論是OTW還是PTW)是同一類型。這確保了在ASW或TW中能夠校正頭顯移動(dòng)重投影,但不是同時(shí)在兩個(gè)地方校正,因?yàn)檫@會(huì)導(dǎo)致視覺偽影。當(dāng)深度不可用時(shí)(即VR應(yīng)用程序提交ovrLayerEyeFov而非ovrLayerEyeFovDepth),Oculus運(yùn)行時(shí)會(huì)自動(dòng)回到ASW 1.0。
4. PTW風(fēng)格
PTW能夠以多種不同的方式實(shí)現(xiàn)。Oculus的要求中有幾個(gè)非常重要的點(diǎn):
為PTW使用盡可能少的GPU周期,從而允許VR應(yīng)用程序最大化其GPU使用率。無(wú)需處理與上一視圖位置的顯著重投影偏差,因?yàn)槊總€(gè)新的VR-app渲染將使用非常接近前一個(gè)的新頭顯目標(biāo)姿態(tài)。PTW的每次重投影結(jié)果僅在瞬間可見(通常小于20毫秒),因?yàn)閂R應(yīng)用程序以非常高的速率提供新圖像。
熟悉實(shí)時(shí)圖形知識(shí)的人士應(yīng)該知道類似的技術(shù),例如視差映射、視差遮擋映射、高度圖光柵化等等。在大多數(shù)技術(shù)中,著色器將對(duì)高度圖紋理進(jìn)行采樣,從而確定紋理樣本查找的補(bǔ)償量。PTW所使用的深度緩沖區(qū)同時(shí)可以認(rèn)為是旋轉(zhuǎn)到面向camera的高度圖。
為了評(píng)估各種權(quán)衡,Oculus多年來(lái)嘗試了眾多不同的PTW技術(shù)。諸如視差-遮擋映射之類的技術(shù)更精確,但需要花費(fèi)更多的GPU周期。我們選擇的技術(shù)類似于稀疏-視差-映射技術(shù),因?yàn)樗兄谖覀儗?shí)現(xiàn)上述所有要點(diǎn)。與OTW相比,我們的PTW開銷非常低,同時(shí)足以幫助解決由于頭顯轉(zhuǎn)換而在OTW中看到的抖動(dòng)偽影。在大多數(shù)情況下,PTW與OTW的GPU性能損失將在幀定時(shí)噪點(diǎn)中丟失。
5. 深度緩沖區(qū)
PTW主要依賴于深度緩沖區(qū),盡管網(wǎng)絡(luò)存在大量關(guān)于深度緩沖區(qū)的信息,但下面不妨再深入挖掘一下。深度緩沖區(qū)在實(shí)時(shí)渲染中發(fā)揮著重要作用,隨著時(shí)間的推移和GPU性能優(yōu)化的結(jié)合,它們的內(nèi)部表示變得更加復(fù)雜。但在其核心,深度緩沖區(qū)是由GPU在光柵化3D場(chǎng)景時(shí)所生成的值的2D陣列,其中緩沖區(qū)中的每個(gè)元素存儲(chǔ)對(duì)應(yīng)顏色緩沖元素的深度值。由于深度緩沖區(qū)通常作為光柵化的副產(chǎn)品生成并供GPU用于遮擋剔除,所以生成深度緩沖區(qū)的成本是主要考量因素。對(duì)于PTW,在渲染VR應(yīng)用程序時(shí)并生成深度緩沖區(qū)后,可以預(yù)期VR應(yīng)用程序會(huì)將內(nèi)容作為ovrLayerEyeFovDepth圖層的一部分提交。從那時(shí)起,Oculus運(yùn)行時(shí)合成器在Timewarp&Distortion階段處理剩余的PTW重投影。
深度緩沖區(qū)可以以浮點(diǎn)或標(biāo)準(zhǔn)化整數(shù)格式保持值,但這種原始值不直接表示給定像素的距離。相反,深度值是在光柵化期間利用投影矩陣進(jìn)行計(jì)算。投影矩陣會(huì)將每個(gè)頂點(diǎn)和像素轉(zhuǎn)換成最終的深度值并存儲(chǔ)在存儲(chǔ)器中。對(duì)于投影矩陣能夠?qū)⒕€性距離變換為可以存儲(chǔ)在深度緩沖器中的值,這可以視為有效映射線性距離值,并為更接近于用戶的元素帶來(lái)更高精度的方式。
不同的內(nèi)容可以調(diào)用不同的映射方案和剪切邊界。例如,早期是采用基于整數(shù)的低精度深度格式,camera平截頭體的近剪切平面和遠(yuǎn)剪切平面的距離是令人感到沮喪的重要原因。在最近幾年里出現(xiàn)了浮點(diǎn)值,投影矩陣可以將遠(yuǎn)剪切平面映射到無(wú)限遠(yuǎn)。線性距離到最終深度值的映射使得高精度浮點(diǎn)能夠派上用場(chǎng)。請(qǐng)記住,一旦給定頂點(diǎn)進(jìn)行了變換并柵格化為三角形,GPU將自動(dòng)剪切投影范圍和平截頭體之外的元素。
由于這一切的考慮,Oculus在Oculus Rift PC SDK中創(chuàng)建了輔助函數(shù),而應(yīng)用開發(fā)者可以在創(chuàng)建投影矩陣時(shí)予以使用。Oculus同時(shí)提供了允許通過(guò)常用方法來(lái)創(chuàng)建投影矩陣的枚舉。以下是SDK中OVR_CAPI_Util.h文件的摘錄,其說(shuō)明了用于指定投影矩陣的修飾符。有關(guān)每個(gè)枚舉的說(shuō)明,請(qǐng)參閱PC SDK文檔。
enum ovrProjectionModifier {
ovrProjection_LeftHanded,
ovrProjection_FarLessThanNear,
ovrProjection_FarClipAtInfinity,
ovrProjection_ClipRangeOpenGL
};
對(duì)于PTW,Oculus感興趣的是追蹤空間units中每個(gè)像素到渲染camera的距離。如果VR應(yīng)用程序僅提交深度緩沖區(qū)而不包括其他元數(shù)據(jù),Oculus運(yùn)行時(shí)系統(tǒng)將沒(méi)有足夠的信息來(lái)重新計(jì)算像素的原始線性距離。到目前為止,我們不難看出VR-app使用的投影矩陣是PTW算法所需的信息之一。但PTW不需要整個(gè)矩陣,只需要與渲染元素的Z和W坐標(biāo)有關(guān)的部分。為了從投影矩陣中提取必要的組件,SDK同時(shí)提供了一個(gè)可以整齊地打包稱為ovrTimewarpProjectionDesc,以及一個(gè)名為ovrTimewarpProjectionDesc_FromProjection的輔助函數(shù)的最小信息量的結(jié)構(gòu)。如果開發(fā)者不希望將自己的矩陣格式轉(zhuǎn)換為SDK格式,你可以查看函數(shù)的實(shí)現(xiàn),并簡(jiǎn)單地提取必要的組件。
另一個(gè)需要的數(shù)據(jù)是,VR應(yīng)用程序用于渲染units的世界和視圖比例。在某些渲染引擎中,world-unit轉(zhuǎn)換比例不是作為投影矩陣的一部分進(jìn)行處理。這需要特別注意,因?yàn)橛螒蛞娴? unit是1厘米,而Oculus Rift PC SDK總是以米為單位處理unit,即1 unit是1米。當(dāng)所述引擎渲染距離為4米的平面時(shí),應(yīng)用于深度緩沖區(qū)的投影矩陣倒數(shù)將產(chǎn)生400個(gè)unit的距離。但在PTW算法中,我們只希望計(jì)算4個(gè)unit。所以在這個(gè)示例中,除非投影矩陣中已經(jīng)獲得了這個(gè)比例系數(shù),否則將向Oculus運(yùn)行時(shí)提供0.01的渲染比例系數(shù)。VR應(yīng)用程序可以使用ovrViewScaleDesc struct單獨(dú)將這個(gè)值提交給SDK。
6. API局限性
當(dāng)前的深度提交API存在一定的限制,比如說(shuō):
FovDepth層中提交的深度和顏色緩沖區(qū)需要使用匹配的分辨率。不支持深度緩沖區(qū)的“color”格式,例如OVR_FORMAT_R32_FLOAT。不包含多重采樣(MSAA)的OVR_FORMAT_D32_FLOAT(即MSAA)是目前最佳的方式。其他格式可能會(huì)導(dǎo)致Oculus運(yùn)行時(shí)系統(tǒng)出現(xiàn)資源復(fù)制或解析。
7. 總結(jié)和最后的想法
為了將PTW用于一個(gè)給定的VR應(yīng)用程序,Oculus Rift PC運(yùn)行時(shí)需要開發(fā)者采取下面的步驟:
將深度緩沖區(qū)柵格化或復(fù)制到ovrLayerEyeFovDepth圖層的DepthTexture交換鏈中。在圖層的ProjectionDesc數(shù)據(jù)member中提供投影矩陣參數(shù)。在提交圖層時(shí),使用ovrViewScaleDesc struct提供HmdSpaceToWorldScaleInMeters參數(shù)。
值得一提的是,如果你選擇的是Unreal 4或Unity,最新的Oculus引擎集成已經(jīng)提供了將深度緩沖區(qū)提交到Oculus Rift PC運(yùn)行時(shí)系統(tǒng)的必要工具。
你同時(shí)可以查看已更新的OculusRoomTiny和OculusWorldDemo樣本,并了解提交深度緩沖區(qū)所需的步驟。OculusWorldDemo同時(shí)在菜單中提供了其他工具(可通過(guò)“Tab”鍵進(jìn)行切換),其可以幫助了解PTW是如何提供幫助。你只需導(dǎo)航到Timewarp菜單,增加幀時(shí)間以降低幀速率,然后在Layers→Main Layer選項(xiàng)下打開/關(guān)閉深度提交即可。返回搜狐,查看更多
責(zé)任編輯: