Example #1
0
        /// <summary>
        /// Create a MToon material.
        /// </summary>
        /// <param name="i"></param>
        /// <param name="src"></param>
        /// <returns></returns>
        protected virtual Material CreateMtoonMaterial(int i, glTFMaterial src)
        {
            Shader shader = Shader.Find(MToon.Utils.ShaderName);

            Material material = new Material(shader);

            material.name = CreateMaterialName(i, src);

#if UNITY_EDITOR
            material.hideFlags = HideFlags.DontUnloadUnusedAsset;
#endif

            MToonDefinition mtoonDefinition = CreateMtoonDefinition(src.extensions.VRMC_materials_mtoon);

            MToon.Utils.SetMToonParametersToMaterial(material, mtoonDefinition);

            return(material);
        }
        public static MToonDefinition FromVrm0x(GltfFormat.VrmMaterial material, List <Texture> textures)
        {
            var definition = new MToonDefinition
            {
                Meta = new MetaDefinition
                {
                    Implementation = MToonUtils.Implementation,
                    VersionNumber  = material.GetInt(MToonUtils.PropVersion),
                },
                Rendering = new RenderingDefinition
                {
                    RenderMode = GetBlendMode(material),
                    CullMode   = GetCullMode(material),
                    RenderQueueOffsetNumber = GetRenderQueueOffset(material, GetRenderQueueOriginMode(material)),
                },
                Color = new ColorDefinition
                {
                    LitColor             = ToLinear(material, MToonUtils.PropColor),
                    LitMultiplyTexture   = GetTexture(material, MToonUtils.PropMainTex, textures),
                    ShadeColor           = ToLinear(material, MToonUtils.PropShadeColor),
                    ShadeMultiplyTexture = GetTexture(material, MToonUtils.PropShadeTexture, textures),
                    CutoutThresholdValue = GetValue(material, MToonUtils.PropCutoff),
                },
                Lighting = new LightingDefinition
                {
                    LitAndShadeMixing = new LitAndShadeMixingDefinition
                    {
                        ShadingShiftValue                          = GetValue(material, MToonUtils.PropShadeShift),
                        ShadingToonyValue                          = GetValue(material, MToonUtils.PropShadeToony),
                        ShadowReceiveMultiplierValue               = GetValue(material, MToonUtils.PropReceiveShadowRate),
                        ShadowReceiveMultiplierMultiplyTexture     = GetTexture(material, MToonUtils.PropReceiveShadowTexture, textures),
                        LitAndShadeMixingMultiplierValue           = GetValue(material, MToonUtils.PropShadingGradeRate),
                        LitAndShadeMixingMultiplierMultiplyTexture = GetTexture(material, MToonUtils.PropShadingGradeTexture, textures),
                    },
                    LightingInfluence = new LightingInfluenceDefinition
                    {
                        LightColorAttenuationValue = GetValue(material, MToonUtils.PropLightColorAttenuation),
                        GiIntensityValue           = GetValue(material, MToonUtils.PropIndirectLightIntensity),
                    },
                    Normal = new NormalDefinition
                    {
                        NormalTexture    = GetTexture(material, MToonUtils.PropBumpMap, textures),
                        NormalScaleValue = GetValue(material, MToonUtils.PropBumpScale),
                    },
                },
                Emission = new EmissionDefinition
                {
                    EmissionColor           = ToLinear(material, MToonUtils.PropEmissionColor),
                    EmissionMultiplyTexture = GetTexture(material, MToonUtils.PropEmissionMap, textures),
                },
                MatCap = new MatCapDefinition
                {
                    AdditiveTexture = GetTexture(material, MToonUtils.PropSphereAdd, textures),
                },
                Rim = new RimDefinition
                {
                    RimColor             = ToLinear(material, MToonUtils.PropRimColor),
                    RimMultiplyTexture   = GetTexture(material, MToonUtils.PropRimTexture, textures),
                    RimLightingMixValue  = GetValue(material, MToonUtils.PropRimLightingMix),
                    RimFresnelPowerValue = GetValue(material, MToonUtils.PropRimFresnelPower),
                    RimLiftValue         = GetValue(material, MToonUtils.PropRimLift),
                },
                Outline = new OutlineDefinition
                {
                    OutlineWidthMode              = GetOutlineWidthMode(material),
                    OutlineWidthValue             = GetValue(material, MToonUtils.PropOutlineWidth),
                    OutlineWidthMultiplyTexture   = GetTexture(material, MToonUtils.PropOutlineWidthTexture, textures),
                    OutlineScaledMaxDistanceValue = GetValue(material, MToonUtils.PropOutlineScaledMaxDistance),
                    OutlineColorMode              = GetOutlineColorMode(material),
                    OutlineColor            = ToLinear(material, MToonUtils.PropOutlineColor),
                    OutlineLightingMixValue = GetValue(material, MToonUtils.PropOutlineLightingMix),
                },
                TextureOption = new TextureUvCoordsDefinition
                {
                    MainTextureLeftBottomOriginScale  = material.GetTextureScale(MToonUtils.PropMainTex),
                    MainTextureLeftBottomOriginOffset = material.GetTextureOffset(MToonUtils.PropMainTex),
                    UvAnimationMaskTexture            = GetTexture(material, MToonUtils.PropUvAnimMaskTexture, textures),
                    UvAnimationScrollXSpeedValue      = GetValue(material, MToonUtils.PropUvAnimScrollX),
                    UvAnimationScrollYSpeedValue      = GetValue(material, MToonUtils.PropUvAnimScrollY),
                    UvAnimationRotationSpeedValue     = GetValue(material, MToonUtils.PropUvAnimRotation),
                },
            };

            return(definition);
        }
