夜風のMixedReality

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

MRGTShaderにNormalapScaleの機能を実装する その② Shader内部の処理を行う。

本日はMRTK3&Shader調査枠です。

MRGTでは多機能高性能なGraphicsTools/StandardShaderが提供されています。

Unityなどで提供されているStandardシェーダーと比べ、前述のように機能が多く、使い勝手が良いのですが、ノーマルマップの影響(強度)を変えるパラメータはShader内部で変数自体は定義されているものの使用されていなかったため、今回使用できるようにしてNormalMapの強度を変更できるようにしました。

○MRGTとは?

MixedRealityGraphicsTools(MRGT)はHoloLensやMetaQuestをはじめとしてxRアプリケーション開発に役立つツールキットであるMixedRealityToolkitの最新版MRTK3で提供されるパッケージの一つで、グラフィックの機能がまとめて提供されています。

○NormalMapScale

前回はShaderで定義されているプロパティをUnityのインスペクタウィンドウからマテリアルのパラメータとして変更できるようにShaderGUIの編集を行いました。

redhologerbera.hatenablog.com

  MRGTStandardShaderではShaderGUIというC#スクリプトでUnity上の表示を管理しています。

 今回はShader内部の処理を加えて形だけ存在していた_NormalMapScaleの機能を処理に組み込んでいきます。

○GraphicsToolsStandardInput.hlsl

GraphicsToolsStandardInput.hlslはMRGTStandardShaderで使用される変数やテクスチャなどを定義、格納するファイルです。

今回は200行目あたりにfloat _NormalMapScaleを追記し、プロパティで使用されている変数をShader内で使用できるように定義しました。

 half _Metallic;
    half _Smoothness;

    float _NormalMapScale;//追加
    // #if defined(_ALPHA_CLIP)
    half _Cutoff;
○GraphicsToolsStandardProgram.hlsl

GraphicsToolsStandardProgram.hlslMRGTSandardShaderのメインの処理が記述されているファイルです。

 ここでは600行目あたりのフラグメントシェーダーないのNormalに関する処理に_NormalMapScaleを計算後のworldNormalの処理に掛け算するようにしています。

// Swizzle tangent normals to match world normal and blend together.
    worldNormal = normalize(tangentNormalX.zyx * triplanarBlend.x +
                            tangentNormalY.xzy * triplanarBlend.y +
                            tangentNormalZ.xyz * triplanarBlend.z)*_NormalMapScale;
#else
#if defined(_URP)
    half3 tangentNormal = UnpackNormal(SAMPLE_TEXTURE2D(_NormalMap, sampler_NormalMap, input.uv));
#else
    half3 tangentNormal = UnpackNormal(tex2D(_NormalMap, input.uv));
#endif
    worldNormal.x = dot(input.tangentX, tangentNormal);
    worldNormal.y = dot(input.tangentY, tangentNormal);
    worldNormal.z = dot(input.tangentZ, tangentNormal);
    worldNormal = normalize(worldNormal) * (facing ? 1.0 : -1.0)*_NormalMapScale;
#endif
#else
    worldNormal = normalize(input.worldNormal) * (facing ? 1.0 : -1.0)*_NormalMapScale;
#endif
#endif

 ここではURP用、ビルドイン用、TriplanerMappingを使用しているときの3種の場合で処理が分かれています。

TriplanerMappingとはUVを無視してテクスチャを張る処理を指します。

 この場合もNormalMapが使用されるため3種の場合で処理を分けます。

 これによってそれまで変数だけ定義されていた_NormalMapScaleを使用してノーマルマップの強度を変更できるようになりました。

本変更はすでにMRGTのリポジトリへPRを出しています。

github.com

マージされた場合今後のMRGTのバージョンから筆者の変更が使用できるようになります。

本日は以上です。