開発
開発
プラットフォームを選択

コンポジターレイヤー

更新日時: 2025/03/11
このガイドでは、コンポジターレイヤーに関する技術的な情報や、Questオペレーティングシステムでの実装方法について説明します。アプリにコンポジターレイヤーを実装する方法については、UnitySpatial SDKUnreal、またはドキュメントのページをご覧ください。
コンポジターレイヤーは、コンポジターによって提供されるツールであり、鮮明で読みやすいテクスチャーをコンポジターのフレームレート(アプリのフレームレートと同等かそれ以上)でレンダリングできます。テキストとユーザーインターフェイスのレンダリングにコンポジターレイヤーを利用すれば、小さいフォントやUI要素を使う場合であっても高い明瞭度を実現できます。
コンポジターレイヤーは次のものに使用します。
  • テキスト、ユーザーインターフェイス、動画。シャープなテクスチャーにより、アプリで小さいフォントサイズや小さいUI要素を使っても、ユーザーが読めるだけの品質を確保できます。(注: 円筒形状のスライスを使うことにより、大きな曲線UIを作ることができます。)
  • 視線カーソル、十字線、その他のテクスチャー。これらは、シーンで注目を集めるオブジェクトとなることを意図したものです。
  • 画面の読み込みなど、アプリのパフォーマンス低下が予期されるシナリオ。アプリが時間どおりにフレームを送信できなかった場合でもコンポジターはフレームレートで実行されるため、読み込み画面のコンポジターレイヤー要素は常にフルフレームレートで更新されているように見えます。
Comparison of a texture rendered with and without compositor layers

コンポジターレイヤーのほうがシャープな理由

独立したフレームレートではコンポジターレイヤーのレンダリングのほうがシャープになる理由を理解するには、アプリがVRヘッドセットにレンダリングを行う方法を理解する必要があります。

アプリのレンダリング

コンポジター: フレームを歪ませるで説明されているように、UnityやUnrealなどのゲームエンジンでは、アプリのシーンのコンテンツを、歪んでいない2つのアイバッファテクスチャーに分けてレンダリングします。そして、コンポジターは、VRヘッドセット上でレンズによる歪みを打ち消すように、これらのテクスチャーを歪ませます。
このパイプライン全体で、ワールド内にレンダリングされる入力テクスチャーは2回サンプリングされます。
  1. 入力テクスチャーは、アイバッファテクスチャー用にワールド内シーンでレンダリングするためにサンプリングされます
  2. アイバッファのテクスチャーは、歪んだ画面出力としてレンダリングするためにサンプリングされます
Details of texture samples in an application-rendered pipeline
注: ソーステクスチャーのテクセルサイズは出力テクスチャーと正確に揃っていないため、テクスチャーを1回サンプリングするごとに、不鮮明なアーティファクトが増加します。アイバッファサイズを上げることで不鮮明さを軽減することは可能ですが、サンプリングの回数が増えるほど、元の画像やテキストの明瞭さが失われていきます。

コンポジターレイヤーのレンダリング

サンプリング回数を減らすための解決策として、事前に歪ませてから画面に直接レンダリングするための追加テクスチャーを、ゲームエンジンからコンポジターに送信できます。
それらの追加テクスチャーは、アプリではレンダリングされません。代わりに、コンポジターは頂点シェーダー時に歪み補正を処理する特別な頂点シェーダーを使って、選択された図形をレンダリングします。その結果、入力テクスチャーのサンプリングは、ソーステクスチャーから歪ませた出力テクスチャーへの一度だけで済みます。
このアプローチにはいくつかの制限があります。
  • 事前に歪ませた頂点シェーダーのあるクワッド、円筒、立方体マップなど、図形の事前定義済みリストの中からしか選択できません。それらの図形は自由に変形できます。
  • 使うピクセルシェーダーを制御することはできません。テクスチャーは、ライティングもエフェクトもなしでレンダリングされます。ただし、必要な場合は、ライティングとエフェクトをテクスチャーに焼き付ける(そしてフレームごとにテクスチャーを変更する)ことができます。
