開発

Application SpaceWarp開発者ガイド

更新日時: 2026/05/13
このガイドでは、UnityアプリにAppSWを実装する方法について説明します。AppSWのしくみとデバッグ方法については、こちらをご覧ください。
アプリスペースワープ(AppSW)は、パフォーマンスの面でも遅延の面でも大幅に機能を向上する機能です。これは、Quest開発者に提供されている重要な最適化の1つです。Metaの初期テストでは、変更点はほとんどまたは全くなしで、コンピューティング能力が最大70パーセント向上しました。
ただし、AppSWを有効にすることは技術面に重大な影響をもたらします。アプリのマテリアルを修正し、パイプラインをレンダリングする必要が生じるためです。AppSWをサポートできるように修正されていないマテリアルは、AppSWとあわせて実行した際にアーティファクトを生み出します。
このガイドは、AppSWを最適に利用するために作成されたもので、AppSWを適切に実装するために必要な技術的な考慮事項とトレードオフについて説明しています。

APIと統合についての考慮事項

QuestアプリのAppSWは、ネイティブAPIレベルで、OpenXR拡張機能XR_FB_space_warpを通じて有効化されます。Metaのゲームエンジン統合によりその処理が開発者に代わって行われますが、そのしくみについて理解しておきたいと思う開発者もおられるでしょう。詳しくは、ネイティブ開発者向けガイド、およびOpenXR SDKパッケージのサンプルプロジェクトXrSpaceWarpをご確認ください。

アプリでAppSWを有効にする方法

前提条件

UnityでAppSWを使うには、以下が必要です。
Oculus XR Plugin is deprecated
Oculus XRプラグインは廃止され、削除される予定です。代わりにUnity OpenXRプラグインを使用してください。
  • SpaceWarpのサポートがあるURP。Oculusが保守しているURPのフォークをインストールし、それによりSpaceWarpのサポートを追加する方法については、以下のセクションの中から、該当するUnityバージョンに適したものを展開してください。
  • Unity 2022.3.15f1以降、Unity 6000.0.9f1以降、Unity 6000.4.0f1以降(推奨)
    • 注: 安定しているUnityリリースの最新バージョンを常に入手することをおすすめします。該当するURPバージョンで最低限必要とされるバージョンは2022.3.24ですが、マイナーバージョンが何であれ、安定している最新のバージョンを常に入手するようにしてください。
スクリプト可能なカスタムレンダリングパイプラインの種類を問わず、SpaceWarpのサポートを手動で実施することは可能ですが、一番簡単な方法は、Oculusが保守するURPフォークを使って、SpaceWarpのサポートを追加することです。使用を開始するには、お使いのUnityバージョンに一致するセクションを以下で展開し、記載された指示に従ってください。
以下の行をマニフェストファイルに追加し、同じキーを持つその他の行をすべて削除します。これには、2022.3/14.0.8-oculus-app-spacewarpブランチが使われます(GitHub)。

"com.unity.render-pipelines.core": "git+https://github.com/Oculus-VR/Unity-Graphics.git?path=/Packages/com.unity.render-pipelines.core#2022.3/14.0.8-oculus-app-spacewarp",
"com.unity.render-pipelines.universal": "git+https://github.com/Oculus-VR/Unity-Graphics.git?path=/Packages/com.unity.render-pipelines.universal#2022.3/14.0.8-oculus-app-spacewarp",
"com.unity.shadergraph": "git+https://github.com/Oculus-VR/Unity-Graphics.git?path=/Packages/com.unity.shadergraph#2022.3/14.0.8-oculus-app-spacewarp"
  
以下の行をマニフェストファイルに追加し、同じキーを持つその他の行をすべて削除します。これには、2022.3/14.0.9-oculus-app-spacewarpブランチが使われます(GitHub)。

"com.unity.render-pipelines.core": "git+https://github.com/Oculus-VR/Unity-Graphics.git?path=/Packages/com.unity.render-pipelines.core#2022.3/14.0.9-oculus-app-spacewarp",
"com.unity.render-pipelines.universal": "git+https://github.com/Oculus-VR/Unity-Graphics.git?path=/Packages/com.unity.render-pipelines.universal#2022.3/14.0.9-oculus-app-spacewarp",
"com.unity.shadergraph": "git+https://github.com/Oculus-VR/Unity-Graphics.git?path=/Packages/com.unity.shadergraph#2022.3/14.0.9-oculus-app-spacewarp"
  
