Qualcomm OpenXR SDK ユーザー ガイド (1)
1 OpenXR の概要
OpenXR は、AR、VR、および MR プラットフォームとデバイスへのアクセスを提供するロイヤリティ フリーのフレームワークです。OpenXR が登場する前は、さまざまなベンダーが独自の SDK を構築して XR デバイスをサポートしていました。現在のマルチベンダー SDK エコシステムには、次の制限があります。
- 1 つの SDK 用に開発されたアプリは、すべての HMD で実行できるわけではありません (SDK ごとに API が異なるため)
- アプリケーション開発者は、同じアプリケーションを異なる SDK に移植して各 HMD で実行する必要があります
- 異なる SDK で API の変更がある場合は、報告する必要があります
- 現在、AR、VR、および MR には共通の SDK がありません (一部の SDK は AR のみ、VR のみなど)。
- アプリケーション エコシステムは、さまざまな SDK と HMD によって制限されます
- 利用可能なほとんどの SDK と HMD は WebXR をサポートしていません
以下の図は、OpenXR と比較した断片化された SDK エコシステムを示しています。
図の左側は、さまざまな SDK と、サポートされている HMD で実行するためのアプリケーションのクロスポーティングを備えた断片化されたエコシステムです。
図の右側は、アプリケーション レイヤーとデバイス プラグイン レイヤーの共通フレームワーク インターフェイスであり、アプリケーションが OpenXR をサポートするさまざまな XR HMD でクロス機能を持つことを可能にします。
OpenXR はこのギャップを埋め、次の利点を提供します。
- アプリケーションの相互移植は不要 (一度開発すると、どの HMD でも動作します) - 統一された API を使用
- 統一されたデバイス プラグイン インターフェイスを提供し、OpenXR アプリケーション プラットフォームを独立させる
- AR、VR、MRの統合体験SDKを提供
- WebXR のサポート
OpenXR は、多くのレイヤーとコンポーネントに分割されています。主なコンポーネントは次のとおりです。
- 応用
- ローダ
- API层(API layer)
- ランタイム (ランタイム)
- シンセサイザー
次の図は、OpenXR コンポーネントの配布を示しています。
1.1 ローダー
ローダーは、アプリケーション、ランタイム、およびその他の OpenXR レイヤーの間の中間レイヤーです。ローダーは、システムで利用可能な OpenXR ランタイムまたは API レイヤーを検出し、公開し、場合によっては読み込むために不可欠です。セットアップが完了すると、ローダーは、これらの各コンポーネントへの OpenXR コマンドの適切なディスパッチを管理する役割も果たします。
ローダ:
- アプリケーションのリクエストに使用されるランタイムを決定するため、システムで 1 つ以上の OpenXR ランタイムをサポートする必要があります。ランタイムをロードし、インスタンスをアプリケーションに返します。
- API をアプリケーション レイヤーに公開してランタイム インスタンスを作成し、API サポート レイヤーを確認して、OpenXR コマンドをランタイムの下位レイヤーにルート化します。
- OpenXR API レイヤーをサポートする必要があります (アプリケーション、開発者、または標準のシステム設定で有効にできるオプションのモジュール)
- API ルーティングとランタイム操作をオフロードすることで、OpenXR アプリケーションの全体的なメモリとパフォーマンスへの影響を軽減するための努力が必要です。
次の図は、OpenXR ローダーの相互作用を示しています。
以下は、ローダーによってアプリケーション層に向けて公開される API (重要な機能) です。
- xrCreateInstance
- xrDestroyInstance
- xrEnumerateApiLayerProperties
- xrEnumerateInstanceExtensionProperties
- xrGetInstanceProcAddr
- xrGetInstanceProperties
- xrPollEvent
- xrGetSystem
- xrGetSystemProperties
- xrCreateSession
- xrDestroySession
- xrEnumerateReferenceSpaces
- xrCreateReferenceSpace
- xrCreateActionSpace
- xrLocateSpace
- xrDestroySpace
- xrEnumerateSwapchainFormats
- xrCreateSwapchain
- xrDestroySwapchain
- xrEnumerateSwapchainImages
- xrAcquireSwapchainImage
- xrWaitSwapchainImage
- xrReleaseSwapchainImage
- xrBeginSession
- xrEndSession
- xrRequestExitSession
- xrWaitFrame
- xrBeginFrame
- xrEndFrame
- xrLocateViews
- xrCreateActionSet
- xrDestroyActionSet
- xrCreateAction
- xrDestroyAction
- xrGetActionStatePose
- xrSyncActions
- xrApply触覚フィードバック
- xrStop触覚フィードバック
SXR と OpenXR SDK および API 関数の API の違いに関する詳細はまだ説明されていません。
1.2 ランタイム
OpenXR ランタイムは、OpenXR API を実装するソフトウェアです。システムには複数の OpenXR ランタイムがインストールされている場合がありますが、一度にアクティブにできるランタイムは 1 つだけです。各 OpenXR ランタイムは、完全な VR/AR/MR システムを制御します。
ここで、ランタイムには、ランタイム クライアント、ランタイム サーバー、およびコンポジターが含まれます。ランタイム クライアントはアプリケーション プロセスと連携します。アプリケーションは、ランタイム クライアントのローダーを介してランタイム関数を呼び出すことができます。ランタイムが他の操作を実行する前に、ランタイム クライアントは ipc_instance_create 呼び出しを通じてランタイム サーバーとの接続を確立する必要があります。
その後、レンダリング レイヤーのデータなどの情報を継続的にランタイム サーバーに送信できます。
ランタイム サーバーは、アプリケーションとは別のプロセスで実行されます。ランタイム サーバーは継続的に IPC コマンドをリッスンし、接続されたランタイム クライアントからレンダリング データを受信します。ランタイム サーバーでコンポジター ループが作成され、データが処理されます。これには、すべてのレイヤーの取得、再投影、ワープ、最終的なデバイスへの表示が含まれます。
1.3 API层
API レイヤーは、OpenXR システムを強化するオプションのコンポーネントです。アプリケーションからランタイムへの途中で、既存の OpenXR コマンドをインターセプト、評価、変更、および挿入できます。
API レイヤーは、アプリケーション リクエストなど、さまざまな方法で有効化されるライブラリとして実装されます。xrCreateInstance の呼び出し中に、OpenXR システムですべての API レイヤーが有効になります。各 API レイヤーは、任意の OpenXR コマンドをフック (インターセプト) することを選択できます。これにより、無視または拡張することができます。API レイヤーは、すべての OpenXR コマンドをインターセプトする必要はありませんが、必要なものだけをインターセプトする必要があります。
1.4 シンセサイザー
シンセサイザは共有ライブラリとして使用され、同じプロセス内でランタイム サーバーによって呼び出されます。すべてのレイヤーを取得し、それらを再投影してワープし、デバイスに表示します。スレッド qxr_multi_main_loop スレッドは、レイヤーをスレッド render_thread_loop に送信できます。スレッド render_thread_loop がワープしてシーンを表示します。
コンポジターは次の機能を公開します:
コンポジターのライフサイクルの制御:
- 初期化/シャットダウン
- 一時停止/再開コンポジション
- 待機/開始/終了フレーム
セッション登録
- 始める
- セッション終了
層資源共有
- レイヤーイメージの登録/登録解除
- IsLayerImageRegistered
内層
- 内部レイヤーを有効にする
歪んだメッシュ
- SetDistortionGridData
バージョンの詳細
- GetVersion