研發實戰:Oculus發布ASW 2.0開發者指南

原標題:研發實戰:Oculus發布ASW 2.0開發者指南

來源:映維網 作者 廣州客

Oculus喺2018年4月發布la涵蓋Asynchronous Spacewarp 1.0(異步空間扭曲;ASW)同Positional Timewarp(定位時間扭曲;PTW)嘅ASW 2.0,並旨喺實現更高質量同更低延遲嘅VR體驗。

最近Oculus再次介紹la有關ASW 2.0嘅更多技術細節,以及點樣樣確保你嘅VR應用可以兼容ASW 2.0嘅技巧。下麵係映維網嘅具體整理:

1. 從ASW到PTW

當Oculus喺2016年帶來laATW(Asynchronous Timewarp;異步時間扭曲)之後,發布PTW係合乎邏輯嘅下一步,隻係當時Oculus發現la一個充滿前景嘅解決方案。這顯然係ASW。ASW可以喺時間方麵平滑各種運動線索(如動畫同頭顯追蹤),而PTW隻能喺時間方麵校正頭顯追蹤。從這個意義來說,ASW看起來像係一種升級版PTW,但Oculus好快意識到PTW存喺ASW尚未完全可以實現嘅優勢。

Oculus喺2017年推出laOculus Dash,以及允許VR應用程序提供深度緩衝嘅選項,從而支持其利用名為ovrLayerEyeFovDepth嘅新圖層類型來幫助深度合成。如下麵嘅截圖所示,深度緩衝區用於喺VR應用程序嘅內容穿插Oculus Dash內容時應用X射線效果。同時,Oculus嘅Engine-Integrations團隊開始喺Unreal 4同Unity中使用這種圖層類型。

好多VR應用程序都經過優化並可以以本機頭顯刷新率運行,但隻係喺單獨運行時係咁樣。當Oculus Dash出現並使得CPU或GPU超過其性能預算時,這可能導致應用程序出現丟幀。喺這種情況下,Oculus運行時係統將自動將ASW應用於VR應用程序。但由於ASW喺乜嘢給定時間內僅限於一個合成器層,如果Oculus Dash同VR應用程序無法同時以所述速率運行,將需要一種唔依賴ASW並能平滑Oculus Dash內容移動嘅方法。這正係PTW有發揮作用嘅時候。當Oculus為Oculus Dash打磨PTW時,Oculus繼續優化ASW,令其可以以同PTW配合使用,並且進一步提高時間穩定性。這就係ASW 2.0嘅誕生過程。

2. ASW 1.0 vs 2.0

展開全文

下麵這個視頻係ASW 1.0同ASW 2.0應用至《Robo Recall》時嘅效果對比。白色箭頭係調試指南,其說明la每個圖塊嘅計算運動矢量,並由ASW用於內容運動扭曲。

所述視頻幫助說明la兩者嘅主要差異。對於ASW 1.0,請注意布告板嘅視差(由於頭部運動)僅由ASW補償。由於ASW 2.0可以利用PTW,相同嘅視差將注冊最小嘅ASW校正,因為它主要由PTW處理。如預期一樣,旋轉風扇葉片依然由ASW校正,而椅子同幾何邊緣嘅微小校正則主要歸功於喺PTW之後由ASW運動矢量進行嘅去除遮擋同視圖相關著色。

3. 結合ASW同PTW

為la進一步理解ASW係點樣樣同PTW結合使用,我們首先需要明白ASW嘅流程。以下係Oculus運行時使用ASW所需步驟嘅細分:

ASW捕獲由合焦VR應用程序提交嘅先前同當前ovrLayerEyeFov幀嘅紋理。通過時間扭曲前一幀,ASW生成“pre-warp frame”並使用當前幀嘅姿態。ASW將當前幀同pre-warp frame紋理轉換為GPU視頻編碼器友好型資源。ASW將兩個幀紋理發送到GPU視頻編碼器以進行對應分析。ASW從GPU視頻編碼器輸出采集“運動矢量”。ASW後處理並轉換運動矢量以進行幀外推。ASW將內容打包並注入至合成器層,仿佛它係來自於VR應用程序。Compositor像以往一樣利用ASW注入嘅ovrLayerEyeFov圖層內容進行時間扭曲同變形。