以下の行をマニフェストファイルに追加し、同じキーを持つその他の行をすべて削除します。これには、2022.3/14.0.10-oculus-app-spacewarpブランチが使われます(GitHub)。

"com.unity.render-pipelines.core": "git+https://github.com/Oculus-VR/Unity-Graphics.git?path=/Packages/com.unity.render-pipelines.core#2022.3/14.0.10-oculus-app-spacewarp",
"com.unity.render-pipelines.universal": "git+https://github.com/Oculus-VR/Unity-Graphics.git?path=/Packages/com.unity.render-pipelines.universal#2022.3/14.0.10-oculus-app-spacewarp",
"com.unity.shadergraph": "git+https://github.com/Oculus-VR/Unity-Graphics.git?path=/Packages/com.unity.shadergraph#2022.3/14.0.10-oculus-app-spacewarp"
  
RenderGraphを使っている場合、Unity 6000.0.9f1から、URPにはSpaceWarpのサポートがデフォルトで含まれています。MetaのURPフォークには、追加の最適化と透明オブジェクトのサポートが含まれているため、引き続き推奨されます。
以下の行をマニフェストファイルに追加し、同じキーを持つその他の行をすべて削除します。これには、6000.0/oculus-app-spacewarpブランチが使われます(GitHub)。

"com.unity.render-pipelines.core": "git+https://github.com/Oculus-VR/Unity-Graphics.git?path=/Packages/com.unity.render-pipelines.core#6000.0/oculus-app-spacewarp",
"com.unity.render-pipelines.universal": "git+https://github.com/Oculus-VR/Unity-Graphics.git?path=/Packages/com.unity.render-pipelines.universal#6000.0/oculus-app-spacewarp",
"com.unity.shadergraph": "git+https://github.com/Oculus-VR/Unity-Graphics.git?path=/Packages/com.unity.shadergraph#6000.0/oculus-app-spacewarp"
  
Unity 6000.4のURPには、SpaceWarpのサポートがデフォルトで含まれています。MetaのURPフォークには、追加の最適化と透明オブジェクトのサポートが含まれているため、引き続き推奨されます。
以下の行をマニフェストファイルに追加し、同じキーを持つその他の行をすべて削除します。これには、6000.4/oculus-app-spacewarpブランチが使われます(GitHub)。

"com.unity.render-pipelines.core": "git+https://github.com/Oculus-VR/Unity-Graphics.git?path=/Packages/com.unity.render-pipelines.core#6000.4/oculus-app-spacewarp",
"com.unity.render-pipelines.universal": "git+https://github.com/Oculus-VR/Unity-Graphics.git?path=/Packages/com.unity.render-pipelines.universal#6000.4/oculus-app-spacewarp",
"com.unity.shadergraph": "git+https://github.com/Oculus-VR/Unity-Graphics.git?path=/Packages/com.unity.shadergraph#6000.4/oculus-app-spacewarp"
  
: SpaceWarpに対応しているURPフォークは、あくまで参考です。ストックURPを修正なしで使っている場合、forkをそのまま使用することができます。しかし、URPにローカルで修正を加えた場合、またはプロジェクトのレンダリングパイプラインがカスタマイズされたSRPである場合、現在のSRPへの追加として自分でコードを追加するだけで良いでしょう。このためには、URPに加えられた必要な変更を公開するこのコミットを表示して、ブランチの変更内容を確認することが役立ちます。

