static void SetupMaterialWithBlendMode(Material material, SuberspectiveBlendMode blendMode) {
            void SetMaterialSettings(
                string renderType,
                string portalTag,
                BlendOp blendOp,
                BlendMode srcBlend,
                BlendMode dstBlend,
                bool zWrite,
                bool alphaPremultiplyOn,
                bool alphaTestOn,
                int renderQueue) {
                material.SetOverrideTag("RenderType", renderType);
                material.SetOverrideTag("PortalTag", portalTag);
                material.SetInt("__BlendOp", (int)blendOp);
                material.SetInt("__SrcBlend", (int)srcBlend);
                material.SetInt("__DstBlend", (int)dstBlend);
                material.SetInt("__ZWrite", zWrite ? 1 : 0);
                if (alphaPremultiplyOn) material.EnableKeyword("_ALPHAPREMULTIPLY_ON");
                else material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
                if (alphaTestOn) material.EnableKeyword("_ALPHATEST_ON");
                else material.DisableKeyword("_ALPHATEST_ON");
                material.renderQueue = renderQueue;
            }

            switch (blendMode) {
                case SuberspectiveBlendMode.Opaque:
                    SetMaterialSettings("", "",
                        BlendOp.Add, BlendMode.One, BlendMode.Zero,
                        true, false, true,
                        -1);
                    break;
                case SuberspectiveBlendMode.Transparent:
                    SetMaterialSettings("Transparent", "",
                        BlendOp.Multiply, BlendMode.SrcAlpha, BlendMode.OneMinusSrcAlpha,
                        false, true, false,
                        (int)RenderQueue.Transparent);
                    break;
                case SuberspectiveBlendMode.CullEverything:
                    SetMaterialSettings("CullEverything", "CullEverything",
                        BlendOp.Add, BlendMode.One, BlendMode.Zero,
                        true, false, true,
                        (int)RenderQueue.Geometry + 1);
                    break;
                case SuberspectiveBlendMode.InvertColors:
                    SetMaterialSettings("Transparent", "",
                        BlendOp.Subtract, BlendMode.One, BlendMode.One,
                        false, false, false,
                        (int)RenderQueue.Transparent);
                    break;
            }
        }
        void SuberspectiveBlendModePopup(Material material) {
            EditorGUI.showMixedValue = blendMode.hasMixedValue;
            SuberspectiveBlendMode mode = (SuberspectiveBlendMode) blendMode.floatValue;

            EditorGUI.BeginChangeCheck();
            mode = (SuberspectiveBlendMode) EditorGUILayout.Popup(blendModeText, (int) mode, blendNames);
            if (EditorGUI.EndChangeCheck()) {
                editor.RegisterPropertyChangeUndo(blendModeText);
                blendMode.floatValue = (float) mode;
            }
            SetupMaterialWithBlendMode(material, mode);

            EditorGUI.showMixedValue = false;
        }