MRが楽しい

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

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

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

前提条件

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

lilToon

lilToonはlil氏が開発している多機能かつ軽量なトゥーンシェーダです。
lilTonnは使用する機能に合わせてシェーダが最適化されます。
このため、機能に合わせて最小限の構成の軽量なトゥーンシェーダとして利用することができます。
booth.pm

本記事では2024/8/24現在の最新版バージョン1.7.3ではなくバージョン1.6を使用しています。

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

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

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

Assets/lilToon/Shader

lilToonは前述の通りシェーダの最適化が走る仕組みがあり、shaderファイルが書き換わる可能性があります。
今回はlilToonシェーダをベースに新たにlilToonQuestOcclusionシェーダを作成する方法を取りました。

lilToonのシェーダを修正する

以下の名前のshaderファイルを作成しました。

ltsQuestOcclusion.shader
ltspass_opaque_quest.shader

以下のhlslファイルは編集を行って変更しました。

Assets\lilToon\Shader\Includes\lil_common_vert.hlsl
Assets\lilToon\Shader\Includes\lil_pass_depthnormals.hlsl
Assets\lilToon\Shader\Includes\lil_pass_depthonly.hlsl
Assets\lilToon\Shader\Includes\lil_pass_forward_fakeshadow.hlsl
Assets\lilToon\Shader\Includes\lil_pass_forward_fur.hlsl
Assets\lilToon\Shader\Includes\lil_pass_forward_gem.hlsl
Assets\lilToon\Shader\Includes\lil_pass_forward_lite.hlsl
Assets\lilToon\Shader\Includes\lil_pass_forward_normal.hlsl
Assets\lilToon\Shader\Includes\lil_pass_forward_refblur.hlsl
Assets\lilToon\Shader\Includes\lil_pass_meta.hlsl
Assets\lilToon\Shader\Includes\lil_pass_shadowcaster.hlsl
Assets\lilToon\Shader\Includes\lil_pass_universal2d.hlsl

ltsQuestOcclusion.shader

lilToonQuestOcclusionシェーダは以下のlts.shaderをベースに変更を加えています。

Assets/lilToon/Shader/lts.shader

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

Shader "lilToonQuestOcclusion"

638~641行目を以下に変更します。

UsePass "Hidden/ltspass_opaque_quest/FORWARD"
UsePass "Hidden/ltspass_opaque_quest/FORWARD_ADD"
UsePass "Hidden/ltspass_opaque_quest/SHADOW_CASTER"
UsePass "Hidden/ltspass_opaque_quest/META"

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

// DepthAPI Environment Occlusion
#pragma multi_compile _ HARD_OCCLUSION SOFT_OCCLUSION


ltspass_opaque_quest.shader

ltspass_opaque_questシェーダは以下のltspass_opaque.shaderをベースに変更を加えています。

Assets/lilToon/Shader/ltspass_opaque.shader

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

Shader "Hidden/ltspass_opaque_quest"

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

// DepthAPI Environment Occlusion
#pragma multi_compile _ HARD_OCCLUSION SOFT_OCCLUSION

794~795行目と798行目を以下に変更します。

#include "Assets/lilToon/Shader/Includes/lil_pipeline_brp.hlsl"
#include "Assets/lilToon/Shader/Includes/lil_common.hlsl"
#include "Assets/lilToon/Shader/Includes/lil_pass_forward.hlsl"

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

// DepthAPI Environment Occlusion
#pragma multi_compile _ HARD_OCCLUSION SOFT_OCCLUSION

845~846行目と849行目を以下に変更します。

#include "Assets/lilToon/Shader/Includes/lil_pipeline_brp.hlsl"
#include "Assets/lilToon/Shader/Includes/lil_common.hlsl"
#include "Assets/lilToon/Shader/Includes/lil_pass_forward.hlsl"

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

// DepthAPI Environment Occlusion
#pragma multi_compile _ HARD_OCCLUSION SOFT_OCCLUSION