AppSWを有効にする

  1. [Project Settings (プロジェクト設定)] > [Player (プレイヤー)] > [Android] > [Other Settings (その他の設定)] > [Graphics APIs]の順に進み、Graphics APIがVulkanのみになっていることを確認します。AppSWは他のGraphics APIではサポートされていません。
  2. プロジェクトのOpenXRプラグインでApplication SpaceWarpを有効にします。
    • 推奨されるUnity OpenXRプラグインを使用する場合は、[Project Settings (プロジェクト設定)] > [XR Plug-in Management (XRプラグイン管理)] > [OpenXR] > [All Features (すべての機能)]で、[Meta XR Space Warp]が有効になっていることを確認します。
    • 廃止されたOculus XRプラグインを使用する場合は、[Project Settings (プロジェクト設定)] > [XR Plug-in Management (XRプラグイン管理)] > [Oculus] > [Android] > [Experimental (テスト機能)]で、[Application SpaceWarp (Vulkan)]が有効になっていることを確認します。
  3. 特定のフレームに対してAppSWレンダリングを有効にするには、Meta XR Core SDKのAPI、OVRManager.SetSpaceWarpを使います。そのオン/オフはランタイム中にいつでも切り替えられます。SpaceWarpをオンにしたまま決してオフにしないようにするには、最初のフレームでこのAPIを呼び出すだけで十分です。ただし、実行時にメインのカメラを変更する場合はいつも、メインのカメラのポジションの変更がランタイムに必ず伝送されるように、OVRManager.SetSpaceWarpを呼び出すことが重要です。

モーションベクトルパスをシェーダーに追加する

SpaceWarpをサポートするURPフォークを使用すると、すべての組み込み済みURPマテリアル(例: Universal Render Pipeline/Lit)が、該当する箇所で自動的にモーションベクトルパスをサポートするようになります。ただし、アプリがカスタムシェーダーを使っている場合は、手動でモーションベクトルパスを追加する必要があります。

SRPを使ってモーションベクトルを生成する方法

Unity統合で最も重要なのは、正しいモーションベクトルをどのように生成するかということです。結局のところ、AppSWアプリの品質は、生成するモーションベクトルの品質を超えることはありません。つまり、誤ったモーションベクトルを生成すると、その表示に避けるべき望ましくない影響が出るということです。
ストック/未変更のURPを使っている場合、Oculus URP forkとそのブランチを使うことにより、正しいモーションベクトルのレンダリングをサポートするURPバージョンを入手することをおすすめします。変更を加えたURPや、多くの開発者が使っているようなゼロから自作したカスタムSRPを使っている場合は、そのforkブランチをチェックしてMetaがどのように使用しているかを確認してください。そうすれば、自分のアプリにもうまく適用する方法が分かるでしょう。
次の点に留意してください。
  1. モーションベクトルパス(MotionVecPass)
  2. パスがキューに入れられる方法、およびパスの特定のプロパティ(ビュー投影マトリクス、カリング結果など)
  3. モーションベクトルパスに対応するシェーダー
SRPが新しいパスとしてモーションベクトルパスを追加し、シーン内のモーションに基づいてそのデータを入力できるようにするには、これらの概念をすべて考慮に含める必要があります。それぞれを個別に見てみましょう。

OculusMotionVectorPass

OculusMotionVectorPassは、標準のスクリプト化可能なレンダリングパスであり、URPのほかのスクリプト化可能レンダリングパスの多くとよく似ています。それは主にScriptableRenderContext.DrawRenderers APIを使うことによります。本質的にこのAPIはシーン内のあらゆるレンダラーをチェックし、多くの一連の基準(カリング結果、レンダラーのシェーダーがShaderTagIdと一致するかどうかなど)に基づいて、描画パス内の各オブジェクトを含めるかどうかや、どのシェーダーパスを使うかを決定します。
そこでモーションベクトルシェーダーの登場になります。シェーダー自体については後述しますが、OculusMotionVectorPass内おいて重要な概念は、シェーダーのLightModeが明示的にMotionVectorsになっているレンダラーだけをパスに含めるということです。こうすることで、モーションベクトルパスに含めたいオブジェクト(例えば、ほぼすべての不透明オブジェクトがここに入ります)に適合する特定のシェーダーを含め、かつMVパスに含めたくないシェーダー(透明オブジェクトなど)を除外することが簡単にできます。OculusMotionVectorPassで、このShaderTagIdでフィルターをかけるためにCreateDrawingSettingsが使われていることに注目してください。
適切なDrawingSettingsFilteringSettingsを設定した後、DrawRenderersを呼び出すと、Unityによりモーションベクトルパスのレンダリング作業が実行されます。