Details of texture samples in an application-rendered pipeline
このパイプライン処理には、アプリにとって多くのメリットがあります。
  • サンプリングのレイヤーをスキップできるため、テクスチャーがよりシャープに表示されます。
  • テクスチャーは、コンポジターのフレームレート(アプリのフレームレートと同等かそれ以上)でレンダリングされます。
各エンジンにコンポジターレイヤーを実装する方法について詳しくは、以下をご覧ください。

コンポジターレイヤーのプロファイリングとデバッグ

コンポジターレイヤーには、それぞれ以下のような異なるパフォーマンスコストがあります。
  • アプリでテクスチャーをレンダリングしてコンポジターレイヤーとして描画するためのコスト
    これはすべてアプリ空間で処理されるため、ほとんどのゲームエンジンに組み込まれているプロファイラーツールにより、テクスチャー生成のコストについて詳細な情報を得ることができます。小さなテクスチャーになるようにレンダリングしたり、フレームを1つおきにレンダリングしたりすることによって、コストを削減できます。
  • レイヤーごとのフラットのコスト
    CPU/GPUレベル4でのMeta Quest 2の場合、コンポジターレイヤーを追加するごとに約0.1ミリ秒のコストがかかります。コンポジターは、QUAD図形を使うヘッドロックされた複数のFIXED_TO_VIEWレイヤーをマージして1つのレイヤーにすることに注意してください。マージ後のレイヤーについては、レイヤーごとの追加コストはありません。
  • レイヤーがタッチするピクセル数に基づくレイヤーごとの追加コスト
    このコストは、そのレイヤーによってカバーされる画面上のピクセル数に比例します。このコストは、レイヤーがそれらのピクセルにレンダリングされない場合でも発生します。例えば、レイヤーがアンダーレイであり、それより高いレイヤーがそのピクセルに不透明なオブジェクトをレンダリングした場合、あるいはレイヤーがキャプションを表示するものであるのにその時点ではキャプションを付ける対象がない場合などあります。
    CPU/GPUレベル4でのMeta Quest 2の場合、フルスクリーンコンポジターレイヤーには約0.6ミリ秒のコストがかかります。
アプリ開発者がコンポジターレイヤーを作成し、コンポジターレイヤーを削除するのではなく、0アルファのテクスチャーを適用することは一般的です。この場合でも、コンポジターレイヤーのレンダリングにかかるコストは引き続き発生することにご注意ください。
コンポジターレイヤーのコストを把握し、依然としてレンダリングされている「隠れた」コンポジターレイヤーを特定するために、Metaは以下のツールを提供しています。

Meta Quest開発者ハブ

Meta Quest開発者ハブの「パフォーマンスアナライザー」タブには、各コンポジターレイヤーの表示・非表示を切り替えるコントロールや、コンポジターレイヤーのプロパティログの情報をコマンドプロンプトを使わずに表示する機能があります。
詳しくは、レイヤーの表示制御をご覧ください

VrApiログ

VrApi統計定義ガイドで説明されているように、adbインスタンスが接続されている端末で次のコマンドを実行することによって、Questアプリについての詳細なリアルタイムパフォーマンス統計を取得できます。
adb logcat -s VrApi
VrApiの統計出力のうち、コンポジターレイヤーをプロファイリングする開発者に特に関係するのは、次の部分です。
TW=2.80ms,App=1.11ms,GD=0.23ms,CPU&GPU=6.41ms,LCnt=5(DR14,LM2)
  • TW=#は、コンポジターによる消費時間です(この名前はコンポジターが行うTimeWarpに由来します)。この数値には、オーバーレイレイヤーのコストが含まれています。
  • LCnt=#は、コンポジターが組み合わせる別個のレイヤー数です。常に少なくとも1つのレイヤー(アプリのフレームバッファのためのレイヤー)が存在します。追加のレイヤーは、アプリや他のサービス(通知など)からのものになります。
  • LM#は、コンポジター時間節約のためにマージされるレイヤー数です。この数値は、0 (マージなし)か、2以上(1レイヤーにまとめられるレイヤー数)のいずれかです。

