天天看點

VR開發基礎(一)一文理清unity xr plugin架構與openxr标準一,VR開發中的幾個概念:從openVR到openXR二,unity XR 插件架構三,Unity 将 OpenXR添加到新的XR架構中 四,openxr角度的XR開發架構五,openXR API overview核心接口和流程了解

一,VR開發中的幾個概念:從openVR到openXR

1. OpenVR

OpenVR是Valve公司開發的一套包含一系列SDK和API的工具集,旨在從驅動層級為硬體廠商提供軟硬體開發支援。硬體裝置制造商可以為裝置開發OpenVR 驅動程式,以使裝置能夠運作在SteamVR平台上。

雖然OpenVR是HTC Vive預設使用的驅動程式,但它的開發目的是為了得到更多廠商的支援,例如,開發者也可以為Oculus Rift或Windows MR 裝置開發基于OpenVR的軟體應用。

需要注意的是,OpenVR雖然也提供了一套開發标準,但是相較于OpenXR,其覆寫範圍相對較小,另外,Valve 從SteamVR用戶端1.16開始,已經對OpenXR标準進行了全面的支援。

作為Unity開發者來說,并不需要太多關心OpenVR及其SDK,因為這更多的是面向VR硬體平台和遊戲引擎開發商來進行使用的。

2. OpenVR Desktop

Unity需要各VR硬體平台提供與對應底層驅動程式通信的工具包來完成VR應用程式的渲染等工作,OpenVR Desktop則是OpenVR提供給Unity使用的一系列元件,用于通路OpenVR的SDK。該工具包可以通過Package Mananger進行安裝,但僅存在于Unity2019.4 LTS 及其以前版本,在Unity 2020中被廢棄,轉而使用 OpenVR XR Plugin 代替,如下圖所示:

VR開發基礎(一)一文理清unity xr plugin架構與openxr标準一,VR開發中的幾個概念:從openVR到openXR二,unity XR 插件架構三,Unity 将 OpenXR添加到新的XR架構中 四,openxr角度的XR開發架構五,openXR API overview核心接口和流程了解

要使用OpenVR Desktop,在将工具包安裝完畢以後,需要在Build Settings中開啟VR支援并選擇OpenVR SDK。在Build Settings中開啟VR支援的方式,僅适用于Unity 2019及其以前的版本,而在Unity 2020及其以後的版本中,此方法也将被廢棄,轉而使用XR Plug-in Management進行管理。

3. OpenVR XR Plugin

OpenVR XR Plugin 與 OpenVR Desktop 的作用和地位相同,推出的目的是為了配合Unity 2020在XR Plug-in Management中管理VR平台提供的工具包。

VR開發基礎(一)一文理清unity xr plugin架構與openxr标準一,VR開發中的幾個概念:從openVR到openXR二,unity XR 插件架構三,Unity 将 OpenXR添加到新的XR架構中 四,openxr角度的XR開發架構五,openXR API overview核心接口和流程了解

OpenVR XR Plugin 目前需要手動從本地磁盤進行安裝,開發者可通路網址:https://github.com/ValveSoftware/unity-xr-plugin/releases,下載下傳該工具包的.tgz格式檔案,然後在Package Manager中選擇"Add package from tarball..."指令進行安裝。

VR開發基礎(一)一文理清unity xr plugin架構與openxr标準一,VR開發中的幾個概念:從openVR到openXR二,unity XR 插件架構三,Unity 将 OpenXR添加到新的XR架構中 四,openxr角度的XR開發架構五,openXR API overview核心接口和流程了解

另外,如果開發者使用SteamVR Plugin 2.7.x 進行VR應用程式開發,則在插件中已經包含了OpenVR XR Plugin工具包,可使用以上方式進行安裝而不用從網絡重複下載下傳,如下圖所示:

VR開發基礎(一)一文理清unity xr plugin架構與openxr标準一,VR開發中的幾個概念:從openVR到openXR二,unity XR 插件架構三,Unity 将 OpenXR添加到新的XR架構中 四,openxr角度的XR開發架構五,openXR API overview核心接口和流程了解

安裝完畢後,可以在XR Plug-in Manager中啟用并進行相關設定,如下圖所示:

VR開發基礎(一)一文理清unity xr plugin架構與openxr标準一,VR開發中的幾個概念:從openVR到openXR二,unity XR 插件架構三,Unity 将 OpenXR添加到新的XR架構中 四,openxr角度的XR開發架構五,openXR API overview核心接口和流程了解

4. SteamVR

SteamVR是Valve基于OpenVR推出的一套VR體驗解決方案,以軟體用戶端形式存在,面向終端使用者,故也常被稱為SteamVR用戶端。

VR開發基礎(一)一文理清unity xr plugin架構與openxr标準一,VR開發中的幾個概念:從openVR到openXR二,unity XR 插件架構三,Unity 将 OpenXR添加到新的XR架構中 四,openxr角度的XR開發架構五,openXR API overview核心接口和流程了解

當運作或測試SteamVR平台支援的應用程式時,SteamVR用戶端會自動開啟,為應用程式提供運作時環境。

除此之外,SteamVR用戶端還提供VR控制器的配對、驅動更新、性能分析等功能。初次連接配接VR裝置以後,需要通過SteamVR用戶端進行裝置校準,即所謂的房型設定。在用戶端界面底部,列出了目前已經連接配接到系統中的裝置,包括頭顯、搖桿控制器、基站、其它可跟蹤裝置如Vive Trakcer等。

SteamVR可以通過Steam用戶端進行安裝,還可通過裝置供應商提供的安裝程式進行安裝。以HTC VIVE為例,購買後可通路網址:https://www.vive.com/cn/setup/,選擇下載下傳VIVE安裝程式,該程式将引導使用者進行裝置連接配接,完成相應驅動程式和SteamVR的安裝,對于初學者來說相對友好。兩種管道安裝的SteamVR用戶端均能保證VR應用程式的運作,選擇其中一種即可,兩者亦可同時存在。

對于終端使用者,目前支援SteamVR的硬體包括但不僅限于以下裝置:

  • Valve Index
  • HTC VIVE/Cosmos
  • Windows Mixed Reality
  • HP Reverb G2

SteamVR用戶端作為橋梁,介于OpenVR底層驅動與使用者之間工作——SteamVR擷取到使用者的輸入,如控制器按鍵的按下、頭顯在空間中移動等,将這些資料資訊傳遞給OpenVR進行處理,OpenVR将處理後的資料通過SteamVR呈現給使用者。

5. SteamVR Plugin

SteamVR Plugin 是Valve公司提供給Unity開發者的開發工具,以.unitypackage檔案的形式存在,在使用方面符合一般的Unity插件導入流程,開發者可使用該插件開發面向SteamVR平台的VR應用程式。SteamVR Plugin可由Unity Asset Store和Github下載下傳安裝,所不同的是,Asset Store中總是提供最新且穩定的SteamVR插件版本,而在Github中,可以下載下傳該插件的所有過往版本及預覽版。

VR開發基礎(一)一文理清unity xr plugin架構與openxr标準一,VR開發中的幾個概念:從openVR到openXR二,unity XR 插件架構三,Unity 将 OpenXR添加到新的XR架構中 四,openxr角度的XR開發架構五,openXR API overview核心接口和流程了解

SteamVR Plugin 能夠與SteamVR用戶端進行互動,主要幫助開發者實作三項主要功能:為VR控制器加載呈現相對應的3D模型、處理控制器的輸入、根據使用者實際手部動作估算骨骼資料并通過這些資料在虛拟世界中呈現相對應的手部姿态。除此之外,SteamVR Plugin還提供了一套便捷的互動系統(Interaction System),幫助開發者快速開發出常見的VR互動功能,該互動系統脫胎于Valve開發的《The Lab》VR體驗應用。