適切なプロパティによりパスを設定してキューに入れる方法

ブランチでForwardRendererの中のコードを見て、モーションベクトルパスがどのように作成されてキューに入れられるかを確認してください。そのコードの大部分は分かりやすいものであり、他のレンダリングパスの型に従っています。
お気付きのように、“if(cameraData.xr.motionVectorRenderTargetValid)”という、特定のチェック機能があります。
URPの変更点の複数の箇所でこのチェックがあります。常にこのAPIを使用して、モーションベクトルレンダリングターゲットが有効かどうか、特定のフレームでAppSWに使う準備ができているかどうかを確認してください。これがfalseなら、特定のフレームでAppSWは発生しません。その理由には、さまざまなものがあります。例えば次のようなものです。
  1. OVRManager.EnableSpaceWarp(false)を呼び出していた場合。これによりAppSWは再び有効にするまで無効になります。その場合、motionVectorRenderTargetValidからはfalseが返されます。
  2. テクスチャーが有効でないことを意味するその他の理由。例えば、UnityでAppSWチェックボックスにチェックマークを付けるのを忘れた場合。
パスがキューに入れられると、Unity URPで(カスタムしている場合はカスタムSRPで)発生する標準のフレームロジックやパスロジックが実行されます。これには以下が含まれます。
  1. レンダリングターゲットアタッチメントを設定する。
    • 結局のところこれは、レンダリング作業の直前に発生するSetRenderTargetのURP呼び出しにおいて、これらのモーションベクトルの色+深度アタッチメントが設定されます。
    • 3Dモーションベクトルデータを色テクスチャーのR、G、Bの各チャネルに書き込み、深度バッファデータについては単にこのレンダリングパスでの深度バッファの通常の用法により記録されます。
  2. カメラ関連(下記の次セクション参照)など、特定の統一バッファプロパティを、C# API SetGlobalMatrixArrayを通じて設定する。
  3. 最後に、レンダリングスレッド上でレンダリング作業をプッシュし、それにより実際にモーションベクトルパスのレンダリングがなされる。

カメラのプロパティ

モーションベクトルパスの詳細で最も重要なことの1つは、常にレンダリングされる従来のアイテクスチャー前方パスと正確に同じカメラプロパティを共有していなければならないということです。結局、モーションベクトルは本質的に1:1マッピングです。モーションベクトルの本質は、NDCスペースの中でのアイテクスチャーのモーションをフレームn-1からフレームnまで記述することです。
それで、モーションベクトルパスのカメラパラメーターがアイテクスチャーパスと同じであることが極めて重要です。これには以下が含まれます。
  1. ビュー投影マトリクス(およびその他のカメラマトリクス)は同一でなければなりません。
    • 相違があると、投影が異なるものとなり、AppSWアルゴリズムがモーションベクトルに正しく適用されなくなります。
  2. レイトラッチングのオン/オフ。これは一種の1の部分集合です。レイトラッチングはビュー投影とobjectToWorldのマトリクスにのみ影響するとはいえ、パスの1つでレイトラッチングを使っているなら結局はその他でもそれを使う必要があるからです。
    • その理由を理解するため、アイテクスチャーレンダリングパスではレイトラッチングを有効にする一方、モーションベクトルレンダリングパスでは無効になっているとうなるかを考えてみましょう。その場合、アイテクスチャーレンダリングパスは結局レイトラッチング低レイテンシーのビュー投影マトリクスでレンダリングされますが、モーションベクトルレンダリングパスは高レイテンシーの非レイトラッチングマトリクスでレンダリングされることになります。そうなると、モーションベクトルパスとアイテクスチャーパスが実際に揃わなくなり、モーションベクトルが誤ったものになってしまいます。
    • これを回避するには、統一バッファでの最終結果マトリクスが、モーションベクトルパスの中で、常にアイテクスチャーパスと同じであるようにします。

メッシュレンダラーの設定