如步驟#2同#8所示,我們依賴於時間扭曲(Timewarp;TW)。喺最初嘅ASW實現中,由於缺乏用於PTW嘅深度緩衝區,所以當時使用嘅TW重投影技術係Orientation Timewarp(方向時間扭曲;OTW)。但隨著越來越多嘅VR應用程序開始提供深度緩衝區,可以應用PTW。訣竅係確保喺上述兩個步驟中嘅TW-重投影技術(唔理係OTW還係PTW)係同一類型。這確保la喺ASW或TW中可以校正頭顯移動重投影,但唔係同時喺兩個地方校正,因為這會導致視覺偽影。當深度唔可用時(即VR應用程序提交ovrLayerEyeFov而非ovrLayerEyeFovDepth),Oculus運行時會自動回到ASW 1.0。

4. PTW風格

PTW可以以多種唔同嘅方式實現。Oculus嘅要求中有幾個十分重要嘅點:

為PTW使用盡可能少嘅GPU周期,從而允許VR應用程序最大化其GPU使用率。無需處理同上一視圖位置嘅顯著重投影偏差,因為每個新嘅VR-app渲染將使用十分接近前一個嘅新頭顯目標姿態。PTW嘅每次重投影結果僅喺瞬間可見(通常小於20毫秒),因為VR應用程序以十分高嘅速率提供新圖像。

熟悉實時圖形知識嘅人士應該明白類似嘅技術,例如視差映射、視差遮擋映射、高度圖光柵化等等。喺好多技術中,著色器將對高度圖紋理進行采樣,從而確定紋理樣本查找嘅補償量。PTW所使用嘅深度緩衝區同時可以認為係旋轉到麵向camera嘅高度圖。

為la評估各種權衡,Oculus多年來嚐試la眾多唔同嘅PTW技術。諸如視差-遮擋映射之類嘅技術更精確,但需要花費更多嘅GPU周期。我們選擇嘅技術類似於稀疏-視差-映射技術,因為它有助於我們實現上述所有要點。同OTW相比,我們嘅PTW開銷十分低,同時足以幫助解決由於頭顯轉換而喺OTW中看到嘅抖動偽影。喺好多情況下,PTW同OTW嘅GPU性能損失將喺幀定時噪點中丟失。

5. 深度緩衝區

PTW主要依賴於深度緩衝區,盡管網絡存喺大量關於深度緩衝區嘅信息,但下麵唔妨再深入挖掘一下。深度緩衝區喺實時渲染中發揮著重要作用,隨著時間嘅推移同GPU性能優化嘅結合,它們嘅內部表示變得更加複雜。但喺其核心,深度緩衝區係由GPU喺光柵化3D場景時所生成嘅值嘅2D陣列,其中緩衝區中嘅每個元素存儲對應顏色緩衝元素嘅深度值。由於深度緩衝區通常作為光柵化嘅副產品生成並供GPU用於遮擋剔除,所以生成深度緩衝區嘅成本係主要考量因素。對於PTW,喺渲染VR應用程序時並生成深度緩衝區後,可以預期VR應用程序會將內容作為ovrLayerEyeFovDepth圖層嘅一部分提交。從嗰時起,Oculus運行時合成器喺Timewarp&Distortion階段處理剩餘嘅PTW重投影。

深度緩衝區可以以浮點或標準化整數格式保持值,但這種原始值唔直接表示給定像素嘅距離。相反,深度值係喺光柵化期間利用投影矩陣進行計算。投影矩陣會將每個頂點同像素轉換成最終嘅深度值並存儲喺存儲器中。對於投影矩陣可以將線性距離變換為可以存儲喺深度緩衝器中嘅值,這可以視為有效映射線性距離值,並為更接近於用戶嘅元素帶來更高精度嘅方式。

唔同嘅內容可以調用唔同嘅映射方案同剪切邊界。例如,早期係采用基於整數嘅低精度深度格式,camera平截頭體嘅近剪切平麵同遠剪切平麵嘅距離係令人感到沮喪嘅重要原因。喺最近幾年裏出現la浮點值,投影矩陣可以將遠剪切平麵映射到無限遠。線性距離到最終深度值嘅映射使得高精度浮點可以派上用場。請記住,一旦給定頂點進行la變換並柵格化為三角形,GPU將自動剪切投影範圍同平截頭體之外嘅元素。