6. OpenXR

随着行業的發展,越來越多的VR/AR裝置被推向市場。這對于開發者來說,面臨的重要議題之一便是針對不同的VR/AR硬體平台進行應用程式的适配,這将帶來一部分額外且不必要的工作量;對于硬體平台廠商來說,新上市的産品面臨着内容嚴重不足、生态急需健全的問題。

OpenXR是一套由Khronos Group發起,聯合多家行業頭部公司一起制定的開放标準,旨在解決XR平台碎片化的問題,同時簡化AR/VR軟體的開發。對于開發者來說,基于此标準進行XR應用程式的開發,能夠使應用程式覆寫更廣泛的硬體平台,同時無需移植或重新編寫代碼;而對于支援OpenXR的硬體平台廠商來說,能夠在産品釋出時即可擁有可運作在其上的大量内容。

下圖左側為引入OpenXR标準之前的行業現狀——VR/AR應用程式和引擎必須使用每個平台獨有的SDK和API,新的裝置同樣需要特定的驅動程式。而在引入OpenXR标準以後,将統一由OpenXR提供的跨平台高性能的應用程式接口與衆多XR硬體平台進行互動,如下圖右側所示。

VR開發基礎(一)一文理清unity xr plugin架構與openxr标準一,VR開發中的幾個概念:從openVR到openXR二,unity XR 插件架構三,Unity 将 OpenXR添加到新的XR架構中 四,openxr角度的XR開發架構五,openXR API overview核心接口和流程了解

OpenXR 1.0 标準于2019年公布,各大XR平台開始逐漸加入到支援OpenXR标準的行列,包括Oculus Quest/Rift、Windows Mixed Reality、Unity、Unreal Engine、SteamVR等目前主流的VR平台和遊戲引擎。這就意味着,開發者将專注于應用程式的開發而不是各平台的互動适配問題。

7. OpenXR Plugin

OpenXR Plugin是Unity開發的符合OpenXR标準的工具包,旨在讓Unity開發者盡可能高效地将内容部署到更加廣泛的XR目标平台上。開發者在Unity 2020中通過Package Manager搜尋"openxr"即可找到該工具包并進行安裝。

VR開發基礎(一)一文理清unity xr plugin架構與openxr标準一,VR開發中的幾個概念:從openVR到openXR二,unity XR 插件架構三,Unity 将 OpenXR添加到新的XR架構中 四,openxr角度的XR開發架構五,openXR API overview核心接口和流程了解

由于處于版本釋出的早期,是以目前通過廣泛測試的硬體平台有限,Unity聲稱目前無法測試或保證所有支援OpenXR的配置都能以最佳狀态運作,該工具包也在不斷完善中,後續會逐漸增加支援的平台。以下是截至目前經過全方位測試并被官方支援的平台。

硬體平台 建構目标 圖形接口 渲染模式
Windows Mixed Reality Windows DX11 Single Pass Instanced
HoloLens 2 UWP DX11 Single Pass Instanced

由于OpenXR 隻支援基于動作的輸入(action-based input),是以OpenXR Plugin可以直接使用Unity的Input System處理輸入和互動。如果開發者的項目正在使用特定平台的工具包(如MRTK等),Unity不建議啟用OpenXR,因為許多廠商仍在為OpenXR添加支援;其中Oculus已宣稱全面轉向支援openXR,提供了基于openXR的開發SDK;

8. 最後

本文介紹了在VR開發中常見的幾個容易混淆的概念,為了便于差別比較,我們将這些概念從維護方、面向對象、存在形式這三個次元對比彙總如下:

VR開發基礎(一)一文理清unity xr plugin架構與openxr标準一,VR開發中的幾個概念:從openVR到openXR二,unity XR 插件架構三,Unity 将 OpenXR添加到新的XR架構中 四,openxr角度的XR開發架構五,openXR API overview核心接口和流程了解