モーションベクトルがオブジェクトに確実にレンダリングされるようにするには、シーンの各メッシュレンダラーにモーションベクトル生成モードを設定する必要があります。Unity 2022.2以前の場合、シーンのすべての不透明オブジェクトでこのモードをPer Object Motionに設定してください。この設定は、すべてのメッシュレンダラーの[Additional Settings (追加設定)]にあります。
Unity 2022.3には、Camera Motion Onlyモードのサポートをさらに追加しました。このモードを、シーンのすべての静的オブジェクト(例: 環境、建物など)に指定する必要があります。Camera Motion Onlyモードを使うと、シーンが最初にレンダリングされた際に生成された深度情報を再利用するオプションが開きます。これにより、モーションベクトルパスを高速化します。
このモードを有効にするには、使っているXRプラグインの深度の送信をオンにする必要があります。
  • Unity OpenXRプラグインを使っている場合、Unity OpenXRプラグインのメニューで、深度の送信モードを深度16ビットまたは24ビットに設定してください。
  • Oculus XRプラグインの場合は、[Depth Submission (Vulkan) (深度の送信 (Vulkan))]チェックボックスにチェックを入れる必要があります。
: いずれかのXRプラグインのOptimize Buffer Discards (Vulkan)チェックボックスに必ずチェックを入れることが、パフォーマンスにとって非常に重要です。このオプションは、メインのOculus XRプラグイン設定メニューにあります。OpenXRの場合は、Meta Questオプションメニュー内にあります。

シェーダーモーションベクトルの変更点

最後に、シェーダーに必要な変更点について説明します。シェーダーの大半はOculusMotionVectorCore.hlslにあります。これらには、標準の頂点とフラグメントシェーダーが含まれています。それぞれを簡潔に要約すると、頂点シェーダーが現在の頂点位置と直前の頂点位置の両方を変換してクリップスペースにした後、ラスタ化され、フラグメントシェーダーの中で直前フレームと現行フレーム両方のNDCスペース位置が計算され、最終的にそれらの差がモーションベクトルとなります。
ごくシンプルなシェーダーによるプロジェクトや、LitとSimpleLitなどのデフォルトのURPシェーダーだけのプロジェクトの場合は、すぐに利用可能な状態でサポートされているか、またはLit/SimpleLitにサポートを追加するために使われたモデルにならうことができます。
具体的には、モーションベクトルを生成するプロジェクトで使う各シェーダーに、LightMode="MotionVectors"のパスを追加する必要があります。この作業のほとんどは、LitまたはSimpleLitのシェーダーのブランチにあるMotionVectors型の正確なパスをコピーペーストするだけなので、作業負荷が高すぎることはないと思われます。このパスをすべてのシェーダーに追加しないなら、モーションベクトルはレンダリングされないことに注意してください。というのは、MotionVecPassではMotionVectorsのShaderTagIdが適用されるからです。これは、特定のLightModeのオブジェクトのみレンダリングするフィルターとなります。
アルファクリップを使用する不透明シェーダーの場合、クリップに使用されるアルファ値を計算するために、フォワードパスと同じロジックで実行するカスタムモーションベクトルシェーダーを使用することが重要です。この後で、フラグメントシェーダーは、OculusMotionVectorCore.hlslにある同じ計算を使って、結果として得られる色値を決定する必要があります。
透明オブジェクトではなく不透明オブジェクトのシェーダーでのみLightMode=”MotionVectors”のパスを追加するのが良いでしょう。前述のようにAppSWでは透明性に関して問題が発生する可能性があるからです。しかし、透明シェーダーのモーションベクトルを生成する必要があるいくつかの例外があります。ほぼ不透明なコンテンツでも、丸みのあるエッジ用にアルファを使用するUIシェーダーの場合、または完全に不透明な文字のあるテキストの場合、アルファブレンドの代わりにアルファクリップを使用するモーションベクトルバスを追加する必要があります。さらに、ほぼ不透明な半透明オブジェクトの場合、モーションベクトルを生成するのであれば(モーションベクトルはアルファクリップを使用します。モーションベクトルはオブジェクト間で正確にブレンドされないので)、SpaceWarpのほうが優れた結果が出る場合があります。
透明キューのオブジェクトのモーションベクトルを有効にするには、URP forkを変更する必要があります。URP forkでは、OculusMotionVectorPassはユニバーサルレンダラーで作成されますが、RenderQueueRange.opaqueRenderQueueRange.allに変更します。アプリの設定によっては、data.opaqueLayerMaskdata.opaqueLayerMask | data.transparentLayerMaskに変更する必要がある場合もあります。
カスタムシェーダー
注意しておきたい1つの点は、高度にカスタマイズしたシェーダーの利用についてです。前述のように1つの用途はアバターのレンダリングに関するものです。頂点バッファ(頂点シェーダーへの従来のインプット)には頂点位置が含まれず、それらの頂点位置が、シェーダーへのインプットであるテクスチャーからの頂点シェーダーサンプリングによってアクセスされるという場合を例として考えましょう。
その場合、モーションベクトルを適切にサポートするには、頂点位置を提供するテクスチャーを拡張して、モーションベクトル頂点シェーダーによってアクセス可能な直前の頂点位置を追加することも必要です。そうすれば、モーションベクトル頂点シェーダーには現在と直前の頂点位置の両方をNDCスペースに変換するのに十分な情報があることになり、そこから最終的なモーションベクトルが構成されます。
これに該当する場合も十分サポートされますが、カスタマイズしたシェーダーからアクセスできるよう、直前の頂点位置を渡すために余分の作業が若干必要になります。

