本日はMRGT枠です。
〇MRGTとは?
MixedRealityToolkit GraphicsTools(略してMRTK GT もっと略してMRGT)はMicrosoftによって提供、開発されているMixedRealityデバイス向けアプリケーション開発のオープンソースプロジェクトです。
GraphicsToolsの名の通りグラフィックに特化した機能が提供されており、軽量なシェーダー、サンプル、Unityのエディタ内でのツールが提供されています。
オープンソースプロジェクト(OSS)であるため筆者も開発に参加しており、今回はGraphicsTools StandardShaderの開発を行っています。
〇フィードバックの反映
今回は主に次の2点の修正依頼がありました。
・誤字の修正
・UIの配置場所の変更
筆者が出したPRではLightModeに新しく*Non-Photorealisticを追加しました。
しかしこれではLit- Distantとの併用ができないたLight Modeを選択した際のオプションで選択ができるほうが良いというフィードバックをもらいました。
〇UIの変更
まずStandardShaderGUI.csのLigit Modeから追加したNon - Photorealisiticを削除します。
/// <summary> /// What type of direct light affects the surface. /// </summary> public enum LightMode { Unlit = 0, LitDirectional = 1, LitDistant = 2 LitDistant = 2, //NonPhotorealistic = 3 }
public static readonly string[] lightModeNames = new string[] { "Unlit", "Lit - Directional", "Lit - Distant" , //"Non - Photorealistic"</s> };
また従来の仕組みではLightModeから排他的にシェーダーキーワードの有効化・無効化を行っていました。
ここも削除します。
protected void RenderingOptions(MaterialEditor materialEditor, Material material) { EditorGUILayout.Space(); GUILayout.Label(Styles.renderingOptionsTitle, EditorStyles.boldLabel); lightMode.floatValue = EditorGUILayout.Popup(Styles.lightMode, (int)lightMode.floatValue, Styles.lightModeNames); switch ((LightMode)lightMode.floatValue) { default: case LightMode.Unlit: { material.DisableKeyword(Styles.lightModeLitDirectional); material.DisableKeyword(Styles.lightModeLitDistant); //material.DisableKeyword(Styles.lightModeNPR); } break; case LightMode.LitDirectional: { material.EnableKeyword(Styles.lightModeLitDirectional); material.DisableKeyword(Styles.lightModeLitDistant); // material.DisableKeyword(Styles.lightModeNPR); } break; case LightMode.LitDistant: { material.DisableKeyword(Styles.lightModeLitDirectional); material.EnableKeyword(Styles.lightModeLitDistant); // material.DisableKeyword(Styles.lightModeNPR); GUILayout.Box(string.Format(Styles.propertiesComponentHelp, nameof(DistantLight), Styles.lightModeNames[(int)LightMode.LitDistant]), EditorStyles.helpBox, Array.Empty<GUILayoutOption>()); } break; /* case LightMode.NonPhotorealistic: { material.EnableKeyword(Styles.lightModeNPR); material.DisableKeyword(Styles.lightModeLitDirectional); material.DisableKeyword(Styles.lightModeLitDistant); } break;*/ }
これでLightModeからNPRの表示が削除されました。
次にLigitModeでUnlit以外の選択をされている場面ですが、これは直後の処理で行われています。
if ((LightMode)lightMode.floatValue != LightMode.Unlit) { materialEditor.ShaderProperty(specularHighlights, Styles.specularHighlights, 2); materialEditor.ShaderProperty(sphericalHarmonics, Styles.sphericalHarmonics, 2); }
LightModeがUnlit以外が選択されている場合GUIにspecularHighlightsとsphericalHarmonicsを表示させています。
ここにnonPhotorealisticRenderingの表示を追加します。
if ((LightMode)lightMode.floatValue != LightMode.Unlit) { materialEditor.ShaderProperty(specularHighlights, Styles.specularHighlights, 2); materialEditor.ShaderProperty(sphericalHarmonics, Styles.sphericalHarmonics, 2); materialEditor.ShaderProperty(nonPhotorealisticRendering, Styles.nonPhotorealisticRendering, 2);//追加 }
同様にnonPhotorealisticRenderingを定義します。
これはLightModeで従来enumの中に定義していたので表に出す形になります。
protected static class Styles { ・・・ public static readonly string lightModeLitDirectional = "_DIRECTIONAL_LIGHT"; public static readonly string lightModeLitDistant = "_DISTANT_LIGHT"; public static readonly GUIContent nonPhotorealisticRendering = new GUIContent("Non-Photorealistic Rendering","Non-Photorealistic Rendering");//追加 public static readonly GUIContent specularHighlights = new GUIContent("Specular Highlights", "Calculate Specular Highlights"); public static readonly GUIContent sphericalHarmonics = new GUIContent("Spherical Harmonics", "Read From Spherical Harmonics Data for Ambient Light"); public static readonly GUIContent reflections = new GUIContent("Reflections", "Calculate Glossy Reflections");
protected MaterialProperty smoothness; protected MaterialProperty lightMode; protected MaterialProperty nonPhotorealisticRendering; protected MaterialProperty specularHighlights; protected MaterialProperty sphericalHarmonics;
nonPhotorealisticRendering = FindProperty("_NPR", props); specularHighlights = FindProperty("_SpecularHighlights", props); sphericalHarmonics = FindProperty("_SphericalHarmonics", props); reflections = FindProperty("_Reflections", props);
これでGUI上でNPRがLightModeから外れ、Unlit以外のLightModeを使用している場合に表示されるようになりました。
次にShader内部の処理を組み替えます。従来はLightModeで定義されていたNPRの定義をToggle型としてチェックボックスとして対応させます。
Properties { // Main maps. _Color("Color", Color) = (1.0, 1.0, 1.0, 1.0) ・・・ // Rendering options. [Enum(Microsoft.MixedReality.GraphicsTools.Editor.LightMode)] _DirectionalLight("Light Mode", Float) = 1.0 // "LitDirectional" [Toggle(_NON_PHOTOREALISTIC)] _NPR("Non-Photorealistic Rendering", Float) = 0.0//追加
以上でフィードバックいただいた個所の修正が完了しました。
これで再度Pushします。
本日は以上です