OpenXR アプリのベストプラクティスOpenXR app best practices

以下のベストプラクティスの例については、 BasicXrAppの OpenXRProgram ファイルを参照してください。You can see an example of the best practices below in BasicXrApp's OpenXRProgram.cpp file. 最初の Run () 関数は、初期化からイベントおよびレンダリングループへの一般的な OpenXR app コードフローをキャプチャします。The Run() function at the beginning captures a typical OpenXR app code flow from initialization to the event and rendering loop.

ビジュアルの品質と安定性に関するベストプラクティスBest practices for visual quality and stability

このセクションのベストプラクティスでは、OpenXR アプリケーションで最高の画質と安定性を実現する方法について説明します。The best practices in this section describe how to get the best visual quality and stability in any OpenXR application.

HoloLens 2 に固有のパフォーマンスの推奨事項については、後述の「 hololens 2 のパフォーマンスに関するベストプラクティス 」を参照してください。For further performance recommendations specific to HoloLens 2, see the Best practices for performance on HoloLens 2 section below.

ガンマ-正しいレンダリングGamma-correct rendering

レンダリングパイプラインのガンマが正しいことを確認する必要があります。Care must be taken to ensure that your rendering pipeline is gamma-correct. スワップチェーンにレンダリングする場合、レンダーターゲットビュー形式は、スワップチェーン形式 ( DXGI_FORMAT_B8G8R8A8_UNORM_SRGB スワップチェーン形式とレンダーターゲットビューの両方など) と一致する必要があります。When rendering to a swapchain, the render-target view format should match the swapchain format (e.g. DXGI_FORMAT_B8G8R8A8_UNORM_SRGB for both the swapchain format and the render-target view). 例外は、アプリのレンダリングパイプラインがシェーダーコードで手動の srgb 変換を行う場合です。この場合、アプリは srgb スワップチェーン形式を要求する必要がありますが、レンダリングターゲットビューには線形形式を使用しますが、 DXGI_FORMAT_B8G8R8A8_UNORM_SRGB DXGI_FORMAT_B8G8R8A8_UNORM コンテンツが二重にガンマ補正されないようにするために、レンダーターゲットビューとして使用します。The exception is if the app's rendering pipeline does a manual sRGB conversion in shader code, in which case the app should request an sRGB swapchain format but use the linear format for the render-target view (e.g. request DXGI_FORMAT_B8G8R8A8_UNORM_SRGB as the swapchain format but use DXGI_FORMAT_B8G8R8A8_UNORM as the render-target view) to prevent content from being double-gamma corrected.

プロジェクションレイヤーの深度バッファーを送信しますSubmit depth buffer for projection layers

常に XR_KHR_composition_layer_depth 拡張機能を使用し、フレームをに送信するときに、その深度バッファーを投影レイヤーと一緒に送信し xrEndFrame ます。Always use XR_KHR_composition_layer_depth extension and submit the depth buffer together with the projection layer when submitting a frame to xrEndFrame. これにより、HoloLens 2 でハードウェアの深さの再投影を有効にすることで、ホログラムの安定性が向上します。This improves hologram stability by enabling hardware depth reprojection on HoloLens 2.

適切な深さの範囲を選択してくださいChoose a reasonable depth range

HoloLens でのホログラムの安定性を向上させるために、より狭い深さの範囲を使用して仮想コンテンツの範囲を絞り込みます。Prefer a narrower depth range to scope the virtual content to help hologram stability on HoloLens. たとえば、OpenXrProgram サンプルでは、0.1 ~ 20 メートルが使用されています。For example, the OpenXrProgram.cpp sample is using 0.1 to 20 meters. より一貫した深さの解決には、 逆順-Z を使用します。Use reversed-Z for a more uniform depth resolution. HoloLens 2 では、推奨される深度形式を使用する DXGI_FORMAT_D16_UNORM と、フレームレートとパフォーマンスが向上しますが、16ビット深度バッファーでは、24ビット深度バッファーよりも深さの解像度が低くなることに注意してください。Note that, on HoloLens 2, using the preferred DXGI_FORMAT_D16_UNORM depth format will help achieve better frame rate and performance, although 16-bit depth buffers provide less depth resolution than 24-bit depth buffers. そのため、これらのベストプラクティスに従って、その深さの解決を最大限に活用することが重要になります。Therefore, following these best practices to make best use of the depth resolution becomes more important.

さまざまな環境の blend モードを準備するPrepare for different environment blend modes

