オクルージョン
更新日時: 2024/09/11
場合によって、仮想コンテンツをユーザーの周りの現実空間に自然に溶け込ませる必要性が生じます。仮想キャラクターがいる場合、そのキャラクターが後ろの現実世界のオブジェクトをブロックしたり遮断したりすること、そして、キャラクター自体が前方の現実世界のオブジェクトに遮断されることを望むでしょう。この機能はパススルーSDKでは提供されておらず、パススルーSDKのレイヤーはアプリレイヤーの後ろ(
パススルーARモード)、またはアプリレイヤーの前(レイヤーの
配置が
オーバーレイに設定されている場合)のいずれかでレンダリングされます。
Meta Questプラットフォームでは、アプリ内で自然なオクルージョンを実現するためのさまざまな方法を提供しています。
Quest 3以降、Depth APIはアプリにリアルタイムの奥行きマップを提供できるようになっています。この情報を基に、現実感のあるダイナミックなオクルージョンを実装して、パススルー内で現実世界のオブジェクトが仮想オブジェクトを遮るようにすることができます。機能の詳細およびアプリへの実装方法については、Depth APIの
オクルージョン機能を参照してください。
Depth APIは強力なツールですが、制限もあります。アプリでのCPUやGPUの使用に関してコストがかかりすぎたり、リアルタイムの奥行き情報のレイテンシーに不満を覚えたりするかもしれません。また、シェーダーの変更が必要となる場合には、Unityプロジェクトへの統合が複雑になる可能性もあります。さらに、Meta Quest 2などの旧バージョンのMeta Questヘッドセットでも操作するオクルージョンが必要になることもあるでしょう。
トラッキングされた現実世界のオブジェクトのオクルージョン
現実世界のオブジェクトの形状と位置にアクセスできる場合は、それを使って仮想コンテンツのオクルージョンが可能です。例えば、トラッキングされている手を使って仮想の照明スイッチなどの仮想シーンをオクルージョンし、手がパススルーとして表示されるようにすることができます。
奥行きバッファにのみ書き込みを行うマテリアルを使って、手またはオクルーダーを他のオブジェクトより前にレンダリングします(レンダリングキュー < 2000)。それより後の仮想オブジェクトまたはマテリアルは深度テストに失敗し、オクルーダーの領域にはレンダリングされません。それにより、オクルーダーより向こう側にあるかのように見えることになります。
パススルーとVRの間のレイヤー処理は、VRオブジェクトとパススルーオクルーダーを交替させたり、ZTest/ZWriteシェーダーのさまざまなコマンドを利用したりして、いくらでも複雑なものにできます。例えば、バーチャルウォッチは、時計の3Dモデルをさらに低いレンダーパイプラインでレンダリングすることで、透過する手や手首の上に描画され、手のレンダリングを遮断します。または、ZTestを無効にして手を遮断するオブジェクトとして無視させることもできます。
オクルージョンのこのアプローチは、メッシュ全体にわたる場合にのみ動作しますので、これは全面的に不透明なソリューションになります。半透明が可能なソフトマスキングの場合、
SelectivePassthroughサンプルの中に、使うことのできるマテリアルとシェーダーが含まれています。
特に手については、さまざまなMR環境における手のインタラクションを改善するための方法がほかにも存在します。これらのソリューションは、Interaction SDKとパススルーを組み合わせて使用しており、特定のインタラクションタイプに合わせて手の表現を調整できます。詳細については、
手の表現をご覧ください。