コンポジターレイヤーログ

VrApiログによって報告されるレイヤー数が予期しないものである場合、フレームごとに描画されるコンポジターレイヤーのリストが含まれるリアルタイムのログを取得できます。以下のメソッドを使います。
  • ターミナルで、次を実行します: adb shell setprop debug.oculus.logLayers 1
  • アプリを起動して、フレームごとに描画されるコンポジターレイヤーをプロファイリングするポイントまで進めます。
  • ターミナルで、次を実行します: adb logcat -s CompositorClient
上記の手順が完了したら、レンダリングされるフレームごとに、次のような出力が端末に表示されます。
LogLayers: Client 12 (com.Sample.UnityAppSpaceWarp:11432)
  Layer 0:
    Type QUAD
    Flags CLIP_TO_TEXTURE_RECT DIRECT_PROJECTION VIEW_FRUSTUM_CULLING
    Quad translation (0.4137005, -0.091204815, -0.9783828)
    Quad rotation (-0.997699, -9.291795e-10, 0.06780008, -6.314374e-11)
    Quad anchor translation (0, 0, 0)
    Quad anchor rotation (1, 0, 0, 0)
    Quad anchor id 0 version 0
    Quad size (0.4, 0.40000007)
    Corners not rounded
    Corner Rect size (0, 0)
    Corner Rect offset (0, 0)
    ApertureId 134bc4800000000c
    Placement 80
    ColorScale (1, 1, 1, 1)
    ColorOffset (0, 0, 0, 0)
    Src Blend Color BLEND_SRC_ALPHA
    Dst Blend Color BLEND_ONE_MINUS_SRC_ALPHA
    Src Blend Alpha BLEND_SRC_ALPHA
    Dst Blend Alpha BLEND_ONE_MINUS_SRC_ALPHA
    SwapChain[0] : TEXTURE2D : 333 : image 0x7024a248f8 (500 x 500) array index 0
    TextureRect[0] : (0.002, 0.002, 0.996, 0.996)
    SwapChain[1] : TEXTURE2D : 333 : image 0x7024a248f8 (500 x 500) array index 0
    TextureRect[1] : (0.002, 0.002, 0.996, 0.996)
  Layer 1:
    Type PROJECTION
    Flags CLIP_TO_TEXTURE_RECT APP_SPACE_WARP PREMULTIPLIED_WITH_VALID_ALPHA
    Content UNKNOWN id 0
    fov[0] (l:-54, r:40, b:-55, t:44)
    fov[1] (l:-40, r:54, b:-55, t:44)
    ApertureId 134bc4800000000c
    Placement 80
    ColorScale (1, 1, 1, 1)
    ColorOffset (0, 0, 0, 0)
    Src Blend Color BLEND_ONE
    Dst Blend Color BLEND_ONE_MINUS_SRC_ALPHA
    Src Blend Alpha BLEND_ONE
    Dst Blend Alpha BLEND_ONE_MINUS_SRC_ALPHA
    SwapChain[0] : TEXTURE2D_ARRAY : 309 : image 0x7024a24a48 (2016 x 1760) array index 0
    TextureRect[0] : (0, 0, 0.80505955, 1)
    SwapChain[1] : TEXTURE2D_ARRAY : 309 : image 0x7024a24a48 (2016 x 1760) array index 1
    TextureRect[1] : (0.19494048, 0, 0.80505955, 1)
