MRが楽しい

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

MRTKv2.xを使ってMetaQuest3向けのUnityプロジェクト作成を行う その29(TextMeshProのシェーダをオクルージョンに対応させる MetaXRSDKv67以降)

本日はMetaQuest3の技術調査枠です。
MRTKv2.xを使ってMetaQuest3向けのUnityプロジェクト作成を行う手順を記事にします。
本記事はMetaXRSDKv67以降でTextMeshProのシェーダをオクルージョンに対応させる手順です。

前提条件

本記事では以下の記事で作成したUnity プロジェクトを基に設定を行います。
bluebirdofoz.hatenablog.com

TextMeshProのシェーダをオクルージョンに対応させる

独自のシェーダをオクルージョンで利用する場合、シェーダコードにいくつかの修正を加える必要があります。
シェーダの修正手順は以下のReadMeに解説されています。
github.com

TextMeshProのシェーダは以下のフォルダにインポートされています。

Assets/TextMeshPro/Shaders

今回はサンプルとしてTMP_SDF.shaderとTMP_SDF-Mobile.shaderを変更します。

TMP_SDF.shader

125行目と133行目に以下を追加します。

// DepthAPI Environment Occlusion
#pragma multi_compile _ HARD_OCCLUSION SOFT_OCCLUSION
#include "Packages/com.meta.xr.sdk.core/Shaders/EnvironmentDepth/BiRP/EnvironmentOcclusionBiRP.cginc"

160行目と177行目に以下を追加します。

META_DEPTH_VERTEX_OUTPUT(6) // the number should stand for the previous TEXCOORD# + 1
// v.vertex (object space coordinate) might have a different name in your vert shader
META_DEPTH_INITIALIZE_VERTEX_OUTPUT(output, input.position);

250行目に以下を追加します。

UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);

320行目を以下に変更します。

// Final lighting mix.
fixed4 output = faceColor * input.color.a;
// Third field is for environment depth bias. 0.0 means the occlusion will be calculated with depths as they are.
META_DEPTH_OCCLUDE_OUTPUT_PREMULTIPLY(input, output, 0.0);

return output;


TMP_SDF-Mobile.shader

92行目と99行目に以下を追加します。

// DepthAPI Environment Occlusion
#pragma multi_compile _ HARD_OCCLUSION SOFT_OCCLUSION
#include "Packages/com.meta.xr.sdk.core/Shaders/EnvironmentDepth/BiRP/EnvironmentOcclusionBiRP.cginc"

124行目と137行目に以下を追加します。

META_DEPTH_VERTEX_OUTPUT(5) // the number should stand for the previous TEXCOORD# + 1
// v.vertex (object space coordinate) might have a different name in your vert shader
META_DEPTH_INITIALIZE_VERTEX_OUTPUT(output, input.vertex);

210行目に以下を追加します。

UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);

245行目に以下を追加します。

// Third field is for environment depth bias. 0.0 means the occlusion will be calculated with depths as they are.
META_DEPTH_OCCLUDE_OUTPUT_PREMULTIPLY(input, c, 0.0);

これでシェーダの改変は完了です。
TextMeshProシェーダを利用するテキストUIを作成して確認用のシーンを作成します。

ビルドと動作確認

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

TextMeshProのUIオブジェクトが以下の通り現実の物体でオクルージョンされます。