まとめ

Meta XR Core SDKでのAppSWの使い方をまとめると、以下のようになります。
  1. 該当するUnityバージョンに合わせて、プラグイン、エンジン、URPのバージョンを選択します。
  2. SpaceWarpは、Meta XR Core SDKOVRManager.SetSpaceWarp APIを使うことによりフレームごとにオン/オフできます。簡単にまとめると、このAPIを呼び出してSpaceWarpをオンに設定したら、SpaceWarpが有効にされた状態ですぐにシーンか領域に入ります。そして、そのシーンから立ち去る時またはSpaceWarpを無効にする時にオフにします。このAPIの結果はURPでも値if(cameraData.xr.motionVectorRenderTargetValid)で知ることができ、SpaceWarpが有効なフレームでは値はtrue、無効なフレームでは値はfalseになるので、とても便利です。そのようにして、URP側のレンダリング作業を制御して、SpaceWarpがオンの場合にのみ実行されるようにすることができます。
  3. シェーダーを変更していないURPを使っている場合は、フォークされたブランチをプロジェクトに追加するだけで先に進むことができます。URPを使用していて、独自のシェーダーを作成している場合は、Unity-AppSpaceWarpサンプルプロジェクトにおけるCustomShadersシーンに従ってシェーダーを変更して、AppSWをサポートするようにできます。カスタマイズしたSRPを使っている場合は、上記の変更点を確認して、自分のモーションベクトルパスを作成します。正しいシェーダーを使用し、目のテクスチャーパスに合った適切な行列を設定してください。
  4. シェーダーのカスタマイズ度が大きいほど、SpaceWarpを有効にするための作業が多くなります。しかし、モーションベクトルレンダリングの概念をしっかり理解し、それが直前フレームの頂点位置を変換してクリップスペースにしたものと、現行フレームの対応するものとの差を計算することであるということが分かっていれば、カスタム版も含めてほぼどんなシェーダーでもモーションベクトルをサポートするようにシェーダーを拡張することができます。

ステップバイステップUnityガイドとサンプルプロジェクト