LogLayers: Client 9 (com.oculus.ovrmonitormetricsservice:8465)
  Layer 0:
    Type QUAD
    Flags FIXED_TO_VIEW DISABLE_ALPHA_WRITE NO_AR_CLIP
    Quad translation (-1.4901161e-08, 0.34202012, -0.9396927)
    Quad rotation (1, 0, 0, 0)
    Quad anchor translation (0, 0, 0)
    Quad anchor rotation (1, 0, 0, 0)
    Quad anchor id 0 version 0
    Quad size (0.279375, 0.120000005)
    Corners not rounded
    Corner Rect size (0, 0)
    Corner Rect offset (0, 0)
    ApertureId a469a2e400000009
    Placement ffffffff
    ColorScale (1, 1, 1, 1)
    ColorOffset (0, 0, 0, 0)
    Src Blend Color BLEND_ONE
    Dst Blend Color BLEND_ONE_MINUS_SRC_ALPHA
    Src Blend Alpha BLEND_ONE
    Dst Blend Alpha BLEND_ONE_MINUS_SRC_ALPHA
    SwapChain[0] : TEXTURE2D : 241 : image 0x6f833cd4f8 (298 x 128) array index 0
    TextureRect[0] : (0, 0, 1, 1)
    SwapChain[1] : TEXTURE2D : 241 : image 0x6f833cd4f8 (298 x 128) array index 0
    TextureRect[1] : (0, 0, 1, 1)
出力には、オーバーレイレイヤーが前面から背面へ描画された順序でリストされます。このサンプル出力には、次のことが示されています。
  • まず、com.Sample.UnityAppSpaceWarpは500x500のクワッドをレンダリングします。これは、シーン内に配置されたOVROverlayCanvas要素に対応し、Max Texture Sizeは500です。
  • 次に、com.Sample.UnityAppSpaceWarpは 2016x1760 アイバッファ(PROJECTION)をレンダリングします。これは、アプリのメインレンダリングパスが表示されるメインレイヤーです。このレイヤーは、アプリSpaceWarp固有のパス(SPACE_WARP)を使うことによっても処理されます。
  • 最後に、com.oculus.ovrmonitormetricsserviceは298 x 128のヘッドロック(FIXED_TO_VIEW)テクスチャーをクワッドにレンダリングします(これは指標HUDです)。

コンポジターレイヤープロパティログ

入力テクスチャーが低解像度の場合、コンポジターオーバーレイがぼやけて表示されることがあります。以下のメソッドにより、コンポジターレイヤーのテクスチャー解像度や、おすすめの変更内容に関するリアルタイム情報を得ることができます。
  • adbインスタンスが接続されている端末で、adb shell setprop debug.oculus.sysPropDebug 1コマンドを実行します。
  • ヘッドセットの電源ボタンをダブルタップして、ヘッドセットをスリープ状態にしてから、再度それを起動します。これによりいくつかのサービスが再起動します。これは、それ以前のプロパティが保たれるようにするために必要です。
  • adb shell setprop debug.oculus.layerProperties 1を実行します。
  • アプリを起動して、フレームごとに描画されるコンポジターレイヤーをプロファイリングするポイントまで進めます。
  • adb logcat -s CompositorVRを実行します。
