本日は昨日に引き続きHoloLensで床や壁に穴をあけていきます。
〇HoloLens 2022年アドベントカレンダー
HoloLens 2022年アドベントカレンダーはQiita上で私の師であるがち本さんが開催している企画です。
クリスマスまで毎日記事を埋めていくことが目的で本日は6日目の記事になります。
前回はSpatialMeshのシェーダーをMixedRealityGraphicsTools(MRGT)で提供されているシェーダーに置き換えていきました。
今回はSpatialMeshのマテリアルからステンシルの機能を使用してきます。
〇壁の中のみに存在するオブジェクトを作る
床や壁に穴をあける前に前回GraphicsToolsStandardShader(以下MRGTシェーダー)で模倣したSpatialMeshのマテリアルのテストを行います。
前回作成したSpatialMeshのマテリアルのパラメータからEnable Stencil Testingを有効化してステンシルの機能を使用してきます。
また今回テストcube(豆腐)にもステンシルを有効にしたMRGTシェーダーを使用しています。
〇SpatialMeshのマテリアル
今回実装している中でZWrite(深度バッファへの書き込み)とステンシルの併用ができないことがわかり筆者自身の理解が浅い部分があったためZWriteをオフにしています。
ステンシルの設定は次の通りです。
・StencilReference =1 (ステンシルバッファの値です)
・Stencil Comparison = Always (ステンシルを常に比較します。)
・Srencil Operation = Replace (比較したステンシル値でピクセル色を置換します。)
〇描画される壁の中のオブジェクトのマテリアル
・Stencil Reference = 1 (SpatialMeshのマテリアルと同値にしています。)
・Stencil Comparison = LessEqual (ステンシル値が1>=の場合比較されます。)
・Stencil Operation = Keep (比較したステンシル値でピクセルを維持します。)
これによって壁のオブジェクトを通して豆腐を見た場合に比較、置換され豆腐が描画されるようになります。
〇実機で確認
壁の中のみに存在する豆腐を確認できました。(今回は実機とUntiyをHoloGraphicsRemotingで接続して確認しています。)
〇問題点
今回SpatialMeshに穴をあける一環としてステンシルを使用して壁の中のオブジェクトのみを表示することができましたが、問題点としてZWriteをオフにすることで深度判定ができなくなり本来のSpatialMeshとしてのOcclusionが機能しなくなりました。
うーん失敗ですね。
次回改善策を考えていきます。