由於這一切嘅考慮,Oculus喺Oculus Rift PC SDK中創建la輔助函數,而應用開發者可以喺創建投影矩陣時予以使用。Oculus同時提供la允許通過常用方法來創建投影矩陣嘅枚舉。以下係SDK中OVR_CAPI_Util.h文件嘅摘錄,其說明la用於指定投影矩陣嘅修飾符。有關每個枚舉嘅說明,請參閱PC SDK文檔。

enum ovrProjectionModifier {

ovrProjection_LeftHanded,

ovrProjection_FarLessThanNear,

ovrProjection_FarClipAtInfinity,

ovrProjection_ClipRangeOpenGL

};

對於PTW,Oculus感興趣嘅係追蹤空間units中每個像素到渲染camera嘅距離。如果VR應用程序僅提交深度緩衝區而唔包括其他元數據,Oculus運行時係統將冇足夠嘅信息來重新計算像素嘅原始線性距離。到目前為止,我們唔難看出VR-app使用嘅投影矩陣係PTW算法所需嘅信息之一。但PTW唔需要整個矩陣,隻需要同渲染元素嘅Z同W坐標有關嘅部分。為la從投影矩陣中提取必要嘅組件,SDK同時提供la一個可以整齊地打包稱為ovrTimewarpProjectionDesc,以及一個名為ovrTimewarpProjectionDesc_FromProjection嘅輔助函數嘅最小信息量嘅結構。如果開發者唔希望將自己嘅矩陣格式轉換為SDK格式,你可以查看函數嘅實現,並簡單地提取必要嘅組件。

另一個需要嘅數據係,VR應用程序用於渲染units嘅世界同視圖比例。喺某些渲染引擎中,world-unit轉換比例唔係作為投影矩陣嘅一部分進行處理。這需要特別注意,因為遊戲引擎嘅1 unit係1厘米,而Oculus Rift PC SDK總係以米為單位處理unit,即1 unit係1米。當所述引擎渲染距離為4米嘅平麵時,應用於深度緩衝區嘅投影矩陣倒數將產生400個unit嘅距離。但喺PTW算法中,我們隻希望計算4個unit。所以喺這個示例中,除非投影矩陣中已經獲得la這個比例係數,否則將向Oculus運行時提供0.01嘅渲染比例係數。VR應用程序可以使用ovrViewScaleDesc struct單獨將這個值提交給SDK。

6. API局限性

當前嘅深度提交API存喺一定嘅限製,比如說:

FovDepth層中提交嘅深度同顏色緩衝區需要使用匹配嘅分辨率。唔支持深度緩衝區嘅“color”格式,例如OVR_FORMAT_R32_FLOAT。唔包含多重采樣(MSAA)嘅OVR_FORMAT_D32_FLOAT(即MSAA)係目前最佳嘅方式。其他格式可能會導致Oculus運行時係統出現資源複製或解析。

7. 總結同最後嘅諗法

為la將PTW用於一個給定嘅VR應用程序,Oculus Rift PC運行時需要開發者采取下麵嘅步驟:

將深度緩衝區柵格化或複製到ovrLayerEyeFovDepth圖層嘅DepthTexture交換鏈中。喺圖層嘅ProjectionDesc數據member中提供投影矩陣參數。喺提交圖層時,使用ovrViewScaleDesc struct提供HmdSpaceToWorldScaleInMeters參數。

值得一提嘅係,如果你選擇嘅係Unreal 4或Unity,最新嘅Oculus引擎集成已經提供la將深度緩衝區提交到Oculus Rift PC運行時係統嘅必要工具。

你同時可以查看已更新嘅OculusRoomTiny同OculusWorldDemo樣本,並la解提交深度緩衝區所需嘅步驟。OculusWorldDemo同時喺菜單中提供la其他工具(可通過“Tab”鍵進行切換),其可以幫助la解PTW係點樣樣提供幫助。你隻需導航到Timewarp菜單,增加幀時間以降低幀速率,然後喺Layers→Main Layer選項下打開/關閉深度提交即可。

search更多:手機數碼電腦
at手機數碼電腦相關網站