內容字號: 默認 大號 超大號

段落設置: 段首縮進 取消段首縮進

字體設置: 切換到微軟雅黑 切換到宋體

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

2019年08月20日 19:49 出處:未知 人氣: 評論()
{start}651722{end}

來源:映維網 作者 廣州客

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菜單,增加幀時間以降低幀速率,然后在Layers→Main Layer選項下打開/關閉深度提交即可。

責任編輯:

更多文章

相關文章

?

Copyright by 2002-2019 遼電情報網 版權所有

加拿大快乐8什么彩票