本日はMRGT枠です。
Microsoft MixedRealityGraphicsToolsで提供されているGraphicsToolsStandardシェーダーはMixedRealtiyデバイス向け、特にMicrosoft HoloLensに最適なパフォーマンスを出すことを目的として開発されています。
Unityの描画処理の中で特に思いと言われている影の機能はHoloLensが現実世界をベースとしたMixedReality体験を行うという性質上影が必要となることが少ないことに加え、光学シースルーデバイスの性質上黒が描画できないためオミットされてきました。
しかしVRや近年の新しいデバイスの登場によって影が描画されないことがGraphicsToolsStandardShaderの欠点とも呼ばれるようになってきました。
GraphicsToolsStandardShaderはUnityのStandardシェーダー及びURP用のUniversalRenderPipeline/Litシェーダーと同等の以上機能を持ったMixedRealityデバイスに最適化されたシェーダーとしてあるために影の機能を実装することが進んでおりました。

筆者は影を受け取る機能であるReceiveShadowを担当しており、反対のCastShadowはMicrosoftのほかのMRGTチームメンバーが担当していたため今回どのような実装が行われているのかも含め勉強の意味で読み解いていきます。
〇URPでの影描画機能の実装と問題点
通常影を落とす機能をシェーダーに組み込む場合パスを増やす必要があります。
しかしGraphicsToolsStandardシェーダーは必要な機能のみチェックボックスにチェックを入れて機能を有効化して、その分の処理コストを払うというウーバーシェーダーシステムを採用しています。
パスを増やすことはウーバーシェーダーシステムの対応と相性が悪くこの点が筆者がCastShadowの実装において問題となった点でした。
〇MRGTの実装
MixedRealityGraphicsToolsでは#146でプルリクエストがマージされています。
https://github.com/microsoft/MixedReality-GraphicsTools-Unity/pull/146/files
この中でGraphicsToolsStandardシェーダーの変更点で次のようにShadewPassが追加されています。
Pass
{
Name "ShadowCaster"
Tags{"LightMode" = "ShadowCaster"}
ZWrite On
ZTest LEqual
ColorMask 0
Cull[_CullMode]
HLSLPROGRAM
#define _URP
#define _SHADOW_PASS
#pragma multi_compile_instancing
#pragma shader_feature_local_fragment _CLIPPING_BORDER
#include_with_pragmas "GraphicsToolsStandardProgram.hlsl"
ENDHLSL
}
````
注目すべきは**ShadowCaster**というパス名にあります。
このパス名はUnityのShaderにおいて特殊な使われ方をします。具体的には**ShadowCaster**パスは、Unityがライトからの影を計算するために使用する特別なパスです。
このパスは、オブジェクトがスタティックなオブジェクトである場合やそのオブジェクトがライトからの影を生成することができる場合にのみ使用されます。
この影を生成することができるかどうかというのは一般的にUnityのMeshRendererコンポーネントの**CastShadow**が**On**になっている場合を指します。
[f:id:Holomoto-Sumire:20230312221131p:plain]
この場合に新たに追加された上記のパスが実行されます。
通常のShader同様にCastShadowをオンにしている場合通常の描画パス処理に加えこのパスも描画することになるため負荷は上がるということができます。
具体的な処理に関してはまた後日読み解いていきます。