本日はMRGT調査枠です。
前回はBaseShaderGUI.csのレンダリングモードを変更する処理を行っていましたが、今回は前回見れなかったCustom RenderingModeの場合の処理を見ていきます。
〇CustomRenderingMode
RenderingModeがCustomの場合はすべてのパラメータが表示されるようになっています。
この処理は次のコードになります。
case RenderingMode.Custom: { material.SetOverrideTag(BaseStyles.renderTypeName, BaseStyles.renderingModeNames[(int)customMode]); switch (customMode) { case RenderingMode.Opaque: { ・・・ } break; case RenderingMode.Cutout: { ・・・ } break; case RenderingMode.Fade: { ・・・ } break; case RenderingMode.Transparent: { material.DisableKeyword(BaseStyles.alphaTestOnName); material.DisableKeyword(BaseStyles.alphaBlendFadeOnName); material.EnableKeyword(BaseStyles.alphaBlendTransOnName); material.DisableKeyword(BaseStyles.additiveOnName); } break; case RenderingMode.Additive: { material.DisableKeyword(BaseStyles.alphaTestOnName); material.DisableKeyword(BaseStyles.alphaBlendFadeOnName); material.DisableKeyword(BaseStyles.alphaBlendTransOnName); material.EnableKeyword(BaseStyles.additiveOnName); } break; case RenderingMode.Custom: { material.DisableKeyword(BaseStyles.alphaTestOnName); material.DisableKeyword(BaseStyles.alphaBlendFadeOnName); material.DisableKeyword(BaseStyles.alphaBlendTransOnName); material.DisableKeyword(BaseStyles.additiveOnName); } break; }
MRGTシェーダーのプロパティーブロックでは2つのRenderingModeが定義されています。
[Enum(Microsoft.MixedReality.GraphicsTools.Editor.RenderingMode)] _Mode("Rendering Mode", Float) = 0 // "Opaque" [Enum(Microsoft.MixedReality.GraphicsTools.Editor.RenderingMode)] _CustomMode("Mode", Float) = 0 // "Opaque"
一つはRendering Mode、もう一つはModeで、前者がメインのレンダリングモードになっており、後者は前者でCustomが選択されている場合のレンダリングモードになります。
RenderingModeにCustomを選択している場合表示されるModeが後者に当たります。
このモードによって処理を切り替えています。
〇CustomMode Opaqueの場合
switch (customMode) { case RenderingMode.Opaque: { material.DisableKeyword(BaseStyles.alphaTestOnName); material.DisableKeyword(BaseStyles.alphaBlendFadeOnName); material.DisableKeyword(BaseStyles.alphaBlendTransOnName); material.DisableKeyword(BaseStyles.additiveOnName); }
ここではα値を含むパラメータの削除を行っています。
material.DisableKeyword(BaseStyles.alphaTestOnName); material.DisableKeyword(BaseStyles.alphaBlendFadeOnName); material.DisableKeyword(BaseStyles.alphaBlendTransOnName); material.DisableKeyword(BaseStyles.additiveOnName);
〇CustomMode Cutoutの場合
case RenderingMode.Cutout: { material.EnableKeyword(BaseStyles.alphaTestOnName); material.DisableKeyword(BaseStyles.alphaBlendFadeOnName); material.DisableKeyword(BaseStyles.alphaBlendTransOnName); material.DisableKeyword(BaseStyles.additiveOnName); }
Cutoutの場合もαを使用しないのでアルファブレンディングのキーワードを無効化しています。
material.DisableKeyword(BaseStyles.alphaBlendFadeOnName); material.DisableKeyword(BaseStyles.alphaBlendTransOnName); material.DisableKeyword(BaseStyles.additiveOnName);
次に_ALPHATEST_ONを有効化しています。
material.EnableKeyword(BaseStyles.alphaTestOnName);
これによってGraphicsStandard.hlslでクリッピング表現の処理が動きます。
#if defined(_ALPHATEST_ON) || defined(UNITY_UI_ALPHACLIP) || defined(_CLIPPING_PRIMITIVE) || defined(_ROUND_CORNERS) #define _ALPHA_CLIP #if !defined(UNITY_UI_ALPHACLIP)
〇CustomMode Fadeの場合
case RenderingMode.Fade: { material.DisableKeyword(BaseStyles.alphaTestOnName); material.EnableKeyword(BaseStyles.alphaBlendFadeOnName); material.DisableKeyword(BaseStyles.alphaBlendTransOnName); material.DisableKeyword(BaseStyles.additiveOnName); }
Fadeの場合は逆に_ALPHATEST_ONを無効化しています。
クリッピングを行わない代わりに半透明のブレンドを使用するため_ALPHABLEND_ONを有効化しています。
〇CustomMode Transparentの場合
case RenderingMode.Transparent: { material.DisableKeyword(BaseStyles.alphaTestOnName); material.DisableKeyword(BaseStyles.alphaBlendFadeOnName); material.EnableKeyword(BaseStyles.alphaBlendTransOnName); material.DisableKeyword(BaseStyles.additiveOnName); }
Transparentが使用されている場合は_ADDITIVE_ONのシェーダーキーワードが有効化されています。
〇CustomMode Additiveの場合
case RenderingMode.Additive: { material.DisableKeyword(BaseStyles.alphaTestOnName); material.DisableKeyword(BaseStyles.alphaBlendFadeOnName); material.DisableKeyword(BaseStyles.alphaBlendTransOnName); material.EnableKeyword(BaseStyles.additiveOnName); }
Additiveが使用されている場合はTransparent同様_ADDITIVE_ONのシェーダーキーワードが有効化されています。
〇CustomMode Customの場合
case RenderingMode.Custom: { material.DisableKeyword(BaseStyles.alphaTestOnName); material.DisableKeyword(BaseStyles.alphaBlendFadeOnName); material.DisableKeyword(BaseStyles.alphaBlendTransOnName); material.DisableKeyword(BaseStyles.additiveOnName); } break;
最後にRenderingModeがCustomでModeがCustomの場合を見ていきます。
この場合はすべてのキーワードを無効化しています。
RenderingModeではこのようにパラメータによってシェーダーキーワードの有効か無効かを行っています。
これによって一つのパラメータで複雑なレンダリング設定を管理できていることがわかります。
GUI側の表示の処理はここでは行われれていないため別の場所で行われていそうです。