forkの中にサンプルUnityプロジェクトも準備されています。これは、すでに動作しているエンドツーエンド状態のAppSWが正確にどういう仕組みで動作するのかを示すものです。これにより、上記の手順を容易に統合できます。これらのコンポーネントがすべて揃ったプロジェクトを既に使用している状態だからです。
  1. forkリポジトリの同じブランチのプロジェクトに移動します。そのパスはTestProjects/OculusAppSpaceWarpSampleです。Questアプリをビルドする際に通常するようにしてプロジェクトをAndroidプラットフォームに切り替えます。
  2. アセットストアからMeta XR Core SDKをインポートするか、Meta XR All-in-One SDKバンドルから入手します。
    インポートするフォルダーを選ぶ際には、今のところVRフォルダーのみを選びます。このサンプルプロジェクトは、その他のフォルダーに依存していないからです。
    インポート時には、更新のプロンプトに従い、OpenXRに対してYESを押します。OpenXRバックエンドのAppSWのみがサポートされているからです。Unityを再開するよう促されます。
    : Oculus XRプラグインは、OpenXRバックエンドを使っています。
  3. 確認ですが、この時点でUnity内のディレクトリ構造は正確に次のようになっているはずです。そうなっていない場合は、上記の手順のどこかで間違っています。
    Directory Structure
  4. ここで、左から5番目のアイコンであるScenePackage.unitypackageをダブルクリックします。それをダブルクリックすると、シーン+スクリプトの組み合わせがインポートされます。
  5. 最後にシーンScenePackage/SpaceWarpScene.unityを開きます。プレイヤー設定領域はこのようになっているはずです。そして、XRプラグイン領域のOculus設定は次の画像のようになっているはずです。このようになっているなら、APKをビルドする準備ができていることになります。
Player Settings
Player Settings 2
通常どおり、APKをビルドして実行します。

アプリを使ってSpaceWarpをテストする

今ビルドしたこのサンプルアプリでSpaceWarpが動作するようになったら、右コントローラーの[B]ボタンを押すことにより、SpaceWarpのオン/オフを切り替えることができます。その機能の動作を自分でテストする方法として次の2つの方法があります。
  1. 単に通常のようにしてアプリを開き、Bのオン/オフを切り替える。バックグラウンドでタブによるadb logcat -s VrApiの実行が継続されるようにするか、またはOVRMetricsToolを使うこともできます。SpaceWarpがオンの場合、フレームごとのVrApiログ行にASW=<FPS>ログ行があり、それによりSpaceWarpの実行状況を知ることができます。この場合、SpaceWarpが動作していることを見る上で視覚的に重要な点は、シーンにはほとんどまたは全く影響がないこと、それでもVrApi出力の中のFPS=行からFPSが半レート(36 FPS、頻度45/90の場合は実際の本番アプリで45)であることを確認できるということです。それで、これはSpaceWarpが動作していることを確認するための優れたテストと言えます。半フレームレートでも高品質のレンダリングが動作していることを確認できるからです。
  2. (推奨)アプリを閉じ、それを開く前に次を実行します。
adb shell setprop debug.oculus.sysPropDebug 1
adb shell setprop debug.oculus.swapInterval 2
adb shell input keyevent 26
少し待ってから次を実行します
adb shell input keyevent 26
これでアプリを開く準備ができました。すぐにアプリは、明示的にデフォルトで36 FPSモードになります。これにより、「正規36 FPSモード」の影響をSpaceWarpの場合と比べることができます。前と同じように[B]ボタンで切り替えます。SpaceWarpが自分の側で動作しているなら、影響はほとんど消えます。しかし、ここで重要なのは、アプリのどちらのバージョンも36 FPSで実行されているということです。これこそSpaceWarpの秘密です。アプリが半レートで実行されているのに、品質はフルレートのエクスペリエンスに匹敵するのです。

重要な最終ステップ: 何が起きているかを理解する

すべてうまく動作するようになった今、重要なステップは、このシンプルなサンプルプロジェクトが何をしているのかを正確に把握することです。使われているシェーダー(LitとSimpleLitのみ)、モーションベクトルパスをどのようにそれらに追加したか、同じパスを独自のカスタムシェーダーに追加するにはどうすればいいか、といった詳細な点です。
ほかのモーションベクトルレンダリングパスの実行をトレースし、そのグラフィックスパイプラインの正確なコンテンツを知りたいと思われるのなら、RenderDocを強くおすすめします。さらに、テクスチャーアタッチメントがどのようにレンダリングされているか(368x400色+深度バッファのペア)、不透明ドローコールがどのようにモーションベクトルをR、G、Bチャネルに書き込んでいるかを知ることができます。RenderDocにより実行について理解できたなら、独自のカスタムシェーダーを使って、同じ技術を自分のプロジェクトでも実際に実装することができるでしょう。
ナビゲーションロゴ
日本語
© 2026 Meta