當前位置:
首頁 > 科技 > 研發實戰:如何在Oculus Mobile VR平台進行Vulkan開發

研發實戰:如何在Oculus Mobile VR平台進行Vulkan開發

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

Oculus正在大力推廣Vulkan的採用

映維網 2019年08月09日)移動VR從一開始就將OpenGL ES作為圖形API,但現在大多數引擎都開始轉向Vulkan和DX12等API,因為它們為開發者提供了更大的靈活性和更低的渲染負載。Oculus日前介紹了GL和Vulkan在開發VR遊戲功能方面的差異。需要注意的是,本文深入介紹了與圖形相關的細節,讀者需要掌握GL和Vulkan的基本知識。下面是映維網的具體整理:

由於Adreno圖形驅動和Oculus運行時方面的改動,下面介紹的大多數功能都需要新發布的Build 7.0版本。

1. 多重採樣抗鋸齒(Multi-sampling Anti-aliasing;MSAA)

與PC顯卡不同,移動晶元集的MSAA是由Tiler執行MASS操作,然後當Tile完成時進行解析(將所有子樣本平均到最終像素),再將其結果存儲到主存儲器。由於從Tile內存到一般內存的帶寬是非MSAA,這允許我們以接近與非MSAA相同的速度運行MSAA幀緩衝器。這對VR非常重要,因為每個眼睛的像素非常低,會產生明顯的邊緣鋸齒。

對於GLES,這是通過使用MSAA幀緩衝區將其渲染到非MSAA紋理來完成。MSAA幀緩衝區使用以下函數進行初始化:glFramebufferTextureMultisampleMultiviewOVR

儘管有效,但由於其隱式性質,這引起了一系列的問題,例如「我不認為我的系統支持MSAA,我的紋理只是RGBA8888,我如何啟用MSAA」。

在Vulkan中,由於一切都為顯式。每個子通道由包含pColorAttachments,pDepthStencilAttachment和pResolveAttachments的vkSubpassDescription結構定義。一個優秀的Vulkan應用程序應該通過附著4x MSAA緩衝區來設置MSAA,並將其用於顏色/深度附件中的顏色和深度,以及pResolveAttachment中的非MSAA顏色緩衝區。應用程序同時應該將pColorAttachments和pDepthStencilAttachments storeOperations設置為VK_ATTACHMENT_STORE_OP_DONT_CARE。這將告訴驅動:「我以後不會要求這種顏色或深度,請不要將它們存儲在Tile內存中並丟棄它們」。

加分項是,MSAA顏色和深度緩衝區應該設置為瞬態,並且系統會慢吞吞地分配它們的內存,因為所述緩衝區甚至沒有內存(唯一的是pResolveAttachment中的顏色解析附件)。下面是一個優秀的管道狀態示例:

使用這一路徑(通過renderpass/subpass系統進行MSAA處理)而非vkCmdResolveImage路徑非常重要。vkCmdResolveImage路徑是一個以PC為中心的API,它不會利用Tiler在存儲期間解析的能力,所以通過vkCmdResolveImage命令執行MSAA的引擎會將4x MSAA數據存儲在內存中,再次從內存載入到Tiler ,然後將非MSAA解析回內存。這很容易就會給GPU添加3ms。

2. 多視圖(Multiviw)

每次提交時,Multiview這個擴展允許GPU驅動程序在紋理數組的N個不同的切片(slice)執行N次繪製調用。它在VR中通過單次繪製調用來在2-deep紋理陣列繪製左眼和右眼。Vulkan通過VK_KHR_Multiview擴展提供支持。它需要顏色,深度和解析圖像為2D Array而非2D,並且需要將VkRenderPassMultiviewCreateInfo結構添加到要通過Multiview執行的渲染通道。它(在UE4.23進行了測試)支持多個子通道。renderdoc管道狀態圖片(與上面相同)展示了具有2個視圖的多視圖捕獲(一個用於左眼,一個用於右眼)。

VkRenderPassMultiviewCreateInfo有一個pViewMasks參數,其要求對多視圖的視圖數進行按位掩碼。對於viewMask[0]值為0b11,雙視圖系統要求bit0和bit1為真。

我們的運行時本身支持紋理數組作為時間扭曲合成的輸入紋理。開發者應該使用VRAPI_TEXTURE_TYPE_2D_ARRAY枚舉創建紋理,而非渲染到多視圖緩衝區,然後再手動將它們複製到非多視圖圖像並發送到VRAPI(計算要求非常高)。

3. 固定注視點渲染(Fixed Foveated Rendering;FFR)

從開發者的角度來看,由於兩個FFR API之間存在較大的架構差異,所以GL和Vulkan之間的FFR非常不同。從概念上講,FFR是一種應用於幀緩衝區的渲染設置,因為它會修改GPU計算幀的方式,同時不會以任何方式影響紋理(無論發生什麼,顏色和深度紋理中的所有紋素都會被填充)。

實際上,來自QCOM的原始FFR擴展應該通過glFramebufferFoveationConfigQCOM函數應用於幀緩衝區,而老實說它應該存在於API中。但對於Oculus Go,我們希望在無需深入的引擎/應用改動的情形下引入這項功能。更重要的是,我們希望運行時控制應用的注視點設置,這樣我們就不需要每位開發者和引擎來控制FFR設置,並且整個平台上都會具有同類設置。所以,我們要求QCOM在顏色紋理中存儲FFR元數據(由我們控制,因為運行時分配紋理而非幀緩衝區),因此誕生了glTextureFoveationParametersQCOM。從開發者的角度來看,這個實現在很大程度上是隱藏在運行時中。開發者請求FFR級別(關閉/低/中/高),而我們自動為他們配置更低的級別。