また、世界を完全にブロックしているイマーシブヘッドセットでアプリケーションを実行する場合は、API を使用してサポートされている環境の blend モードを列挙し、それに応じてレンダリングコンテンツを準備してください xrEnumerateEnvironmentBlendModesIf your application will also run on immersive headsets that completely block out the world, be sure to enumerate supported environment blend modes using xrEnumerateEnvironmentBlendModes API, and prepare your rendering content accordingly. たとえば、HoloLens などのシステムの場合、アプリでは XR_ENVIRONMENT_BLEND_MODE_ADDITIVE 透明色として透明を使用する必要があります。一方、を使用しているシステムの場合、 XR_ENVIRONMENT_BLEND_MODE_OPAQUE アプリは不透明色または一部の仮想ルームをバックグラウンドでレンダリングする必要があります。For example, for a system with XR_ENVIRONMENT_BLEND_MODE_ADDITIVE such as the HoloLens, the app should use transparent as the clear color, while for a system with XR_ENVIRONMENT_BLEND_MODE_OPAQUE, the app should render some opaque color or some virtual room in the background.

アプリケーションのルート領域として非バインド参照スペースを選択するChoose unbounded reference space as application's root space

通常、アプリケーションは、ビュー、アクション、およびホログラムを連結するために、いくつかのルートワールド座標空間を確立します。Applications typically establish some root world coordinate space to connect views, actions and holograms together. XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT拡張機能がサポートされている場合は、を使用して、ワールドスケールの座標系を確立します。これにより、アプリの開始位置からユーザーが遠く (たとえば、5メートル離れた場所で) 移動したときに望ましくないホログラムのずれを防ぐことができます。Use XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT when the extension is supported to establish a world-scale coordinate system, enabling your app to avoid undesired hologram drift when the user moves far (e.g. 5 meters away) from where the app starts. XR_REFERENCE_SPACE_TYPE_LOCAL バインド領域の拡張機能が存在しない場合は、フォールバックとして使用します。Use XR_REFERENCE_SPACE_TYPE_LOCAL as a fallback if the unbounded space extension doesn't exist.

ホログラムを空間アンカーに関連付けるAssociate hologram with spatial anchor

バインドされていない参照空間を使用する場合、その参照空間に直接配置したホログラムは、遠くの部屋に移動した後に戻ったときに、 ずれを生じる可能性があります。When using an unbounded reference space, holograms you place directly in that reference space may drift as the user walks to distant rooms and then comes back. ホログラムユーザーが世界中の個別の場所に配置されるようにするには、拡張機能を使用して 空間アンカーを作成 xrCreateSpatialAnchorSpaceMSFT し、その原点にホログラムを配置します。For hologram users place at a discrete location in the world, create a spatial anchor using the xrCreateSpatialAnchorSpaceMSFT extension function and position the hologram at its origin. これにより、そのホログラムは時間の経過と共に個別に安定した状態に保たれますThat will keep that hologram independently stable over time.

混合現実のキャプチャをサポートするSupport mixed reality capture

HoloLens 2 のプライマリディスプレイは加法の環境ブレンドを使用しますが、ユーザーが mixed reality キャプチャを開始すると、アプリのレンダリングコンテンツは環境のビデオストリームとアルファブレンドされます。Although HoloLens 2's primary display uses additive environment blending, when the user initiates mixed reality capture, the app's rendering content will be alpha-blended with the environment video stream. 混合現実のキャプチャビデオで最高の画質を実現するには、投影レイヤーのを設定することをお勧めし XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT layerFlags ます。To achieve the best visual quality in mixed reality capture videos, it's best to set the XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT in your projection layer's layerFlags.

HoloLens 2 でのパフォーマンスに関するベストプラクティスBest practices for performance on HoloLens 2

ハードウェアの再プロジェクションをサポートするモバイルデバイスとして、HoloLens 2 には最適なパフォーマンスを得るための厳しい要件があります。As a mobile device with hardware reprojection support, HoloLens 2 has stricter requirements to obtain optimal performance. 合成データを送信するには、さまざまな方法があります。これにより、 xrEndFrame パフォーマンスが大幅に低下する後処理が発生します。There are a number of ways to submit composition data through xrEndFrame which will result in post-processing that will have a noticeable performance penalty.

スワップチェーン形式を選択してくださいSelect a swapchain format