899~900行目と903行目を以下に変更します。

#include "Assets/lilToon/Shader/Includes/lil_pipeline_brp.hlsl"
#include "Assets/lilToon/Shader/Includes/lil_common.hlsl"
#include "Assets/lilToon/Shader/Includes/lil_pass_forward.hlsl"

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

// DepthAPI Environment Occlusion
#pragma multi_compile _ HARD_OCCLUSION SOFT_OCCLUSION

950~951行目と954行目を以下に変更します。

#include "Assets/lilToon/Shader/Includes/lil_pipeline_brp.hlsl"
#include "Assets/lilToon/Shader/Includes/lil_common.hlsl"
#include "Assets/lilToon/Shader/Includes/lil_pass_forward.hlsl"

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

// DepthAPI Environment Occlusion
#pragma multi_compile _ HARD_OCCLUSION SOFT_OCCLUSION

984~985行目と988行目を以下に変更します。

#include "Assets/lilToon/Shader/Includes/lil_pipeline_brp.hlsl"
#include "Assets/lilToon/Shader/Includes/lil_common.hlsl"
#include "Assets/lilToon/Shader/Includes/lil_pass_shadowcaster.hlsl"

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

// DepthAPI Environment Occlusion
#pragma multi_compile _ HARD_OCCLUSION SOFT_OCCLUSION

1016~1017行目と1020行目を以下に変更します。

#include "Assets/lilToon/Shader/Includes/lil_pipeline_brp.hlsl"
#include "Assets/lilToon/Shader/Includes/lil_common.hlsl"
#include "Assets/lilToon/Shader/Includes/lil_pass_shadowcaster.hlsl"

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

// DepthAPI Environment Occlusion
#pragma multi_compile _ HARD_OCCLUSION SOFT_OCCLUSION

1045~1046行目と1049行目を以下に変更します。

#include "Assets/lilToon/Shader/Includes/lil_pipeline_brp.hlsl"
#include "Assets/lilToon/Shader/Includes/lil_common.hlsl"
#include "Assets/lilToon/Shader/Includes/lil_pass_meta.hlsl"


lil_common_vert.hlsl

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

#include "Packages/com.meta.xr.sdk.core/Shaders/EnvironmentDepth/BiRP/EnvironmentOcclusionBiRP.cginc"

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

// v.vertex (object space coordinate) might have a different name in your vert shader
META_DEPTH_INITIALIZE_VERTEX_OUTPUT(LIL_V2F_OUT, input.positionOS);


lil_pass_depthnormals.hlsl

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

#include "Packages/com.meta.xr.depthapi/Runtime/BiRP/EnvironmentOcclusionBiRP.cginc"

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

META_DEPTH_VERTEX_OUTPUT(13) // the number should stand for the previous TEXCOORD# + 1


lil_pass_depthonly.hlsl

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

#include "Packages/com.meta.xr.depthapi/Runtime/BiRP/EnvironmentOcclusionBiRP.cginc"

63行目、86行目、93行目に以下を追加します。

META_DEPTH_VERTEX_OUTPUT(14) // the number should stand for the previous TEXCOORD# + 1
META_DEPTH_VERTEX_OUTPUT(6) // the number should stand for the previous TEXCOORD# + 1
META_DEPTH_VERTEX_OUTPUT(7) // the number should stand for the previous TEXCOORD# + 1


lil_pass_forward_fakeshadow.hlsl

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

#include "Packages/com.meta.xr.sdk.core/Shaders/EnvironmentDepth/BiRP/EnvironmentOcclusionBiRP.cginc"

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

META_DEPTH_VERTEX_OUTPUT(11) // the number should stand for the previous TEXCOORD# + 1

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

META_DEPTH_OCCLUDE_OUTPUT_PREMULTIPLY(input, fd.col, 0.0);


lil_pass_forward_fur.hlsl

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

#include "Packages/com.meta.xr.sdk.core/Shaders/EnvironmentDepth/BiRP/EnvironmentOcclusionBiRP.cginc"

