夜風のMixedReality

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

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

本日はMRGT調査枠です。

redhologerbera.hatenablog.com

前回は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側の表示の処理はここでは行われれていないため別の場所で行われていそうです。