MRが楽しい

MRやVRについて学習したことを書き残す

Quest3で現実空間との境界部分を強調表示させる

本日はMetaQuest3の小ネタ枠です。
Quest3で現実空間との境界部分を強調表示させてみたので記事に手法を残します。

前提条件

以下の記事を参考に、Quest3でのオクルージョン表示を有効にしたプロジェクトを作成してください。
bluebirdofoz.hatenablog.com

現実空間との境界部分を強調表示する

前提条件の記事でカスタマイズしたシェーダを修正し、境界部分が強調表示されるようにします。
オクルージョン用のシェーダは以下に保存されています。

Packages/DepthAPI/Runtime/Core/Shaders/EnvironmentOcclusion.shader

本シェーダファイルの META_DEPTH_OCCLUDE_OUTPUT_PREMULTIPLY_WORLDPOS 定義で敷居値を用いたオクルージョンの実装方法が確認できます。

#define META_DEPTH_OCCLUDE_OUTPUT_PREMULTIPLY_WORLDPOS(posWorld, output, zBias) \
    float occlusionValue = META_DEPTH_GET_OCCLUSION_VALUE_WORLDPOS(posWorld, zBias); \
    if (occlusionValue < 0.01) { \
      discard; \
    } \
    output *= occlusionValue; \

今回はPackage配下のシェーダファイルを直接編集せず、MRTKのスタンダードシェーダに更に手を加えました。

// META_DEPTH_OCCLUDE_OUTPUT_PREMULTIPLYを使用する箇所を変更する
//META_DEPTH_OCCLUDE_OUTPUT_PREMULTIPLY(i, output, 0.0);
// 境界部分を赤色強調表示するため、以下のようにコードを修正する
float occlusionValue = META_DEPTH_GET_OCCLUSION_VALUE_WORLDPOS(i.posWorld, 0.0); // 境界値を取得(0.0が隠蔽部分、1.0が通常表示)
if (occlusionValue < 0.01) {
    discard; // 完全な隠蔽部分は描画しない
}
float inversion = 1.0 - occlusionValue; // 境界部分の強調度合い(隠蔽部分に近いほど強調表示する)
float emphasis = output.r + ((1.0 - output.r) * inversion); // 赤色の元値に強調度合いを足し合わせる
output = fixed4(emphasis, output.g * occlusionValue, output.b * occlusionValue, output.a); // 計算後の色を返す


ビルドと動作確認

これで設定は完了です。
以下の記事を参考にプロジェクトのビルドとQuest3へのデプロイを実行してください。
bluebirdofoz.hatenablog.com

以下の通り、現実空間との境界部分を赤色で強調表示させることができました。

あくまでオクルージョンの境界を強調表示しているのみなので、現実空間との接触部分が強調表示されている訳ではない点に注意してください。
接触部分の強調表示を行う方法も別途調査してみます。