72行目と94行目に以下を追加します。

META_DEPTH_VERTEX_OUTPUT(17) // the number should stand for the previous TEXCOORD# + 1
META_DEPTH_VERTEX_OUTPUT(17) // the number should stand for the previous TEXCOORD# + 1


lil_pass_forward_gem.hlsl

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

#include "Packages/com.meta.xr.sdk.core/Shaders/EnvironmentDepth/BiRP/EnvironmentOcclusionBiRP.cginc"

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

META_DEPTH_VERTEX_OUTPUT(10) // the number should stand for the previous TEXCOORD# + 1


lil_pass_forward_lite.hlsl

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

#include "Packages/com.meta.xr.sdk.core/Shaders/EnvironmentDepth/BiRP/EnvironmentOcclusionBiRP.cginc"

45行目と76行目に以下を追加します。

META_DEPTH_VERTEX_OUTPUT(14) // the number should stand for the previous TEXCOORD# + 1
META_DEPTH_VERTEX_OUTPUT(17) // the number should stand for the previous TEXCOORD# + 1


lil_pass_forward_normal.hlsl

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

#include "Packages/com.meta.xr.sdk.core/Shaders/EnvironmentDepth/BiRP/EnvironmentOcclusionBiRP.cginc"

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

META_DEPTH_VERTEX_OUTPUT(17) // the number should stand for the previous TEXCOORD# + 1

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

META_DEPTH_VERTEX_OUTPUT(19) // the number should stand for the previous TEXCOORD# + 1


lil_pass_forward_refblur.hlsl

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

#include "Packages/com.meta.xr.sdk.core/Shaders/EnvironmentDepth/BiRP/EnvironmentOcclusionBiRP.cginc"

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

META_DEPTH_VERTEX_OUTPUT(9) // the number should stand for the previous TEXCOORD# + 1

66~69行目を以下に変更します。

float4 fragmentShaderResult = float4(refractCol,1.0);
META_DEPTH_OCCLUDE_OUTPUT_PREMULTIPLY(i, fragmentShaderResult, 0.0);

return fragmentShaderResult;


lil_pass_meta.hlsl

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

#include "Packages/com.meta.xr.sdk.core/Shaders/EnvironmentDepth/BiRP/EnvironmentOcclusionBiRP.cginc"

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

META_DEPTH_VERTEX_OUTPUT(12) // the number should stand for the previous TEXCOORD# + 1

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

META_DEPTH_OCCLUDE_OUTPUT_PREMULTIPLY(input, fd.col, 0.0);

103~106行目を以下に変更します。

float4 metaOutput = MetaFragment(metaInput);
META_DEPTH_OCCLUDE_OUTPUT_PREMULTIPLY(i, metaOutput, 0.0);

return metaOutput;


lil_pass_shadowcaster.hlsl

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

#include "Packages/com.meta.xr.sdk.core/Shaders/EnvironmentDepth/BiRP/EnvironmentOcclusionBiRP.cginc"

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

META_DEPTH_VERTEX_OUTPUT(13) // the number should stand for the previous TEXCOORD# + 1


lil_pass_universal2d.hlsl

6行目と24行目に以下を追加します。

#include "Packages/com.meta.xr.depthapi/Runtime/BiRP/EnvironmentOcclusionBiRP.cginc"
META_DEPTH_VERTEX_OUTPUT(9) // the number should stand for the previous TEXCOORD# + 1

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

META_DEPTH_OCCLUDE_OUTPUT_PREMULTIPLY(input, fd.col, 0.0);


マテリアルを作成する

これでシェーダの改変は完了です。
作成したlilToonQuestOcclusionシェーダを利用するマテリアルを作成します。

作成したマテリアルを新規作成したSphereオブジェクトにドラッグして反映します。

ビルドと動作確認

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

lilToonQuestOcclusionシェーダを利用するSphereオブジェクトが以下の通り現実の物体でオクルージョンされます。