OpenXR 執行環境的安裝

| | 0 Comments| 15:24
Categories:

之前在寫《OpenXR 架構簡單介紹》的時候,基本上是覺得 OpenXR Runtime 應該是裝好 VR 裝置的軟體就可以用了,應該不用特別處理。

不過當 Heresy 在寫《OpenXR 程式開發:初始環境設定》、要進行測試的時候,這才發現,其實目前的 SteamVR(HTC Vive、Valve Index)、Windows Mixed Reality、Oculus Rift 三家的 VR 環境,都需要另外處理、才能執行 OpenXR 的程式。

所以這邊還是稍微紀錄一下吧~


Windows 的 OpenXR Runtime 設定

根據《OpenXR® Loader – Design and Operation》(GitHub)的資料,OpenXR 的 runtime 資料,在 Windows 環境是儲存於 Windows Registry 中,其路徑是:

HKEY_LOCAL_MACHINESOFTWAREKhronosOpenXR

在這個路徑下,還會再根據主版本做區分,以現在 OpenXR 都是 1.x 的情況下,實際上的路徑就會是 HKEY_LOCAL_MACHINESOFTWAREKhronosOpenXR1

裡面的內容也很簡單,就是一個「ActiveRuntime」的字串機碼、指定一個由廠商提供的 JSON 檔案。

所以如果要手動更換 OpenXR 的 Runtime 的話,只要自己去修改這個值就可以了。


Windows Mixed Reality

微軟自家的 Windows MR 系統,應該算是最簡單的了?

在已經可以使用 Windows MR 的「混合實境入口」的情況下,只需要另外安裝「OpenXR for Windows Mixed Reality」這個 Microsoft Store 上的 App,就可以完成 OpenXR Runtime 的安裝了。

而他的 OpenXR Runtime 描述檔是在「C:WINDOWSsystem32MixedRealityRuntime.json」這個位置,理論上不需要手動去處理。

不過,個人會建議也安裝一下「Windows Mixed Reality OpenXR Developer Tools」這個工具,可以提供一些額外的資訊。

而安裝好、執行前一篇basic_info 這個程式後(搭配 Acer AH101),會得到下面的結果:

Try to get API Layers:
> Found 0 API layers

Try to get supported entensions:
> Found 10 extensions
  - XR_KHR_win32_convert_performance_counter_time (ver 1)
  - XR_KHR_D3D11_enable (ver 4)
  - XR_KHR_composition_layer_depth (ver 5)
  - XR_MSFT_unbounded_reference_space (ver 1)
  - XR_MSFT_spatial_anchor (ver 1)
  - XR_EXT_win32_appcontainer_compatible (ver 1)
  - XR_EXT_conformance_automation (ver 1)
  - XR_KHR_D3D12_enable (ver 6)
  - XR_KHR_visibility_mask (ver 2)
  - XR_EXT_debug_utils (ver 3)

Create OpenXR instance
> prepare instance create information
> create instance
> get instance information
   - Windows Mixed Reality Runtime (100.2005.19005)

Get systems
> Try to get system 1
   > get system information
    - Windows Mixed Reality (1118)
     - Graphics: 16384 * 16384 with 16 layer
     - Tracking: position orientation
> Try to get system 2
   => Error: XR_ERROR_FORM_FACTOR_UNSUPPORTED

Enumerate View Configurations for system 1
  - XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO ( FoV mutable)
   > 2 views:
     - 2200 * 2200 (MAX: 2200 * 2200) [sample: 1(1)]
     - 2200 * 2200 (MAX: 2200 * 2200) [sample: 1(1)]
   > 1 blend modes:
     - XR_ENVIRONMENT_BLEND_MODE_OPAQUE

可以看到,在 extension 的部分、支援程度和 SteamVR 的差異還滿多的。

對 Heresy 來說,比較討厭的是看來 Windows MR 的 OpenXR runtime 目前還不支援 Vulkan 和 OpenGL…這也讓 Heresy 開始懷疑到底要不要弄下去了。


SteamVR

Heresy 之前都是使用 SteamVR 的 Beta 版,裝好就直接有 OpenXR 的支援了。

而前一陣子,Valve 也正式推出支援 OpenXR 的 SteamVR 1.13 給一般的使用者了(參考)~不過 Heresy 拿另一台電腦,卻發現正式版的 SteamVR 更新到 1.13 之後,實際下去跑 OpenXR,卻還是會出現沒有 OpenXR Runtime 的問題?

