夜風のMixedReality

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

MixedRealityGraphicsTools StndardShader全機能解説 その② RenderingModeの実装を見る

本日はMixedRealityToolkitGraphicsTools枠です。

StandardShader全機能を実装から読み解いていきます。

今回は前回見たRenderingModeの実装を読み解いていきます。

redhologerbera.hatenablog.com

〇RenderingModeの実装

GraphicsTools/Standerd.shaderのPropertiesでAdvanced optionとして定義されています。

Shader "Graphics Tools/Standard"
{
    Properties
    {
    ・・・
  // Advanced options.
        [Enum(Microsoft.MixedReality.GraphicsTools.Editor.RenderingMode)] _Mode("Rendering Mode", Float) = 0 // "Opaque"
        [Enum(Microsoft.MixedReality.GraphicsTools.Editor.RenderingMode)] _CustomMode("Mode", Float) = 0     // "Opaque"
        [Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend("Source Blend", Float) = 1                         // "One"
        [Enum(UnityEngine.Rendering.BlendMode)] _DstBlend("Destination Blend", Float) = 0                    // "Zero"
        [Enum(UnityEngine.Rendering.BlendMode)] _SrcBlendAlpha("Source Blend Alpha", Float) = 1              // "One"
        [Enum(UnityEngine.Rendering.BlendMode)] _DstBlendAlpha("Destination Blend Alpha", Float) = 1         // "One"
        [Enum(UnityEngine.Rendering.BlendOp)] _BlendOp("Blend Operation", Float) = 0                         // "Add"
        [Enum(UnityEngine.Rendering.CompareFunction)] _ZTest("Depth Test", Float) = 4                        // "LessEqual"
        [Enum(Microsoft.MixedReality.GraphicsTools.Editor.DepthWrite)] _ZWrite("Depth Write", Float) = 1     // "On"
        _ZOffsetFactor("Depth Offset Factor", Float) = 0                                                     // "Zero"
        _ZOffsetUnits("Depth Offset Units", Float) = 0                                                       // "Zero"
        [Enum(UnityEngine.Rendering.ColorWriteMask)] _ColorWriteMask("Color Write Mask", Float) = 15         // "All"
        [Enum(UnityEngine.Rendering.CullMode)] _CullMode("Cull Mode", Float) = 2                             // "Back"

    }

多くのプロパティには属性が付けられています。

 [Enum(Microsoft.MixedReality.GraphicsTools.Editor.RenderingMode)]

これはMicrosoft.MixedReality.GraphicsTools.Editor.RenderingMode内で定義されているEnum型であることを示しています。

これはBaseShaderGUI.csで定義されています。

namespace Microsoft.MixedReality.GraphicsTools.Editor
{
    /// <summary>
    /// Groups render state into a handful of common surface configurations.
    /// </summary>
    public enum RenderingMode
    {
        Opaque = 0,
        Cutout = 1,
        Fade = 2,
        Transparent = 3,
        Additive = 4,
        Custom = 5
    }

レンダリングモードはここで定義されており、前回紹介した6個が定義されており、それぞれ数値で管理されています。

それ以外のUnityEngine.RenderingはUnityで提供されている組み込みのUIツールです。

ここでは使用した値をPass内のBlend変数などの変数として使用できます。

 Pass
        {
            Name "Main"
            Tags{ "LightMode" = "UniversalForward" }
            LOD 100
            Blend[_SrcBlend][_DstBlend],[_SrcBlendAlpha][_DstBlendAlpha]
            BlendOp[_BlendOp]
            ZTest[_ZTest]
            ZWrite[_ZWrite]
            Cull[_CullMode]
            Offset[_ZOffsetFactor],[_ZOffsetUnits]
            ColorMask[_ColorWriteMask]

          ・・・

            ENDHLSL
        }

〇RenderingModeのテンプレート

 Custom以外を使用する場合でRenderingModeを変更することで選択したモードに応じて自動でパラメータが設定されます。

 これはBaseShaderGUI.csで定義されています。

 protected void RenderingModeOptions(MaterialEditor materialEditor)
        {
            EditorGUI.BeginChangeCheck();

            EditorGUI.showMixedValue = renderingMode.hasMixedValue;
            RenderingMode mode = (RenderingMode)renderingMode.floatValue;
            EditorGUI.BeginChangeCheck();
            mode = (RenderingMode)EditorGUILayout.Popup(renderingMode.displayName, (int)mode, BaseStyles.renderingModeNames);

            if (EditorGUI.EndChangeCheck())
            {
                materialEditor.RegisterPropertyChangeUndo(renderingMode.displayName);
                renderingMode.floatValue = (float)mode;

                Object[] targets = renderingMode.targets;

                foreach (Object target in targets)
                {
                    MaterialChanged((Material)target);
                }
            }

            EditorGUI.showMixedValue = false;

            if ((RenderingMode)renderingMode.floatValue == RenderingMode.Custom)
            {
                EditorGUI.indentLevel += 2;
                customRenderingMode.floatValue = EditorGUILayout.Popup(customRenderingMode.displayName, (int)customRenderingMode.floatValue, BaseStyles.renderingModeNames);
                materialEditor.ShaderProperty(sourceBlend, BaseStyles.sourceBlend);
                materialEditor.ShaderProperty(destinationBlend, BaseStyles.destinationBlend);
                materialEditor.ShaderProperty(sourceBlendAlpha, BaseStyles.sourceBlendAlpha);
                materialEditor.ShaderProperty(destinationBlendAlpha, BaseStyles.destinationBlendAlpha);
                materialEditor.ShaderProperty(blendOperation, BaseStyles.blendOperation);
                materialEditor.ShaderProperty(depthTest, BaseStyles.depthTest);
                depthWrite.floatValue = EditorGUILayout.Popup(depthWrite.displayName, (int)depthWrite.floatValue, BaseStyles.depthWriteNames);
                materialEditor.ShaderProperty(depthOffsetFactor, BaseStyles.depthOffsetFactor);
                materialEditor.ShaderProperty(depthOffsetUnits, BaseStyles.depthOffsetUnits);
                materialEditor.ShaderProperty(colorWriteMask, BaseStyles.colorWriteMask);
                EditorGUI.indentLevel -= 2;
            }

            if (!PropertyEnabled(depthWrite))
            {
                if (ShaderGUIUtilities.DisplayDepthWriteWarning(materialEditor))
                {
                    renderingMode.floatValue = (float)RenderingMode.Custom;
                    depthWrite.floatValue = (float)DepthWrite.On;
                }
            }

            materialEditor.ShaderProperty(cullMode, BaseStyles.cullMode);
        }

ここでは選択したモードに応じてそれぞれ処理を行い表示を変えています。

次回ここを見ていきます。