本日は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_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
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_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
マテリアルを作成する
これでシェーダの改変は完了です。
作成したlilToonQuestOcclusionシェーダを利用するマテリアルを作成します。
作成したマテリアルを新規作成したSphereオブジェクトにドラッグして反映します。
ビルドと動作確認
これで設定は完了です。
以下の記事を参考にプロジェクトのビルドとQuest3へのデプロイを実行してください。
bluebirdofoz.hatenablog.com
lilToonQuestOcclusionシェーダを利用するSphereオブジェクトが以下の通り現実の物体でオクルージョンされます。