夜風のMixedReality

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

MRTKワイヤフレームShaderを調査する。 その① カスタムシェーダーGUI

今回はShader勉強枠です。

今回はMRTKで提供されているワイヤフレームシェーダーに関して調査します。

〇MRTKのワイヤフレームシェーダーとは?

 MRTKでは[SpatialAwareness(空間認識)]で作成された[SpatialMesh(空間メッシュ)]を描画するためのマテリアルとしてデフォルトで[MRTK_Wireframe]というマテリアルがあります。

 このマテリアルで使用されているシェーダーが[MixedReality Toolkit/Wireframe]シェーダーになります。

f:id:Holomoto-Sumire:20211106204817p:plain

Shader全文はこちらになります。

github.com

今回は子のシェーダーを勉強のために読み解いていきます。

〇プロパティ

f:id:Holomoto-Sumire:20211106210638p:plain

[MRTK Wireframe]シェーダーでは次のプロパティを保持しています。

・RenderingMode

レンダリングのモードでTransparent、Opaceなどが指定できます。

・CullMode

 [CullMode]はカリングを指定し、メッシュの裏側、表側、両面を描画するなどを設定します。デフォルトでは[Back]が指定され、メッシュの裏面がカリングされ、表面のみが描画されるようになっています。

 SpatialMeshで使用することが想定されているため、Meshの裏面は表示されないようになっています。

・BaseColor

 SpatialMeshの色を指定しています。デフォルトでは黒で実機上で表示されない設定になっています。

・WireColor

 SpatialMeshのワイヤフレーム色です。

・WireframeThickness

ワイヤフレームの太さを指定します。

〇カスタムシェーダーGUI

このシェーダーはシェーダーGUIによって[Microsoft.MixedReality.Toolkit.Editor.MixedRealityWireframeShaderGUI]クラスで拡張されUnityのマテリアルとして表示されています。

    FallBack "Mixed Reality Toolkit/Standard"
    CustomEditor "Microsoft.MixedReality.Toolkit.Editor.MixedRealityWireframeShaderGUI"

この[CustomEditor]部をコメントアウトすることでShader本来で表示されるプロパティが表示されます。

f:id:Holomoto-Sumire:20211106212316p:plain

[MixedRealityWireframeShaderGUI]クラスの[Styles]ではマテリアルに表記される[Header]を定義します。

f:id:Holomoto-Sumire:20211106214018p:plain

  protected static class Styles
        {
            public static string mainPropertiesTitle = "Main Properties";
            public static string advancedOptionsTitle = "Advanced Options";

            public static GUIContent baseColor = new GUIContent("Base Color", "Color of faces");
            public static GUIContent wireColor = new GUIContent("Wire Color", "Color of wires");
            public static GUIContent wireThickness = new GUIContent("Wire Thickness", "Thickness of wires");
        }

[GUIContent]はUnityによって提供されているクラスでGUIの要素を指定します。

Unityのレファレンスによると[GUIStyle]と密接に連携しており、GUIContent により「何」を表示するか定義し、GUIStyle は「どのように」表示するか定義しているようです。

docs.unity3d.com

GUIContentで2つの要素を作成しています。

ここでは第一引数として表示名を指定し第二引数でTooltipを指定しています。

public GUIContent(string text, string tooltip)
      : this(text, (Texture) null, tooltip)
    {
    }

例えば

    public static GUIContent baseColor = new GUIContent("Base Color", "Color of faces");

では変数名上をマウスで重ねると[Color of faces]というツールチップが表示されるようになります。

f:id:Holomoto-Sumire:20211106214952p:plain

今回は以上です。

次回もカスタムシェーダーGUIについて読み解きながらWireframeShaderを読み解いていきます。