Example #3
0
        public static void SetMToonParametersToMaterial(Material material, MToonDefinition parameters, List <Texture> textures)
        {
            var mtoon = material.Extensions.VRMCMaterialsMtoon;

            {
                var meta = parameters.Meta;
                mtoon.Version = meta.VersionNumber.ToString();
            }
            // TODO:
            // {
            //     var rendering = parameters.Rendering;
            //     ValidateBlendMode(material, rendering.RenderMode, isChangedByUser: true);
            //     ValidateCullMode(material, rendering.CullMode);
            //     ValidateRenderQueue(material, offset: rendering.RenderQueueOffsetNumber);
            // }
            {
                var color = parameters.Color;

                // SetColor(material, MToonUtils.PropColor, color.LitColor);
                color.LitColor.ToProtobuf(mtoon.LitFactor.Add, true);

                // SetTexture(material, MToonUtils.PropMainTex, color.LitMultiplyTexture, textures);
                mtoon.LitMultiplyTexture = textures.IndexOfNullable(color.LitMultiplyTexture.Texture);

                // SetColor(material, MToonUtils.PropShadeColor, color.ShadeColor);
                color.ShadeColor.ToProtobuf(mtoon.ShadeFactor.Add, false);

                // SetTexture(material, MToonUtils.PropShadeTexture, color.ShadeMultiplyTexture, textures);
                mtoon.ShadeMultiplyTexture = textures.IndexOfNullable(color.ShadeMultiplyTexture.Texture);

                // SetValue(material, MToonUtils.PropCutoff, color.CutoutThresholdValue);
                mtoon.CutoutThresholdFactor = color.CutoutThresholdValue;
            }
            {
                var lighting = parameters.Lighting;
                {
                    var prop = lighting.LitAndShadeMixing;
                    // SetValue(material, MToonUtils.PropShadeShift, prop.ShadingShiftValue);
                    mtoon.ShadingShiftFactor = prop.ShadingShiftValue;

                    // SetValue(material, MToonUtils.PropShadeToony, prop.ShadingToonyValue);
                    mtoon.ShadingToonyFactor = prop.ShadingToonyValue;
                }
                {
                    var prop = lighting.LightingInfluence;
                    // SetValue(material, MToonUtils.PropLightColorAttenuation, prop.LightColorAttenuationValue);
                    mtoon.LightColorAttenuationFactor = prop.LightColorAttenuationValue;

                    // SetValue(material, MToonUtils.PropIndirectLightIntensity, prop.GiIntensityValue);
                    mtoon.GiIntensityFactor = prop.GiIntensityValue;
                }
                {
                    var prop = lighting.Normal;
                    // SetTexture(material, MToonUtils.PropBumpMap, prop.NormalTexture, textures);
                    mtoon.NormalTexture = textures.IndexOfNullable(prop.NormalTexture.Texture);

                    // SetValue(material, MToonUtils.PropBumpScale, prop.NormalScaleValue);
                    mtoon.NormalScaleFactor = prop.NormalScaleValue;
                }
            }
            {
                var emission = parameters.Emission;
                // SetColor(material, MToonUtils.PropEmissionColor, emission.EmissionColor);
                emission.EmissionColor.ToProtobuf(mtoon.EmissionFactor.Add, false);

                // SetTexture(material, MToonUtils.PropEmissionMap, emission.EmissionMultiplyTexture, textures);
                mtoon.EmissionMultiplyTexture = textures.IndexOfNullable(emission.EmissionMultiplyTexture.Texture);
            }
            {
                var matcap = parameters.MatCap;
                // SetTexture(material, MToonUtils.PropSphereAdd, matcap.AdditiveTexture, textures);
                mtoon.AdditiveTexture = textures.IndexOfNullable(matcap.AdditiveTexture.Texture);
            }
            {
                var rim = parameters.Rim;
                // SetColor(material, MToonUtils.PropRimColor, rim.RimColor);
                rim.RimColor.ToProtobuf(mtoon.RimFactor.Add, false);

                // SetTexture(material, MToonUtils.PropRimTexture, rim.RimMultiplyTexture, textures);
                mtoon.RimMultiplyTexture = textures.IndexOfNullable(rim.RimMultiplyTexture.Texture);

                // SetValue(material, MToonUtils.PropRimLightingMix, rim.RimLightingMixValue);
                mtoon.RimLightingMixFactor = rim.RimLightingMixValue;

                // SetValue(material, MToonUtils.PropRimFresnelPower, rim.RimFresnelPowerValue);
                mtoon.RimFresnelPowerFactor = rim.RimFresnelPowerValue;

                // SetValue(material, MToonUtils.PropRimLift, rim.RimLiftValue);
                mtoon.RimLiftFactor = rim.RimLiftValue;
            }
            {
                var outline = parameters.Outline;
                // SetValue(material, MToonUtils.PropOutlineWidth, outline.OutlineWidthValue);
                mtoon.OutlineWidthFactor = outline.OutlineWidthValue;

                // SetTexture(material, MToonUtils.PropOutlineWidthTexture, outline.OutlineWidthMultiplyTexture, textures);
                mtoon.OutlineWidthMultiplyTexture = textures.IndexOfNullable(outline.OutlineWidthMultiplyTexture.Texture);

                // SetValue(material, MToonUtils.PropOutlineScaledMaxDistance, outline.OutlineScaledMaxDistanceValue);
                mtoon.OutlineScaledMaxDistanceFactor = outline.OutlineScaledMaxDistanceValue;

                // SetColor(material, MToonUtils.PropOutlineColor, outline.OutlineColor);
                outline.OutlineColor.ToProtobuf(mtoon.OutlineFactor.Add, false);

                // SetValue(material, MToonUtils.PropOutlineLightingMix, outline.OutlineLightingMixValue);
                mtoon.OutlineLightingMixFactor = outline.OutlineLightingMixValue;

                // ValidateOutlineMode(material, outline.OutlineWidthMode, outline.OutlineColorMode);
            }
            {
                var textureOptions = parameters.TextureOption;
                // TODO:
                // material.SetTextureScale(MToonUtils.PropMainTex, textureOptions.MainTextureLeftBottomOriginScale);
                // material.SetTextureOffset(MToonUtils.PropMainTex, textureOptions.MainTextureLeftBottomOriginOffset);

                // material.SetTexture(MToonUtils.PropUvAnimMaskTexture, textureOptions.UvAnimationMaskTexture, textures);
                mtoon.UvAnimationMaskTexture = textures.IndexOfNullable(textureOptions.UvAnimationMaskTexture.Texture);

                // material.SetFloat(MToonUtils.PropUvAnimScrollX, textureOptions.UvAnimationScrollXSpeedValue);
                mtoon.UvAnimationScrollXSpeedFactor = textureOptions.UvAnimationScrollXSpeedValue;

                // material.SetFloat(MToonUtils.PropUvAnimScrollY, textureOptions.UvAnimationScrollYSpeedValue);
                mtoon.UvAnimationScrollYSpeedFactor = textureOptions.UvAnimationScrollYSpeedValue;

                // material.SetFloat(MToonUtils.PropUvAnimRotation, textureOptions.UvAnimationRotationSpeedValue);
                mtoon.UvAnimationRotationSpeedFactor = textureOptions.UvAnimationRotationSpeedValue;
            }
        }
