本日はHoloLens表現枠です。
〇HoloLens 2022年アドベントカレンダー
HoloLens 2022年アドベントカレンダーはQiita上で私の師であるがち本さんが開催している企画です。
クリスマスまで毎日記事を埋めていくことが目的で本日は7日目の記事になります。
〇HoloLensで床や壁に穴をあける
前回は壁の中にオブジェクトが存在するようにはできましたが、問題点としてSpatialMesh自体のマテリアルにステンシル値とZWriteを併用して使用することができないことがあり、ZWriteをオフにすることでOcclusionとしての背部にあるオブジェクトを描画しないという機能が使用できなくなります。
今回は前回の反省を生かし次のように実装していきます。
①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の機能をオフにすることで解消されます。
Render Queue Overrideを1998に設定することでポータルと描画されるキューブはSpatialMeshよりも手前に描画されるためSpatialMeshと干渉しないような仕組みが完成しました。
〇実機で確認
実機でも動作を確認できました。今回はテストのためポータルとキューブ以外を配置していませんでしたが、ポータルのフレームでSpatialMeshのOcclusionが機能していることも確認できます。
いよいよ機能自体が完成しました。