本日はMixedRealityToolkitGraphicsTools枠です。
StandardShader全機能を実装から読み解いていきます。
今回は前回見たRenderingModeの実装を読み解いていきます。
〇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); }
ここでは選択したモードに応じてそれぞれ処理を行い表示を変えています。
次回ここを見ていきます。