後來研究了一下,發現 SteamVR 1.13 雖然提供了 OpenXR 的支援,但是卻沒有把 OpenXR Runtime 的設定檔寫到 Windows Registry 裡面?所以如果要用就需要自己去修改 Windows Registry 才行。

他的設定檔位置是:C:Program Files (x86)SteamsteamappscommonSteamVRsteamxr_win64.json

如果有需要的話,可以透過有系統管理者權限的命令提示字元或 PowerShell,執行下面的指令:

REG ADD HKLMSOFTWAREKhronosOpenXR1 /v ActiveRuntime  /t reg_sz 
  /d "C:Program Files (x86)SteamsteamappscommonSteamVRsteamxr_win64.json"

這樣就可以把 SteamVR 的 OpenXR runtime 設定成 active runtime 了。


Oculus Rift S

Oculus Rift S 在這方面感覺更麻煩一點,雖然最新版的 Windows 軟體應該是已經以預覽的形式支援 OpenXR 了,但是不但沒有在 Windows Registry 裡面設定相關資料,連描述 OpenXR runtime 的 JSON 檔都沒有…

根據《Oculus Rift Has Hidden Preliminary Support For OpenXR》這篇文章的說法,Oculus 是透過 C:Program FilesOculusSupportoculus-runtimeLibOVRRT64_1.dll 這個檔案,來提供 OpenXR 的支援的。

不過,Oculus 官方並沒有提供必要的 runtime JSON 檔,所以必須要自己寫一個;它的內容如下:

{
  "file_format_version": "1.0.0",
  "runtime": {
    "api_version": "1.0",
    "name": "Oculus OpenXR",
    "library_path": "c:\Program Files\Oculus\Support\oculus-runtime\LibOVRRT64_1.dll"
  } }

這邊如果把它存成 c:oculus-openxr.json,那只要執行下面的指令:

REG ADD HKLMSOFTWAREKhronosOpenXR1 /v ActiveRuntime  /t reg_sz 
  /d "C:oculus-openxr.json"

這樣就可以了。

之後執行前一篇basic_info 這個程式後,會得到下面的結果:

Try to get API Layers:
> Found 0 API layers

Try to get supported entensions:
> Found 16 extensions
  - XR_KHR_D3D11_enable (ver 4)
  - XR_KHR_D3D12_enable (ver 6)
  - XR_KHR_opengl_enable (ver 8)
  - XR_KHR_vulkan_enable (ver 6)
  - XR_KHR_composition_layer_depth (ver 5)
  - XR_KHR_win32_convert_performance_counter_time (ver 1)
  - XR_KHR_convert_timespec_time (ver 1)
  - XR_KHR_composition_layer_cube (ver 8)
  - XR_KHR_composition_layer_cylinder (ver 4)
  - XR_KHR_composition_layer_equirect (ver 3)
  - XR_KHR_visibility_mask (ver 2)
  - XR_OCULUS_recenter_event (ver 1)
  - XR_OCULUS_ovrsession_handle (ver 1)
  - XR_OCULUS_perf_stats (ver 1)
  - XR_OCULUS_audio_device_guid (ver 1)
  - XR_EXT_debug_utils (ver 3)

Create OpenXR instance
> prepare instance create information
> create instance
> get instance information
   - Oculus (1.51.0)

Get systems
> Try to get system 1
   > get system information
    - Oculus Rift S (0)
     - Graphics: 4096 * 4096 with 16 layer
     - Tracking: position orientation
> Try to get system 2
   => Error: XR_ERROR_FORM_FACTOR_UNSUPPORTED

Enumerate View Configurations for system 16
  - XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO
   > 2 views:
     - 1648 * 1776 (MAX: 3296 * 3552) [sample: 1(4)]
     - 1648 * 1776 (MAX: 3296 * 3552) [sample: 1(4)]
   > 1 blend modes:
     - XR_ENVIRONMENT_BLEND_MODE_OPAQUE

可以看到 Oculus 的 OpenXR Runtime 是支援最多 extension 的;不過。有許多是 Oculus 自己的就是了。


這篇大概就先到這了。

考慮到 OpenXR runtime 偵測的方法,其實好像可以考慮寫個程式來偵測、切換?不過這就之後有時間再說了。


OpenXR 相關文章目錄

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *