夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

HoloLensで床や壁に穴をあける。 その③ 機能の完成 HoloLensアドベントカレンダー2022年 7日目

本日はHoloLens表現枠です。

〇HoloLens 2022年アドベントカレンダー

 HoloLens 2022年アドベントカレンダーはQiita上で私の師であるがち本さんが開催している企画です。

 クリスマスまで毎日記事を埋めていくことが目的で本日は7日目の記事になります。

qiita.com

〇HoloLensで床や壁に穴をあける

前回は壁の中にオブジェクトが存在するようにはできましたが、問題点としてSpatialMesh自体のマテリアルにステンシル値とZWriteを併用して使用することができないことがあり、ZWriteをオフにすることでOcclusionとしての背部にあるオブジェクトを描画しないという機能が使用できなくなります。

redhologerbera.hatenablog.com

今回は前回の反省を生かし次のように実装していきます。

①SpatialMeshのマテリアルはいじらない

②ステンシルを使用しポータルを作成、この際にSpatialMeshより手前に描画されるようにする。

SpatialMeshよりもステンシルで描画されるオブジェクトが先に描画されれば問題ないと考えました。

①空オブジェクトPortalを作成し、子オブジェクトとしてPlane一枚、そしてステンシルのポータルとして使用した場合透明のためポータルの境界がわかるようにフレームとしてのCubeを配置しました。

②ポータルとなるPlaneにMRGTシェーダーを適応します。

パラメータとしては次の通りです。

・RenderingMode=Custom

・Mode=Fade

・DepthWrite=Off

ステンシルのパラメータ

・Stencil Reference= 1

・Stencil Comparison=Always(常にステンシル値を比較する)

・Stencil Operation=Replace(ステンシル値による操作としてピクセル色を置換する)

また最重要な項目としてRender Queue Overrideの値を1998に設定しています。

これはレンダリングの順番の機能ですがSpatialMeshのマテリアルが1999であるためSpatialMeshよりも手前に描画されるように設定しました。

③Cubeを作成し、MRGTシェーダーのマテリアルを適応します。

マテリアルのパラメータは次のようになります。

・Render Queue Override=1998

ステンシルのパラメータは次の通りです。

・Stencil Reference =1

・Stencil Comparison=LessEqual

・Stencil Operation=Keep

 これによってポータルを通してのみキューブを見ることができるようになります。

 また、一部の角度でSpecular Highlightsの機能を使用している場合描画がおかしくなる現象がありました。

Specular Highlightsがオン

Specular Highlightsをオフ

Specular Highlightsの機能をオフにすることで解消されます。

Render Queue Overrideを1998に設定することでポータルと描画されるキューブはSpatialMeshよりも手前に描画されるためSpatialMeshと干渉しないような仕組みが完成しました。

〇実機で確認

実機でも動作を確認できました。今回はテストのためポータルとキューブ以外を配置していませんでしたが、ポータルのフレームでSpatialMeshのOcclusionが機能していることも確認できます。

youtu.be

いよいよ機能自体が完成しました。