常にを使用して、サポートされているピクセル形式を列挙 xrEnumerateSwapchainFormats し、アプリがサポートするランタイムから最初の色と深度のピクセル形式を選択します。これは、ランタイムが最適なパフォーマンスのために優先するものであるためです。Always enumerate supported pixel formats using xrEnumerateSwapchainFormats, and choose the first color and depth pixel format from the runtime that the app supports, because that's what the runtime prefers for optimal performance. HoloLens 2 で DXGI_FORMAT_B8G8R8A8_UNORM_SRGB DXGI_FORMAT_D16_UNORM は、通常、レンダリングのパフォーマンスを向上させるための最初の選択肢です。Note, on HoloLens 2, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB and DXGI_FORMAT_D16_UNORM is typically the first choice to achieve better rendering performance. この設定は、デスクトップ PC で実行されている VR ヘッドセットでは異なっていてもかまいません。24ビットの深度バッファーでは、パフォーマンスへの影響が少なくなります。This preference can be different on VR headsets running on a Desktop PC, where 24-bit depth buffers have less of a performance impact.

パフォーマンスの警告: プライマリスワップチェーンカラー形式以外の形式を使用すると、パフォーマンスが大幅に低下するランタイム後処理が発生します。Performance Warning: Using a format other than the primary swapchain color format will result in runtime post-processing which comes at a significant performance penalty.

常に推奨されるビュー構成の幅/高さ (から) を使用してレンダリングし、表示する前に、常に API を使用して推奨されるビューの破棄 recommendedImageRectWidth recommendedImageRectHeight XrViewConfigurationView xrLocateViews 、視界、およびその他のレンダリングパラメーターを照会します。Always render with the recommended view configuration width/height (recommendedImageRectWidth and recommendedImageRectHeight from XrViewConfigurationView), and always use xrLocateViews API to query for the recommended view pose, fov, and other rendering parameters before rendering. XrFrameEndInfo.predictedDisplayTimeポーズとビューに対してクエリを実行するときは、常に最新の呼び出しからを使用し xrWaitFrame ます。Always use the XrFrameEndInfo.predictedDisplayTime from the latest xrWaitFrame call when querying for poses and views. これにより、HoloLens は、HoloLens を装着しているユーザーに対してレンダリングを調整し、視覚品質を最適化することができます。This allows HoloLens to adjust rendering and optimize visual quality for the person who is wearing the HoloLens.

1つの投影レイヤーを使用するUse a single projection layer

HoloLens 2 では、アプリケーションがコンテンツをレンダリングするための GPU 機能が制限されており、単一の投影レイヤー用に最適化されたハードウェアコンポジターが使用されています。HoloLens 2 has limited GPU power for applications to render content and a hardware compositor optimized for a single projection layer. 常に1つの投影レイヤーを使用すると、アプリケーションのフレームレート、ホログラムの安定性、およびビジュアルの品質を向上させることができます。Always using a single projection layer can help the application's framerate, hologram stability and visual quality.

パフォーマンスの警告: 1つの保護レイヤーだけを送信すると、パフォーマンスが大幅に低下するランタイム後処理が発生します。Performance Warning: Submitting anything but a single protection layer will result in runtime post-processing which comes at a significant performance penalty.

テクスチャ配列と VPRT を使用したレンダリングRender with texture array and VPRT

xrSwapchainカラースワップチェーンにはを使用して、左と右の両方に対して1つ作成し arraySize=2 ます。Create one xrSwapchain for both left and right eye using arraySize=2 for color swapchain, and one for depth. スライス0に左側を表示し、スライス1に目を入れます。Render the left eye into slice 0 and the right eye into slice 1. VPRT のシェーダーとインスタンス化された描画呼び出しのステレオスコピックレンダリングを使用して、GPU の負荷を最小限に抑えます。Use a shader with VPRT and instanced draw calls for stereoscopic rendering to minimize GPU load. これにより、ランタイムの最適化によって HoloLens 2 で最高のパフォーマンスを実現できます。This also enables the runtime's optimization to achieve the best performance on HoloLens 2. 2つのテクスチャ配列を使用する代わりに、2倍のレンダリングや個別のスワップチェーンなどを使用する代わりに、パフォーマンスが大幅に低下するランタイム後処理が発生します。Alternatives to using a texture array, such as double-wide rendering or a separate swapchain per eye, will result in runtime post-processing which comes at a significant performance penalty.

クワッドレイヤーを避けるAvoid quad layers

では、クワッドレイヤーを合成レイヤーとして送信するのではなく XrCompositionLayerQuad 、四角形のコンテンツを射影 swapchain に直接レンダリングします。Rather than submitting quad layers as composition layers with XrCompositionLayerQuad, render the quad content directly into the projection swapchain.

パフォーマンスの警告: クワッドレイヤーなど、1つの投影レイヤーを超えて追加のレイヤーを提供すると、パフォーマンスが大幅に低下するランタイム後処理が発生します。Performance Warning: Providing additional layers beyond a single projection layer, such as quad layers, will result in runtime post-processing which comes at a significant performance penalty.