二,unity XR 插件架構

首先回到unity本身的開發,unity是一個3D引擎(平台),為了對XR的支援并保持擴充,增加了XR插件架構;

Unity 2019.3 和更高版本使用新的統一插件架構,該架構支援多個平台的直接內建。該技術堆棧中的一個 API 可以公開 Unity 支援的所有平台的通用功能,并使 XR 硬體和軟體提供商能夠開發自己的 Unity 插件。

該架構可以了解為:從unity開發的角度定義了XR的基本子產品和向下接口及擴充,各家實作可以基于架構給定的plugin規範制作具體plugin的方式,進行子產品實作,比如Oculus XR plugin。

VR開發基礎(一)一文理清unity xr plugin架構與openxr标準一,VR開發中的幾個概念:從openVR到openXR二,unity XR 插件架構三,Unity 将 OpenXR添加到新的XR架構中 四,openxr角度的XR開發架構五,openXR API overview核心接口和流程了解

三,Unity 将 OpenXR添加到新的XR架構中

如上所述,unity的XR架構通過接入各家plugin實作XR具體子產品和特性,特别的包括openxr plugin,openxr的特别之處在于:标準由khronos維護但自身并非直接的實作廠商,并且自身也是一個抽象架構,在标準接口之下又需要具體廠商的實作。

unity為支援openxr開發了openxr plugin,作為XR架構的一個插件,可以了解為unity為khronos家實作的,隻不過openxr本身又需要更下一層的裝置運作時實作。

VR開發基礎(一)一文理清unity xr plugin架構與openxr标準一,VR開發中的幾個概念:從openVR到openXR二,unity XR 插件架構三,Unity 将 OpenXR添加到新的XR架構中 四,openxr角度的XR開發架構五,openXR API overview核心接口和流程了解

 四,openxr角度的XR開發架構

再從openxr的角度了解一下開發整體圖景。

從下圖可以看出,可以自上而下抽象出 開發者環境、XR插件、openxr接口、openxr運作時實作、裝置 五個層面的調用遞進關系;

如果開發者使用的是U3D等環境,則不需要直接與openxr直接互動,隻需了解XR plugin及其inputsystem等XR子產品的緣由,即openxr的plugin實作;

VR開發基礎(一)一文理清unity xr plugin架構與openxr标準一,VR開發中的幾個概念:從openVR到openXR二,unity XR 插件架構三,Unity 将 OpenXR添加到新的XR架構中 四,openxr角度的XR開發架構五,openXR API overview核心接口和流程了解

事實上在裝置層面上,openxr也做好了定義,需要硬體的具體實作,一般不需要軟體開發關注。

VR開發基礎(一)一文理清unity xr plugin架構與openxr标準一,VR開發中的幾個概念:從openVR到openXR二,unity XR 插件架構三,Unity 将 OpenXR添加到新的XR架構中 四,openxr角度的XR開發架構五,openXR API overview核心接口和流程了解

五,openXR API overview核心接口和流程了解

如果開發者使用的是native開發環境,或者想要深入了解openxr的機制,則需要熟悉openxr的本身接口及其狀态、流程機制,openxr标準目前在1.0的基礎上持續更新,具體查閱官網擷取最新資訊。

其基本的流程l類比OpenGL的基本流程,可以了解為:通過拉起XR的運作時環境,在XR環境會話loop中,進行graphic渲染和XR IO互動,如圖:

VR開發基礎(一)一文理清unity xr plugin架構與openxr标準一,VR開發中的幾個概念:從openVR到openXR二,unity XR 插件架構三,Unity 将 OpenXR添加到新的XR架構中 四,openxr角度的XR開發架構五,openXR API overview核心接口和流程了解

https://www.khronos.org/files/openxr-10-reference-guide.pdf