夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

MixedReality-GraphicsTools-Unityを触る その③ GraphicsToolsStandardShaderのドキュメントを読む 前半

本日は昨日に引き続きMRTK3のGraphicsToolsを調査していきます。

GraphicsToolsではMRTKのShaderやレンダリングなどのグラフィックに関する機能を担うMRTK3のパッケージです。

前回はMRTKv2のMRTKStandardShaderの後継機に当たるGraphicsTools/StandardShaderを軽く触っていきました。

redhologerbera.hatenablog.com

今回はGraphicsTools/StandardShaderのドキュメントを読み解いていきます。

〇GraphicsTools/StandardShaderドキュメント

MSのドキュメントは次にあります。

docs.microsoft.com

GraphicsToolsStandardシェーダーはMixedRealityデバイスでのパフォーマンスを想定しながらUnityで提供されているStandardShaderなどの汎用性の高いShaderとして提供されています。

Fluent Design Systemにのっとって機能が提供されています。

〇Fluent Design System

www.microsoft.com

Fluent Design Systemはオープンソースで提供されているクロスプラットフォームの設計システムを指し、アクセシビリティとパフォーマンスを両立したデザイン指向となっています。

〇サンプル

GraphicsTools/StandardShaderの例はMaterialGalleryシーンから確認することができます。

redhologerbera.hatenablog.com

〇設計

GraphicsTools/StandardShaderはUnityが提供しているShaderValiantを使用してShaderのプロパティに基づき、使用する機能がコンパイルされるウーバーシェーダーとなっています。

docs.unity3d.com

これによって使用しない機能はコンパイルされることはなく、これが多機能かつ軽量を実現している仕組みとなっています。

#pragma shader_feature_local _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHABLEND_TRANS_ON _ADDITIVE_ON
#pragma shader_feature_local _DISABLE_ALBEDO_MAP

 ...

例えばノーマル(法線)はShader内で次のようにプリプロセッサによってコンパイルが設定されています。

    half3 localNormal = input.normal;

#if defined(_NORMAL) || defined(_VERTEX_EXTRUSION)
#if defined(_URP)
    half3 worldNormal = TransformObjectToWorldNormal(localNormal);
#else
    half3 worldNormal = UnityObjectToWorldNormal(localNormal);
#endif
#endif

このような仕組みを導入することで最適なパフォーマンスを提供するほかにURPなどにも対応することを可能としています。

〇提供されているシェーダーファイル

先日見たように GraphicsToolsStandardShaderではMRTKv2のMRTKStandardShaderから進化して、HLSLファイルを読み込むことで可読性を上げています。

redhologerbera.hatenablog.com

GraphicsToolsでは次のファイルが提供されてます。

〇GraphicsToolsStandardProgram.hlsl

頂点シェーダーとフラグメント シェーダーのコアを含みます。

GrapichsToolsStandardShaderのコア部分と呼べます。

〇GraphicsToolsStandardMetaProgram

UnityによるStaticライティングに使用する頂点シェーダーとフラグメントシェーダーの実装を含みます。 この処理は実行時および実機には使用されません

〇GraphicsToolsStandardInput

 頂点属性、頂点補間器、テクスチャ、テクスチャ サンプラー、マテリアルごとの定数バッファー、グローバル プロパティ、および定数の定義が含まれています。

 これらはUnityCG.cgincのAppdataなどのようにGraphicsToolsStandardShaderで使用されるデータが定義されているのでしょうか?

〇GraphicsToolsCommon.hlsl

 共通で使用されるメソッドと定義が記述されています。

これらのファイルはGrapchicsTools/Runtime/Shader内に存在します。

今回は長くなってしまったので以上です。

続きは次回以降見ていきます。