當前位置:
首頁 > 科技 > 研發實戰:Oculus發布ASW 2.0開發者指南

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

查看引用/信息源請點擊:映維網

有關ASW 2.0的更多技術細節

映維網 2019年08月13日)Oculus在2018年4月發布了涵蓋Asynchronous Spacewarp 1.0(非同步空間扭曲;ASW)和Positional Timewarp(位置時間扭曲;PTW)的ASW 2.0,並旨在實現更高質量和更低延遲的VR體驗。

最近Oculus再次介紹了有關ASW 2.0的更多技術細節,以及如何確保你的VR應用能夠兼容ASW 2.0的技巧。下面是映維網的具體整理:

1. 從ASW到PTW

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

Oculus在2017年推出了Oculus 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》時的效果對比。白色箭頭是調試指南,其說明了每個圖塊的計算運動矢量,並由ASW用於內容運動扭曲。

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

3. 結合ASW和PTW

為了進一步理解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)是同一類型。這確保了在ASW或TW中能夠校正頭顯移動重投影,但不是同時在兩個地方校正,因為這會導致視覺偽影。當深度不可用時(即VR應用程序提交ovrLayerEyeFov而非ovrLayerEyeFovDepth),Oculus運行時會自動回到ASW 1.0。

4. PTW風格

PTW能夠以多種不同的方式實現。Oculus的要求中有幾個非常重要的點:

為PTW使用儘可能少的GPU周期,從而允許VR應用程序最大化其GPU使用率。

無需處理與上一視圖位置的顯著重投影偏差,因為每個新的VR-app渲染將使用非常接近前一個的新頭顯目標姿態。

PTW的每次重投影結果僅在瞬間可見(通常小於20毫秒),因為VR應用程序以非常高的速率提供新圖像。

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

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

5. 深度緩衝區

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

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

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

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

enum ovrProjectionModifier {

ovrProjection_LeftHanded,

ovrProjection_FarLessThanNear,

ovrProjection_FarClipAtInfinity,

ovrProjection_ClipRangeOpenGL

};

對於PTW,Oculus感興趣的是追蹤空間units中每個像素到渲染camera的距離。如果VR應用程序僅提交深度緩衝區而不包括其他元數據,Oculus運行時系統將沒有足夠的信息來重新計算像素的原始線性距離。到目前為止,我們不難看出VR-app使用的投影矩陣是PTW演算法所需的信息之一。但PTW不需要整個矩陣,只需要與渲染元素的Z和W坐標有關的部分。為了從投影矩陣中提取必要的組件,SDK同時提供了一個可以整齊地打包稱為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。所以在這個示例中,除非投影矩陣中已經獲得了這個比例係數,否則將向Oculus運行時提供0.01的渲染比例係數。VR應用程序可以使用ovrViewScaleDesc struct單獨將這個值提交給SDK。

6. API局限性

當前的深度提交API存在一定的限制,比如說:

FovDepth層中提交的深度和顏色緩衝區需要使用匹配的解析度。

不支持深度緩衝區的「color」格式,例如OVR_FORMAT_R32_FLOAT。

不包含多重採樣(MSAA)的OVR_FORMAT_D32_FLOAT(即MSAA)是目前最佳的方式。其他格式可能會導致Oculus運行時系統出現資源複製或解析。

7. 總結和最後的想法

為了將PTW用於一個給定的VR應用程序,Oculus Rift PC運行時需要開發者採取下面的步驟:

將深度緩衝區柵格化或複製到ovrLayerEyeFovDepth圖層的DepthTexture交換鏈中。

在圖層的ProjectionDesc數據member中提供投影矩陣參數。

在提交圖層時,使用ovrViewScaleDesc struct提供HmdSpaceToWorldScaleInMeters參數。

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

你同時可以查看已更新的OculusRoomTiny和OculusWorldDemo樣本,並了解提交深度緩衝區所需的步驟。OculusWorldDemo同時在菜單中提供了其他工具(可通過「Tab」鍵進行切換),其可以幫助了解PTW是如何提供幫助。你只需導航到Timewarp菜單,增加幀時間以降低幀速率,然後在LayersMain Layer選項下打開/關閉深度提交即可。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 映維VR 的精彩文章:

Unity AR Foundation開始支持ARKit 3.0
《黑鏡》主創:或製作VR版《潘達斯奈基》

TAG:映維VR |