夜風のMixedReality

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

MRGTShaderにNormalMapScaleの機能を実装する その① ShaderGUIでインスペクタ表示を行う

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

○MRGTとは?

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

○MRGTStandardShaderにNormalMapScaleの機能を実装する

MRGTではGraphicsTools/Standardと呼ばれるShaderが提供されています。(通称MRGTStandardShader)

 非常に高性能なシェーダーですが、一部一般的なStandardシェーダーで提供されている基本的な機能が欠けていることがあります。

 例として先日は発光マップ(EmissionMap)の機能を実装し、MRGTのパッケージへ貢献しました。

redhologerbera.hatenablog.com

 今回はNormalMapの機能に関してNormalMapScaleを実装します。

○NormalMapScaleとは?

 UnityのStandardShaderなど多くのシェーダーではNormal Mapをアタッチした際にNormalMapScaleと呼ばれる変数を使用できます。(デフォルトで1)

これはノーマルマップの強度に関するパラメータで、値を変化させることで凸凹感の調整ができます。

GraphicsToolsStandardShaderでは _NormalMapScaleというパラメータそのものは用意されているものの、実は内部でどこでも使用されておらず死んだパラメータでした。

    Properties
    {
        // Main maps.
        _Color("Color", Color) = (1.0, 1.0, 1.0, 1.0)
        _MainTex("Albedo", 2D) = "white" {}
       ・・・   
     [Toggle(_NORMAL_MAP)] _EnableNormalMap("Enable Normal Map", Float) = 0.0
        [NoScaleOffset] _NormalMap("Normal Map", 2D) = "bump" {}
        _NormalMapScale("Scale", Float) = 1.0
  ・・・        

○ShaderGUIでマテリアルのパラメータとして表示する

まずはインスペクタ上のマテリアルプロパティを表示させていきます。

StandardShaderGUI.csの100行目あたりにnormalMapScaleの定義を追加します。

            public static readonly GUIContent channelMap = new GUIContent("Channel Map", "Metallic (Red), Occlusion (Green), Emission (Blue), Smoothness (Alpha)");
            public static readonly GUIContent enableNormalMap = new GUIContent("Normal Map", "Enable Normal Map");
            public static readonly GUIContent normalMap = new GUIContent("Normal Map");
            public static readonly GUIContent normalMapScale = new GUIContent("Normal Map Scale");//追加
            public static readonly GUIContent enableEmission = new GUIContent("Emission", "Enable Emission");
            public static readonly GUIContent emissiveColor = new GUIContent("Color");
            public static readonly GUIContent emissiveMap = new GUIContent("EmissionMap");

次に200行目あたりにマテリアルプロパティを追加します。

  protected MaterialProperty channelMap;
        protected MaterialProperty enableNormalMap;
        protected MaterialProperty normalMap;
        protected MaterialProperty normalMapScale;//追加
        protected MaterialProperty enableEmission;
        protected MaterialProperty emissiveColor;
        protected MaterialProperty emissiveMap;

400行目あたりにFindPropertiesの定義を加えます。

ここではShaderのPropertiesブロックで_NormalMapScaleのプロパティを探し、ShaderGUIと紐づけています。

     channelMap = FindProperty("_ChannelMap", props);
            enableNormalMap = FindProperty("_EnableNormalMap", props);
            normalMap = FindProperty("_NormalMap", props);
            normalMapScale = FindProperty("_NormalMapScale", props);//追加
            enableEmission = FindProperty("_EnableEmission", props);
            emissiveMap = FindProperty("_EmissiveMap", props);
            emissiveColor = FindProperty("_EmissiveColor", props);

最後に640行目あたりに処理を加えます。

      if (PropertyEnabled(enableNormalMap))
                {
                    EditorGUI.indentLevel += 2;
                    materialEditor.TexturePropertySingleLine(Styles.normalMap, normalMap);
                    materialEditor.TexturePropertySingleLine(Styles.normalMap, normalMap,normalMapScale);
                    EditorGUI.indentLevel -= 2;
                }

このif分内はノーマルマップにチェックを入れて使用することを宣言している場合に表示させるプロパティになります。

これによってノーマルマップのインスペクタ表示にNormalMapScaleの数値が設定できるようになりました。

以上でNormalMapScaleの表示ができました。

次回Shaderの処理自体を記述していきます。