本日は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);
}
ここでは選択したモードに応じてそれぞれ処理を行い表示を変えています。
次回ここを見ていきます。