VRコンポジターレイヤーを使用する
更新日時: 2024/12/17
このガイドでは、Unityアプリにコンポジターレイヤーを実装する方法について説明します。コンポジターレイヤーの仕組みとデバッグ方法については、
コンポジターレイヤー を参照してください。
OVROverlayはコンポジターレイヤーを使用可能にするスクリプトで、Oculus/VR/Scriptsフォルダーに入っています。
OVROverlayは、1つのシーンで最大15層のレイヤーをサポートします。ただし、各シーンに複数のシリンダーを含めることはできず、複数のキューブマップレイヤーを含めることもできません。コンポジターレイヤーがレンダリングに失敗した場合は、クワッドのみがフォールバックし、シーンジオメトリとしてレンダリングされます。キューブマップとシリンダーは全く表示されません。一般的な例としては、コンポジターレイヤーの上限を超える数のレンダリングが試みられる場合があります。15個を超えるオブジェクトをサポートする必要がある場合は、平面要素を1つのRenderTextureに結合して1つのOVROverlayレイヤーを使用できます。
オーバーレイレイヤーまたはアンダーレイレイヤーを追加する Unityエディターの階層ビューで、空のGameObjectを作成します。 Packages/com.meta.xr.sdk.core/Scripts/OVROverlay.cs
にあるOVROverlayスクリプトをGameObjectにドラッグします。
注 : OVROverlayはOVRManagerを使用します。
OVROverlayスクリプトには複数の構成設定が含まれています。
オーバーレイのタイプを選択します。使用できるオプションは、[Overlay(オーバーレイ)]、[Underlay(アンダーレイ)]、[None(なし)]です。
[Overlay(オーバーレイ)] がデフォルトのタイプです。これは、アイバッファの前にレンダリングされます。[Underlay (アンダーレイ)] は、アイバッファの後ろにレンダリングされます。[Underlay (アンダーレイ)]コンポジターレイヤーは、アンダーレイが見えるように、コンポジターがアイバッファにアルファマスクで穴を開ける必要があるため、帯域幅を多く消費します。テクスチャー帯域幅はVRのボトルネックとなることが多いため、慎重に使用し、アプリへの影響を確実に評価してください。[None(なし)] は、レイヤーを非表示にします。Composition Depth (コンポジションの深度) は任意の機能で、レイヤーの深度を設定するものですが、デフォルトでは無効になっています。シーンのレイヤーの順序を決定するために使用されます。2つのレイヤーを比較する際、compositionDepthに小さい値を設定したオーバーレイ/アンダーレイは、compositionDepthにより大きな値を設定したオーバーレイ/アンダーレイより前に合成されます。たとえば、オーバーレイとアンダーレイがたくさんあるシーンは、次のようになります。
[カメラ] (オーバーレイ) 2 / 1 / 0 [アイバッファ] -1 / 0 / 1 (アンダーレイ)
特定のレイヤーでコンポジションの深度テストを有効にするには、[Enable Depth Buffer Testing (深度バッファテストを有効にする)] チェックボックスを選択します。
この機能は、画面オーバーレイのロードや一時停止などの状況で役立ちます。この機能が特定のレイヤーで有効になっていない場合、OVROverlayレイヤーは常にシーンの最前面にレンダリングされます。
注 : あるオブジェクトがオーバーレイとして実装されていてコンポジションの深度を無視する選択をすると、(カメラからの距離の点では)本来そのオブジェクトは別のオブジェクトの後ろにあるべきなのにそれより前に描画されてしまう可能性があります。これは、これらのオブジェクトの深度について相反する合図を送ることになり、見る人にとっては不快な場合があります。
オーバーレイレイヤーの形状を選択します。
[Quad (クワッド)] レイヤーは、4つの頂点を持つ平面のテクスチャーです。一般的に、シーンにテキストや情報を表示するパネルとして使用されます。
[Cubemap(キューブマップ)] レイヤーは、6つの正方形を含むテクスチャーで、オブジェクトを囲む立方体を形成します。一般的に、シーンの反射や背景/周囲の描写に使用されます。オーバーヘッドの少ない読み込み中のシーンや開始シーンにも使用できます。キューブマップの詳細については、「
キューブマップのスクリーンショット 」ページを参照してください。
[Cylinder(シリンダー)] レイヤーは、カメラの周りを円筒状にラップした1つのテクスチャーです。一般的に、曲線UIインターフェイスに使用されます。
[Equirect(正距円筒)] レイヤーは、球状にラップし、ユーザーの視界を取り囲むように投影する1つのテクスチャーです。一般的に、360度/180度方位の動画の再生に使用されます。
[Offcenter Cubemap(オフセンターキューブマップ)] レイヤーは、中心点がz軸上で30度前方に移動するキューブマップです。これにより、ユーザーの前により高品質な(ピクセル数が多い)描画を実現できます。
[Fisheye(フィッシュアイ)] は、フィッシュアイ画像を表示するようにOVROverlayを設定します。変換の設定を調整して、[Fisheye(フィッシュアイ)]レイヤーの[FovX]、[FovY]、[Horizon(水平線)]、[Meridian(子午線)]を変更できます。
Position X: フィッシュアイの子午線を調整します。これは画像中央の横方向右手オフセット(度数)です。 Position Y: フィッシュアイの水平線を調整します。これは画像中央の縦方向のオフセット(度数)です。 Scale X: フィッシュアイの横方向のFOV(度数)を調整します。 Scale Y: フィッシュアイの縦方向のFOV(度数)を調整します。 Rotation X, Y, Z (回転X、Y、Z): レイヤーのヨー、ピッチ、ロールを調整します。 Meta Questディスプレイ用に調整されたGPUハードウェアバイキュービックフィルタリングを有効にすることにより、VRイマジェリーを表示する際の信頼性を向上できます。Meta Quest向けに開発している場合、システムはデフォルトのバイリニア補間法にフォールバックするため、古いデバイスを特別扱いすることなく、バイキュービックフィルタリング機能を使うことができます。
バイキュービックフィルタリングを有効にするには、[Bicubic Filtering (バイキュービックフィルタリング)] チェックボックスを選択します。 注 : バイキュービックフィルタリングでは、カーネルフットプリントが増加するため、必要なGPUリソースが多くなります。これは特にトリリニアミニフィケーションの場合に当てはまります。それには異なるmipレベルからの2つのバイキュービック計算が必要になるからです。コンポジターレイヤーのために直接使用した場合、GPUコストの増加がコンポジションのタイミングに影響し、そのためにフレーム落ちが発生したりVRエクスペリエンスに悪影響を及ぼしたりする可能性があります。最適なVRユーザーエクスペリエンスを提供するために、視覚的な忠実度と必要なGPUリソースのバランスを考慮してください。
コンポジションレイヤーの画質を向上させるには、コンポジションレイヤーフィルタリングを有効にします。レイヤーフィルタリングのメソッドは、Quest表示光学システムに合わせて調整されたスーパーサンプリングをサポートしています。
スーパーサンプリング(左)を有効にすると、コンポジターによって表示解像度にマッチするようにアンダーサンプリングされたレイヤーの、高コントラストエッジのちらつき(右)が軽減されます。
シャープ化すると高コントラストエッジの明瞭さは向上しますが、その反作用として、表示解像度に合うようにアップサンプリングするとぼやける場合があります。
自動フィルタリングを有効にすると、レイヤーは最高の視覚品質でレンダリングされ、画面のティアリングなどの好ましくないアーティファクトを防止します。このモードでは、ランタイムは有益な場合にのみ、選択されたスーパーサンプリングとシャープネスフィルタを自動的に適用します。例:
レイヤーのぼやけを軽減するためにシャープネスフィルターが適用されます。 ちらつきを軽減するために、スーパーサンプリングフィルターが適用されます。 レイヤーにフィルタリングが必要ない場合、自動フィルタリングを選択しても操作は行われず、パフォーマンスへの影響はありません。
自動フィルタリングは、レイヤーのサイズ変更や3D空間でのプレイヤーの移動など、レイヤーとの動的かつ複雑な相互作用を考慮します。さらに、レイヤーをフィルタリングする前に、以下のパラメータを考慮します。
レイヤーの1度あたりのレンダリングピクセル数。 ディスプレイの1度あたりのハードウェアピクセル数。 GPU使用率。 レイヤーの可視性。 レイヤーフィルタリングを有効にする
スーパーサンプリングやシャープネスを有効にするには、ドロップダウンメニューの[Super Sample (スーパーサンプル)] または[Sharpen (シャープネス)] から通常または高価なオプションを選択します。高価なバリエーションは計算コストが高く、アプリケーションに追加のGPU容量がある場合にのみ適用すべきです。
重要: コンポジションレイヤーフィルタリングでは、より多くのGPUリソースが必要です。これは、より大きなカーネルフットプリントを使用するシャープ化とスーパーサンプリングのアルゴリズムでは特に顕著です。これらのアルゴリズムをコンポジションレイヤーに対して直接使用すると、必要なGPUリソースが増え、コンポジションタイミングに影響します。結果的に、フレーム落ちしたり、VRエクスペリエンスにネガティブな影響を及ぼしたりする可能性があります。結論として、コンポジションレイヤーフィルタリングを使用する場合は、最適なVRユーザーエクスペリエンスを提供するため、視覚的な忠実度と必要なGPUリソースのバランスを考慮してください。あるいは、不要なフィルタリングのリスクを軽減するために、自動フィルタリングモードを使用することもできます。GPUリソースが限られている場合、自動フィルタリングによりパネルの品質が滑らかに低下します。
自動フィルタリングを有効にする
自動フィルタリングを有効にするには、[Auto Filtering (自動フィルタリング)] チェックボックスを選択し、フィルターのドロップダウンメニューから通常または高価なフィルターのいずれかを選択します。例えば、アプリが高価なシャープニングの変形と通常のスーパーサンプリングの変形を選択した場合、オートフィルタリングは、必要な場合にのみ、選択されたフィルターでレイヤーをフィルタリングします。
オーバーレイレイヤーにレンダリングするテクスチャーを関連付けます。デフォルトオプションの[なし (None)] のままにした場合、renderer.materialメインテクスチャーが利用可能であれば、それが使用されます。
Dynamic texture (動的テクスチャー) オーバーレイにレンダリングされるコンテンツを動的にする場合、つまりオーバーレイが持続している間にテクスチャーを各フレームで更新する必要があるときに選択します。このチェックボックスは、rendertextureがレイヤーに関連付けられている場合に自動的にオンになります。
Is Protected Content (保護コンテンツである) RiftではHDCPで、Meta QuestではL1 Widevine DRMでレイヤーを保護する場合に選択します。
Meta Questの場合 : ヘッドセットでのサポートを有効にするには、OVROverlayレイヤーを外部サーフェスとしてレンダリングして、[Player Settings (プレイヤー設定)] > [Virtual Reality (バーチャルリアリティ)] > [Oculus]で[Is Protected Content (保護コンテンツである)] を選択する必要もあります。
Is External Surface (外部サーフェスである) [Is External Surface (外部サーフェスである)] チェックボックスを選択すると、外部の
Android Surface からテクスチャーまたは動画をパススルーするためにそのレイヤーが使用されます。
この機能によって、Android Surfaceを作成し、タイムワープレイヤーでそれを管理できるようになります。Unityプロジェクトでは、クワッドオーバーレイを作成し、Surfaceテクスチャーを直接TimeWarpレイヤーにレンダリングできます。サーフェステクスチャーのレンダリングについて詳しくは、
アニメーション付きの読み込み中画面 テクニカルノートをご覧ください。
外部サーフェスの幅 と外部サーフェスの高さ を使用して、出力のサイズを定義します。
Use Default Rects (デフォルトの長方形を使用する) [Cylinder (シリンダー)]または[Offcenter Cubemap (オフセンターキューブマップ)]レイヤーを選択すると、左右両方のイメージで構成される単一のインプットテクスチャーを定義できます。テクスチャーを[Left Texture(左テクスチャー)] に設定します。両方の目に同じテクスチャーを設定しないでください。
このボックスのチェックを外すと、[Source Rect(ソースレクト)] ダイアログが開き、同じインプットテクスチャーに左右のテクスチャーをどう配置するかを定義できます。[Monoscopic (モノスコピック)]、[Stereo Left/Right (ステレオ左/右)]、[Stereo Top/Bottom (ステレオ上/下)]のプリセットがあり、すばやく選択できます。
Override Color Scale (カラースケールをオーバーライドする) レイヤーのグローバルカラー設定をオーバーライドします。[Override Color Scale (カラースケールをオーバーライドする)] チェックボックスをオンにして、[Color Scale (カラースケール)] と[Color Offset (カラーオフセット)] の入力を設定します。
アンダーレイは、レンダリングターゲットのアルファチャネルに依存します。アンダーレイを追加するには、以下の手順を実行します。
アンダーレイを遮るシーンオブジェクトが完全に不透明である場合は、
[Color (色)] ウィンドウでアルファ値を1に設定します。オクルーダーが透明(すなわちアルファ値が0<1)である場合は、
Packages/com.meta.xr.sdk.core/Resources/
から
Underlay Transparent Occluder.shader
を使用します。
注 : オーバーレイでは、透明度に関する特別な処理は必要ありません。
すべてのオブジェクトがアイバッファに描画されたら、テクスチャーに穴を開けます。 デルタ空間に偽物を描画するには、Underlay Impostor.shader
からPackages/com.meta.xr.sdk.core/Resources/
を使用します。この操作は必ず、不透明なテクスチャーがすべて描画された後、アルファの処理を行う前に行ってください。こうすることで、アンダーレイは空の空間越しに表示されます。 次の例では、シーンジオメトリのほとんどがアイバッファにレンダリングされます。アプリは、視線カーソルをクワッドオーバーレイとして追加し、スカイボックスをシーンの背後のキューブマップアンダーレイとして追加します。
アイバッファのドット部分に注意してください。OVROverlayが穴を開けて、キューブマップアンダーレイをシーンジオメトリの背後に表示していることを示しています。
シーン内のキューブマップが透明であるかどうかを確認してください。透明である場合は、アルファ値が1未満のアンダーレイに必須であるOVRUnderlayTransparentOccluder
を使用します。立体視である場合は、2つのテクスチャーを指定し、サイズを2に設定します。
シリンダーオーバーレイのゲームオブジェクトの中心は、シリンダーの中心として使用されます。シリンダーの寸法は、次のようにtransform.scale
にエンコードされます。
[scale.z]シリンダーの半径 [scale.y]シリンダーの高さ [scale.x]シリンダー円弧の長さ シリンダーオーバーレイを使用するには、カメラをシリンダーの内接球の中に配置する必要があります。カメラが内接球の表面に近づくと、オーバーレイがフェードアウトします。シリンダーの半分のみが表示されるため、円弧の角度は180度より小さくなければなりません。
オフセンターのキューブマップコンポジターレイヤーは、キューブマップサンプリング座標をオフセットすることで、関心領域/可視領域の解像度を上げるのに役立ちます。このレイヤーは、標準のキューブマップコンポジターレイヤーに似ています。
OVROverlayスクリプトを空のゲームオブジェクトに添付し、[Position Transform(位置変換)]フィールドでテクスチャー座標オフセットを指定します。詳細については、Unityスクリプト記述リファレンスのOVROverlayを参照してください。
ワールドロックされたレイヤーとヘッドロックされたレイヤー
ほとんどの場合、オーバーレイレイヤーはワールドロックされています。つまり、レイヤーの背後にあるワールドを基準に位置を維持しています。
ワールドロックされたオーバーレイでは、非オーバーレイコンテンツと同様にTimeWarpを使用しており、表示の揺れが発生しにくくなっています。 ヘッドロックされたオーバーレイはTimeWarpをバイパスし、ヘッドの動きを正確にフォローします。例外は、視線カーソルやターゲットレチクルなどの小さなUI要素です。 オーバーレイはデフォルトでワールドにロックされています。ヘッドロックされたオーバーレイを作成するには、レイヤー(通常はクワッド)をOVRCameraRig
センターアイアンカーの子にします。
コンポジターレイヤーとさまざまなOVROverlay機能の一般的な使用事例をいくつか紹介します。
動画再生アプリにおいて、Unityで通常行うアイバッファへのレンダリングではなく、コンポジターレイヤーを使用することは極めて重要です。
OVROverlayを使用して高品質の動画を表示するには、次の2つの方法があります。
ゲーム内でレンダリングまたは作成されるオーバーレイレイヤー上で動画を再生するには、[Use Default Rects(デフォルトの長方形を使用する)] 機能をオーバーライドします。こうすることで、1つのテクスチャーをレンダリングすることができ、2つのテクスチャーを高解像度でレンダリングするコストを節約できます。 高品質の外部動画を再生するには、[Is External Surface (外部サーフェスである)] 機能を使用して、Androidプラグインで外部動画をコンポジターに直接フィードします。 2つのOVROverlayレイヤーを使用して、軽量の読み込み中画面を追加できます。
読み込み中画面の背景となるキューブマップレイヤーを追加します。これを空白のままにしておくと、黒い空間が表示されます。 別のオーバーレイレイヤー(通常はシンプルなクワッドレイヤー)を、空間を読み込み中であることを示すテクスチャーまたはテキストとともに追加します。 視線カーソルやターゲットレチクル(または類似の機能)を追加するには、OVROverlayクワッドをOVRCameraRig
センターアイアンカーの子としてシーンに追加します。