Example #4
0
        /// <summary>
        /// Create a MToon definition.
        /// </summary>
        /// <param name="mtoon"></param>
        /// <returns></returns>
        protected virtual MToonDefinition CreateMtoonDefinition(VRMC_materials_mtoon mtoon)
        {
            MToonDefinition mtoonDefinition = new MToonDefinition();

            // Meta
            mtoonDefinition.Meta = new MetaDefinition()
            {
                VersionNumber  = MToon.Utils.VersionNumber,
                Implementation = MToon.Utils.Implementation,
            };

            // Rendering
            mtoonDefinition.Rendering = new RenderingDefinition()
            {
                RenderMode = (MToon.RenderMode)mtoon.renderMode,
                CullMode   = (MToon.CullMode)mtoon.cullMode,
                RenderQueueOffsetNumber = mtoon.renderQueueOffsetNumber,
            };

            // Color
            mtoonDefinition.Color = new ColorDefinition()
            {
                LitColor             = ArrayConverter.ToColor(mtoon.litFactor, gamma: true),
                LitMultiplyTexture   = GetTexture(MToon.Utils.PropMainTex, mtoon.litMultiplyTexture),
                ShadeColor           = ArrayConverter.ToColor(mtoon.shadeFactor, gamma: true),
                ShadeMultiplyTexture = GetTexture(MToon.Utils.PropShadeTexture, mtoon.shadeMultiplyTexture),
                CutoutThresholdValue = mtoon.cutoutThresholdFactor,
            };

            // Lighting
            mtoonDefinition.Lighting = new LightingDefinition();
            mtoonDefinition.Lighting.LitAndShadeMixing = new LitAndShadeMixingDefinition()
            {
                ShadingShiftValue                          = mtoon.shadingShiftFactor,
                ShadingToonyValue                          = mtoon.shadingToonyFactor,
                ShadowReceiveMultiplierValue               = mtoon.shadowReceiveMultiplierFactor,
                ShadowReceiveMultiplierMultiplyTexture     = GetTexture(MToon.Utils.PropReceiveShadowTexture, mtoon.shadowReceiveMultiplierMultiplyTexture),
                LitAndShadeMixingMultiplierValue           = mtoon.litAndShadeMixingMultiplierFactor,
                LitAndShadeMixingMultiplierMultiplyTexture = GetTexture(MToon.Utils.PropShadingGradeTexture, mtoon.litAndShadeMixingMultiplierMultiplyTexture),
            };
            mtoonDefinition.Lighting.LightingInfluence = new LightingInfluenceDefinition()
            {
                LightColorAttenuationValue = mtoon.lightColorAttenuationFactor,
                GiIntensityValue           = mtoon.giIntensityFactor,
            };
            mtoonDefinition.Lighting.Normal = new NormalDefinition()
            {
                NormalTexture    = GetTexture(MToon.Utils.PropBumpMap, mtoon.normalTexture),
                NormalScaleValue = mtoon.normalScaleFactor,
            };

            // Emission
            mtoonDefinition.Emission = new EmissionDefinition()
            {
                EmissionColor           = ArrayConverter.ToColor(mtoon.emissionFactor, gamma: true),
                EmissionMultiplyTexture = GetTexture(MToon.Utils.PropEmissionMap, mtoon.emissionMultiplyTexture),
            };

            // MatCap
            mtoonDefinition.MatCap = new MatCapDefinition()
            {
                AdditiveTexture = GetTexture(MToon.Utils.PropSphereAdd, mtoon.additiveTexture),
            };

            // Rim
            mtoonDefinition.Rim = new RimDefinition()
            {
                RimColor             = ArrayConverter.ToColor(mtoon.rimFactor, gamma: true),
                RimMultiplyTexture   = GetTexture(MToon.Utils.PropRimTexture, mtoon.rimMultiplyTexture),
                RimLightingMixValue  = mtoon.rimLightingMixFactor,
                RimFresnelPowerValue = mtoon.rimFresnelPowerFactor,
                RimLiftValue         = mtoon.rimLiftFactor,
            };

            // Outline
            mtoonDefinition.Outline = new OutlineDefinition()
            {
                OutlineWidthMode              = (MToon.OutlineWidthMode)mtoon.outlineWidthMode,
                OutlineWidthValue             = mtoon.outlineWidthFactor,
                OutlineWidthMultiplyTexture   = GetTexture(MToon.Utils.PropOutlineWidthTexture, mtoon.outlineWidthMultiplyTexture),
                OutlineScaledMaxDistanceValue = mtoon.outlineScaledMaxDistanceFactor,
                OutlineColorMode              = (MToon.OutlineColorMode)mtoon.outlineColorMode,
                OutlineColor            = ArrayConverter.ToColor(mtoon.outlineFactor, gamma: true),
                OutlineLightingMixValue = mtoon.outlineLightingMixFactor,
            };

            // Texture Option
            mtoonDefinition.TextureOption = new TextureUvCoordsDefinition()
            {
                MainTextureLeftBottomOriginScale  = ArrayConverter.ToVector2(mtoon.mainTextureLeftBottomOriginScale),
                MainTextureLeftBottomOriginOffset = ArrayConverter.ToVector2(mtoon.mainTextureLeftBottomOriginOffset),
                UvAnimationMaskTexture            = GetTexture(MToon.Utils.PropUvAnimMaskTexture, mtoon.uvAnimationMaskTexture),
                UvAnimationScrollXSpeedValue      = mtoon.uvAnimationScrollXSpeedFactor,
                UvAnimationScrollYSpeedValue      = mtoon.uvAnimationScrollYSpeedFactor,
                UvAnimationRotationSpeedValue     = mtoon.uvAnimationRotationSpeedFactor,
            };

            return(mtoonDefinition);
        }
Example #5
0
        /// <summary>
        /// Create a VRM MToon material.
        /// </summary>
        /// <param name="m"></param>
        /// <param name="textureManager"></param>
        /// <returns></returns>
        protected virtual glTFMaterial CreateVrmMtoonMaterial(Material m, TextureExportManager textureManager)
        {
            MToonDefinition mtoonDefinition = MToon.Utils.GetMToonParametersFromMaterial(m);

            var mtoon = new VRMC_materials_mtoon()
            {
                // Meta
                version = mtoonDefinition.Meta.VersionNumber.ToString(),

                // Rendering
                renderMode = (MToonRenderMode)mtoonDefinition.Rendering.RenderMode,
                cullMode   = (MToonCullMode)mtoonDefinition.Rendering.CullMode,
                renderQueueOffsetNumber = mtoonDefinition.Rendering.RenderQueueOffsetNumber,

                // Color
                litFactor             = mtoonDefinition.Color.LitColor.linear.ToArray(),
                litMultiplyTexture    = -1,
                shadeFactor           = mtoonDefinition.Color.ShadeColor.linear.ToArray(),
                shadeMultiplyTexture  = -1,
                cutoutThresholdFactor = mtoonDefinition.Color.CutoutThresholdValue,

                // Lighting
                shadingShiftFactor                         = mtoonDefinition.Lighting.LitAndShadeMixing.ShadingShiftValue,
                shadingToonyFactor                         = mtoonDefinition.Lighting.LitAndShadeMixing.ShadingToonyValue,
                shadowReceiveMultiplierFactor              = mtoonDefinition.Lighting.LitAndShadeMixing.ShadowReceiveMultiplierValue,
                shadowReceiveMultiplierMultiplyTexture     = -1,
                litAndShadeMixingMultiplierFactor          = mtoonDefinition.Lighting.LitAndShadeMixing.LitAndShadeMixingMultiplierValue,
                litAndShadeMixingMultiplierMultiplyTexture = -1,
                lightColorAttenuationFactor                = mtoonDefinition.Lighting.LightingInfluence.LightColorAttenuationValue,
                giIntensityFactor = mtoonDefinition.Lighting.LightingInfluence.GiIntensityValue,
                normalTexture     = -1,
                normalScaleFactor = mtoonDefinition.Lighting.Normal.NormalScaleValue,

                // Emission
                emissionFactor          = mtoonDefinition.Emission.EmissionColor.linear.ToArray(),
                emissionMultiplyTexture = -1,

                // MatCap
                additiveTexture = -1,

                // Rim
                rimFactor             = mtoonDefinition.Rim.RimColor.linear.ToArray(),
                rimMultiplyTexture    = -1,
                rimLightingMixFactor  = mtoonDefinition.Rim.RimLightingMixValue,
                rimFresnelPowerFactor = mtoonDefinition.Rim.RimFresnelPowerValue,
                rimLiftFactor         = mtoonDefinition.Rim.RimLiftValue,

                // Outline
                outlineWidthMode               = (MToonOutlineWidthMode)mtoonDefinition.Outline.OutlineWidthMode,
                outlineWidthFactor             = mtoonDefinition.Outline.OutlineWidthValue,
                outlineWidthMultiplyTexture    = -1,
                outlineScaledMaxDistanceFactor = mtoonDefinition.Outline.OutlineScaledMaxDistanceValue,
                outlineColorMode               = (MToonOutlineColorMode)mtoonDefinition.Outline.OutlineColorMode,
                outlineFactor            = mtoonDefinition.Outline.OutlineColor.linear.ToArray(),
                outlineLightingMixFactor = mtoonDefinition.Outline.OutlineLightingMixValue,

                // TextureOption
                mainTextureLeftBottomOriginScale = new float[]
                {
                    mtoonDefinition.TextureOption.MainTextureLeftBottomOriginScale.x,
                    mtoonDefinition.TextureOption.MainTextureLeftBottomOriginScale.y
                },
                mainTextureLeftBottomOriginOffset = new float[]
                {
                    mtoonDefinition.TextureOption.MainTextureLeftBottomOriginOffset.x,
                    mtoonDefinition.TextureOption.MainTextureLeftBottomOriginOffset.y
                },
                uvAnimationMaskTexture         = -1,
                uvAnimationScrollXSpeedFactor  = mtoonDefinition.TextureOption.UvAnimationScrollXSpeedValue,
                uvAnimationScrollYSpeedFactor  = mtoonDefinition.TextureOption.UvAnimationScrollYSpeedValue,
                uvAnimationRotationSpeedFactor = mtoonDefinition.TextureOption.UvAnimationRotationSpeedValue,
            };

            // Textures
            mtoon.litMultiplyTexture   = textureManager.CopyAndGetIndex(mtoonDefinition.Color.LitMultiplyTexture, RenderTextureReadWrite.sRGB);
            mtoon.shadeMultiplyTexture = textureManager.CopyAndGetIndex(mtoonDefinition.Color.ShadeMultiplyTexture, RenderTextureReadWrite.sRGB);
            mtoon.shadowReceiveMultiplierMultiplyTexture     = textureManager.CopyAndGetIndex(mtoonDefinition.Lighting.LitAndShadeMixing.ShadowReceiveMultiplierMultiplyTexture, RenderTextureReadWrite.sRGB);
            mtoon.litAndShadeMixingMultiplierMultiplyTexture = textureManager.CopyAndGetIndex(mtoonDefinition.Lighting.LitAndShadeMixing.LitAndShadeMixingMultiplierMultiplyTexture, RenderTextureReadWrite.sRGB);
            mtoon.normalTexture               = textureManager.ConvertAndGetIndex(mtoonDefinition.Lighting.Normal.NormalTexture, new NormalConverter());
            mtoon.emissionMultiplyTexture     = textureManager.CopyAndGetIndex(mtoonDefinition.Emission.EmissionMultiplyTexture, RenderTextureReadWrite.sRGB);
            mtoon.additiveTexture             = textureManager.CopyAndGetIndex(mtoonDefinition.MatCap.AdditiveTexture, RenderTextureReadWrite.sRGB);
            mtoon.rimMultiplyTexture          = textureManager.CopyAndGetIndex(mtoonDefinition.Rim.RimMultiplyTexture, RenderTextureReadWrite.sRGB);
            mtoon.outlineWidthMultiplyTexture = textureManager.CopyAndGetIndex(mtoonDefinition.Outline.OutlineWidthMultiplyTexture, RenderTextureReadWrite.sRGB);
            mtoon.uvAnimationMaskTexture      = textureManager.CopyAndGetIndex(mtoonDefinition.TextureOption.UvAnimationMaskTexture, RenderTextureReadWrite.sRGB);

            var material = CreateVrmDefaultMaterial(m, mtoonDefinition.Rendering.RenderMode);

            // Double Sided
            switch (mtoon.cullMode)
            {
            case MToonCullMode.Off:
                material.doubleSided = true;
                break;

            case MToonCullMode.Front:
            case MToonCullMode.Back:
                material.doubleSided = false;
                break;

            default:
                break;
            }

            // PBR Metallic Roughness
            {
                if (mtoon.litFactor != null)
                {
                    if (material.pbrMetallicRoughness == null)
                    {
                        material.pbrMetallicRoughness = new glTFPbrMetallicRoughness();
                    }

                    material.pbrMetallicRoughness.baseColorFactor = mtoon.litFactor;
                }

                if (mtoon.litMultiplyTexture != -1)
                {
                    if (material.pbrMetallicRoughness == null)
                    {
                        material.pbrMetallicRoughness = new glTFPbrMetallicRoughness();
                    }

                    material.pbrMetallicRoughness.baseColorTexture = new glTFMaterialBaseColorTextureInfo()
                    {
                        index = mtoon.litMultiplyTexture,
                    };

                    //material.pbrMetallicRoughness.metallicFactor = 1.0f;
                    //material.pbrMetallicRoughness.roughnessFactor = 1.0f;
                }
            }

            // Normal Texture
            if (mtoon.normalTexture != -1)
            {
                material.normalTexture = new glTFMaterialNormalTextureInfo()
                {
                    index = mtoon.normalTexture,
                    scale = mtoon.normalScaleFactor,
                };
            }

            // Emissive
            {
                material.emissiveFactor = mtoon.emissionFactor;

                if (mtoon.emissionMultiplyTexture != -1)
                {
                    material.emissiveTexture = new glTFMaterialEmissiveTextureInfo()
                    {
                        index = mtoon.emissionMultiplyTexture,
                    };
                }
            }

            // Extensions
            material.extensions = new glTFMaterial_extensions()
            {
                VGO_materials        = new VGO_materials(m.shader.name),
                VRMC_materials_mtoon = mtoon,
            };

            return(material);
        }