儘管這個解決方案為Go和Quest帶來了相當大的幫助,但它卻面臨著多重挑戰。首先,因為它是基於VRAPI修改顏色紋理元數據,所以每個預通道(不會渲染到顏色紋理中)都不是根據注視點進行。現在沒有太大問題,因為我們的大多數應用程序都是單通道,但情況總是會發生改變,因為開發者希望啟用(例如)HDR管道。其次,QCOM有一個硬編碼的注視點功能模型,它不允許我們根據視場和透鏡來選擇我們真正想要的解析度曲線。

通過引入VK_EXT_fragment_density_map擴展,Vulkan完全修復了這個問題。需要注視點渲染的應用程序渲染通道不是採用硬編碼方程式,而是添加另一個圖像附件。它不是寫入附件,而是讀取附件。這個附件是一個R8G8像素密度圖像,與普通附件相比(1216×1344渲染通道將具有38×42片段密度附件),其解析度為/32並驅動應該渲染的幀緩衝區域的解析度。

下面是一個片段密度圖像示例。黃色區域是我們1:1的高解析度區域,離屏幕中心越來越遠,像素密度將越來越小。

儘管上圖紋理有一種注視點的形狀,但這種紋理可以是你想要的形狀。例如,如果開放世界遊戲的開發者不太願意花費太多時間,他們完全可以減少天空的有效解析度。對於以方程式為中心的GL擴展,這是完全不可能的事情。紋理同時可以綁定到任何渲染通道,所以雙通道HDR-LDR渲染器的開發者可以簡單地綁定兩個渲染通道中的紋理,並將FFR應用於兩者。

考慮到我們還是希望維持VrDriver對注視點曲線的控制,但rendepass是完全由應用程序控制,所以我們最終採用了混合方法。當開發者創建交換鏈來從Vulkan中的Oculus運行時獲取顏色紋理時,它會創建另一個交換鏈:注視點交換鏈,其中顏色交換鏈的索引0與注視點交換鏈的索引0匹配,依此類推。開發者可以通過新的vrapi_GetTextureSwapChainBufferFoveationVulkan函數請求注視點交換鏈圖像,並且無需對其進行任何修改,只需將它們綁定到自己想要啟用FFR的渲染通道即可。

當使用普通的FFR控制API時,我們的運行時將修改注視點交換鏈圖像並生成一個注視點圖像,其強度與開發者請求的設置相對應。上圖示例是運行時為High注視點設置生成的注視點圖像。如果引擎沒有任何進一步的變化,圖像將自動切換注視點曲線,下一個renderpass的執行將使用新的FFR設置,就像開發者使用OpenGLES的FFR擴展一樣。

4. 工具

Vulkan的一大優勢是它是PC和Mobile共享的圖形API。最重要的是,它是一個無狀態API,這意味著驅動程序不需要在命令之間存儲基礎狀態。這極大地幫助了像RenderDoc這樣的工具。它支持MSAA,Multiview,VK_EXT_fragment_density_map,並且自RenderDoc 1.4起就可以配合Oculus Quest一起使用。片段密度貼圖紋理可以在RenderDoc中可視化,從而確保你獲得自己想要的注視點圖像,並且幀將包含注視點圖像,所以你可以看到頭顯中的真實紋理輸出。

5. 引擎

Oculus 4.22.2 release 1.39.0是我們建議用於Vulkan開發的首個UE4版本。它實現了MSAA,Multiviw,FFR,sRGB原生渲染和多個UE4-Vulkan漏洞修復。注意,要在GitHub中訪問所述文件,你需要登錄訂閱賬號,否則你將會看到404錯誤頁面。

我們看到了相當不錯的性能增益,一個SunTemple的開發版本在渲染線程上從16ms變成了13sm。另外,由於著色器是SPIRV預編譯而非GLSL,載入速度有了顯著的提升。

不僅只是速度,Vulkan優化的設計和固有的多線程處理允許我們實現GLES所無法支持的功能,如引擎內每幀定時器查詢。stat unit中的GPU定時器數據現在已經可用,並由引擎生成的計時器查詢驅動,不再是從運行時傳回的平均數據,而且stat gpu為你提供逐渲染通道信息。Vulkan同時允許我們能夠開始考慮未來的理論功能,如基於子通道的HDR,多線程著色器載入,簡單的色調映射等等。

儘管我們發現這一版本和最新的Quest操作系統就Vulkan而言相當穩定,但對UE4-Vulkan-VR來說仍然是早期階段,所以如果你遇到任何問題,請向我們報告反饋。

6. 示例

Oculus Mobile樣本目錄中的VrCubeWorld_Vulkan樣本現在已經實現了所有這些功能,你可以進行參閱並從中獲取靈感。

7. 總結

希望這篇文章能夠為你當前的Vulkan圖形開發工作帶來幫助,或者如果你是原生開發者或UE4開發者,希望這篇文章可以鼓勵你嘗試使用Vulkan。除了允許你在PC和移動平台之間輕鬆共享代碼之外,它同時可以令你的圖形代碼工作更清晰,更快速。

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

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


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

Unity:60% AR/VR內容是通過Unity開發
傳第三代谷歌眼鏡2020年推出,和碩或是新代工廠

TAG:映維VR |