上記の手順が完了したら、毎秒、次のような出力が端末に表示されます。
CLP: Eye:Right LayerType:Quad PanelVisiblity:Visible DevicePPD:20.67 LayerRenderedPPD:23.71 Texture Resolution:512.00x128.00 Recommended Texture Resolution:446.43x111.61 Recommend Apply:None
CLP: Eye:Left LayerType:Quad PanelVisiblity:Visible DevicePPD:20.67 LayerRenderedPPD:24.81 Texture Resolution:512.00x128.00 Recommended Texture Resolution:426.48x106.62 Recommend Apply:None
CLP: Eye:Right LayerType:Quad PanelVisiblity:Visible DevicePPD:20.67 LayerRenderedPPD:10.97 Texture Resolution:300.00x300.00 Recommended Texture Resolution:565.27x565.27 Recommend Apply:Sharpening
CLP: Eye:Left LayerType:Quad PanelVisiblity:Visible DevicePPD:20.67 LayerRenderedPPD:10.89 Texture Resolution:300.00x300.00 Recommended Texture Resolution:569.17x569.17 Recommend Apply:Sharpening
この出力には、次のことが示されています。
  • CLP: コンポジターレイヤーのプロパティ。これは、出力を検索するための任意の文字列です。
  • Eye: LeftまたはRightのいずれか。この出力の時点でどのアイバッファがレンダリング中かを示します。
  • DevicePPD: VRヘッドセットの1度当たりのピクセル数。Meta Quest 2では20.67 PPDです。これは、片目当たり1832×1920のディスプレイ全体で約89×93度のFOvということです。
  • LayerRenderedPPD: ワールド内でレンダリングされる際の、コンポジターレイヤー図形1度当たりの(このコンポジターレイヤーの入力テクスチャーの)ピクセル数。
  • Texture Resolution: このコンポジターレイヤーの入力テクスチャーの解像度
  • Recommended Texture Resolution: このコンポジターレイヤーの入力テクスチャーの理想的な解像度。この解像度にすると、このコンポジターレイヤーを現在の図形および変換によりレンダリングする場合、入力テクスチャーの各ピクセルが、VRヘッドセット内でレンダリングされるピクセル1個に対応します。
  • Recommend Apply: SharpeningSuperSamplingNoneのうちのいずれか。これらのアルゴリズムについて詳しくは、コンポジションレイヤーフィルタリングをご覧ください。テクスチャーが小さすぎたり大きすぎたりする場合の表示品質をそれぞれシャープ化とスーパーサンプリングによって改善することは可能ですが、可能なら推奨解像度で入力テクスチャーを提供するほうが賢明です。

コンポジターレイヤーオーバーレイ

次のコマンドで、ビルトインのオーバーレイを有効にして、各コンポジターレイヤーの位置をリアルタイムで可視化することができます。(ワンクリックアプリケーションの場合は、Meta Quest開発者ハブのカスタムコマンドを使えます。)
adb shell setprop debug.oculus.sysPropDebug 1 && adb shell input keyevent "KEYCODE_POWER" && adb shell input keyevent "KEYCODE_POWER" && adb shell setprop debug.oculus.visualizeLayers 1
コマンド動作
setprop debug.oculus.sysPropDebug 1
システムツールのデバッグ経路を有効にします。
input keyevent "KEYCODE_POWER"
Meta Questヘッドセットの電源ボタンの長押しと同じです。これを再び行うとヘッドセットが再起動し、OSが新しいバッファを設定してオーバーレイを表示できるようにします。
setprop debug.oculus.visualizeLayers 1
コンポジターレイヤーを対照的な色でレンダリングするシステムオーバーレイを有効にします。
上記の手順が完了すると、ヘッドセット内に次のような色付きオーバーレイが表示されます。 Colored Compositor layer overlays
どのコンポジターレイヤーも、アプリの上に境界線の色が違う半透明オーバーレイをレンダリングします。このサンプル画像に示されているアプリには3つのレイヤーがあります。オレンジ色のメインレイヤー、緑色のアンダーレイ、そして水色のオーバーレイです。レイヤーごとに使う色は任意であり、色自体に何か意味があるわけではありません。
このツールは、アクティブに使われていない大規模コンポジターレイヤー(現在非表示の字幕やメニューなど)を特定するのに最適です。そのようなコンポジターレイヤーはパフォーマンスを著しく低下させかねません。
デバッグが終わったら、次のコマンドを実行してモーションベクトルバッファのレンダリングを停止してください。(Meta Quest開発者ハブのカスタムコマンドでも構いません。)
adb shell setprop debug.oculus.sysPropDebug 0 && adb shell setprop debug.oculus.visualizeLayers 0 && adb shell input keyevent "KEYCODE_POWER" && adb shell input keyevent "KEYCODE_POWER"
ナビゲーションロゴ
日本語
© 2026 Meta