コード例 #1
0
        private static glTFMaterial Migrate(JsonNode vrm0XMaterial, string materialName, Dictionary <int, int> renderQueueMapper)
        {
            try
            {
                if (MigrationMaterialUtil.GetShaderName(vrm0XMaterial) != Unity0XShaderName)
                {
                    return(null);
                }

                var baseColorFactor  = MigrationMaterialUtil.GetBaseColorFactor(vrm0XMaterial);
                var baseColorTexture = MigrationMaterialUtil.GetBaseColorTexture(vrm0XMaterial);
                var emissiveTexture  = new glTFMaterialEmissiveTextureInfo
                {
                    index      = baseColorTexture.index,
                    extensions = baseColorTexture.extensions,
                };
                var renderQueue       = MigrationMaterialUtil.GetRenderQueue(vrm0XMaterial) ?? Unity0XDefaultRenderQueue;
                var renderQueueOffset = renderQueueMapper.ContainsKey(renderQueue) ? renderQueueMapper[renderQueue] : 0;

                var mtoonMaterial = new glTFMaterial
                {
                    name       = materialName,
                    extensions = new glTFExtensionExport().Add(
                        glTF_KHR_materials_unlit.ExtensionName,
                        new ArraySegment <byte>(glTF_KHR_materials_unlit.Raw)
                        ),
                    pbrMetallicRoughness = new glTFPbrMetallicRoughness
                    {
                        baseColorFactor  = new[] { 0f, 0f, 0f, baseColorFactor[3] }, // black + _Color.a
                        baseColorTexture = baseColorTexture,                         // _MainTex
                        metallicFactor   = 0f,
                        roughnessFactor  = 1f,
                    },
                    alphaMode       = "BLEND",
                    alphaCutoff     = 0.5f,
                    doubleSided     = false,
                    emissiveFactor  = new[] { baseColorFactor[0], baseColorFactor[1], baseColorFactor[2] }, // _Color.rgb
                    emissiveTexture = emissiveTexture,
                };

                var mtoon10 = new VRMC_materials_mtoon
                {
                    SpecVersion             = Vrm10Exporter.MTOON_SPEC_VERSION,
                    TransparentWithZWrite   = true,                 // transparent with zWrite
                    RenderQueueOffsetNumber = renderQueueOffset,
                    ShadeColorFactor        = new[] { 0f, 0f, 0f }, // black
                    OutlineWidthMode        = OutlineWidthMode.none // disable outline
                };
                UniGLTF.Extensions.VRMC_materials_mtoon.GltfSerializer.SerializeTo(ref mtoonMaterial.extensions,
                                                                                   mtoon10);

                return(mtoonMaterial);
            }
            catch (Exception)
            {
                Debug.LogWarning($"Migration failed in VRM/UnlitTransparentZWrite material: {materialName}");
                return(null);
            }
        }
コード例 #2
0
        public static int?TryGetRenderQueue(glTFMaterial material, VRMC_materials_mtoon mToon)
        {
            var renderQueueOffset = mToon?.RenderQueueOffsetNumber;

            if (renderQueueOffset.HasValue)
            {
                var renderMode = GetMToonRenderMode(material, mToon);
                return(MToon.Utils.GetRenderQueueRequirement(renderMode).DefaultValue +
                       renderQueueOffset.Value);
            }
            return(default);
コード例 #3
0
        public static void Migrate(glTF gltf, JsonNode json)
        {
            for (int i = 0; i < gltf.materials.Count; ++i)
            {
                var vrmMaterial = json["extensions"]["VRM"]["materialProperties"][i];
                if (vrmMaterial["shader"].GetString() != "VRM/MToon")
                {
                    continue;
                }

                // VRM-0 MToon の情報
                var mtoon = MToonValue.Create(vrmMaterial);

                // KHR_materials_unlit として fallback した情報が入っている
                var gltfMaterial = gltf.materials[i];
                if (!glTF_KHR_materials_unlit.IsEnable(gltfMaterial))
                {
                    // 古いモデルは無い場合がある
                    // throw new Exception($"[{i}]{gltfMaterial.name} has no extensions");
                }

                var extensions = new glTFExtensionExport();
                gltfMaterial.extensions = extensions;
                extensions.Add(
                    glTF_KHR_materials_unlit.ExtensionName,
                    new ArraySegment <byte>(glTF_KHR_materials_unlit.Raw));

                //
                // definition の中身を gltfMaterial と gltfMaterial.extensions.VRMC_materials_mtoon に移し替える
                //
                var dst = new VRMC_materials_mtoon();

                // Color
                gltfMaterial.pbrMetallicRoughness.baseColorFactor = mtoon.Definition.Color.LitColor.ToFloat4();
                if (mtoon.TextureIndexMap.MainTex.HasValue)
                {
                    gltfMaterial.pbrMetallicRoughness.baseColorTexture = new glTFMaterialBaseColorTextureInfo
                    {
                        index = mtoon.TextureIndexMap.MainTex.Value
                    };
                    if (!mtoon.OffsetScale.TryGetValue("_MainTex", out float[] value))
コード例 #4
0
 private static bool TryGetUvAnimationMaskTexture(GltfParser parser, VRMC_materials_mtoon mToon, out (SubAssetKey, TextureImportParam) pair)
 {
     return(TryGetLinearTexture(parser, new Vrm10TextureInfo(mToon.UvAnimationMaskTexture), out pair));
 }
コード例 #5
0
 private static bool TryGetOutlineWidthMultiplyTexture(GltfParser parser, VRMC_materials_mtoon mToon, out (SubAssetKey, TextureImportParam) pair)
 {
     return(TryGetLinearTexture(parser, new Vrm10TextureInfo(mToon.OutlineWidthMultiplyTexture), out pair));
 }
コード例 #6
0
 private static bool TryGetMatcapTexture(GltfData data, VRMC_materials_mtoon mToon, out (SubAssetKey, TextureDescriptor) pair)
 {
     return(TryGetSRGBTexture(data, new Vrm10TextureInfo(mToon.ShadingShiftTexture), out pair));
 }
コード例 #7
0
        public static IEnumerable <(string key, Color value)> TryGetAllColors(glTFMaterial material, VRMC_materials_mtoon mToon)
        {
            const ColorSpace gltfColorSpace = ColorSpace.Linear;

            var baseColor = material?.pbrMetallicRoughness?.baseColorFactor?.ToColor4(gltfColorSpace, ColorSpace.sRGB);

            if (baseColor.HasValue)
            {
                yield return(MToon.Utils.PropColor, baseColor.Value);
            }

            var emissionColor = material?.emissiveFactor?.ToColor3(gltfColorSpace, ColorSpace.Linear);

            if (emissionColor.HasValue)
            {
                yield return(MToon.Utils.PropEmissionColor, emissionColor.Value);
            }

            var shadeColor = mToon?.ShadeColorFactor?.ToColor3(gltfColorSpace, ColorSpace.sRGB);

            if (shadeColor.HasValue)
            {
                yield return(MToon.Utils.PropShadeColor, shadeColor.Value);
            }

            var rimColor = mToon?.ParametricRimColorFactor?.ToColor3(gltfColorSpace, ColorSpace.Linear);

            if (rimColor.HasValue)
            {
                yield return(MToon.Utils.PropRimColor, rimColor.Value);
            }

            var outlineColor = mToon?.OutlineColorFactor?.ToColor3(gltfColorSpace, ColorSpace.sRGB);

            if (outlineColor.HasValue)
            {
                yield return(MToon.Utils.PropOutlineColor, outlineColor.Value);
            }
        }
コード例 #8
0
        private static MToon10OutlineMode GetMToon10OutlineWidthMode(glTFMaterial material, VRMC_materials_mtoon mToon)
        {
            switch (mToon?.OutlineWidthMode)
            {
            case OutlineWidthMode.none:
                return(MToon10OutlineMode.None);

            case OutlineWidthMode.worldCoordinates:
                return(MToon10OutlineMode.World);

            case OutlineWidthMode.screenCoordinates:
                return(MToon10OutlineMode.Screen);

            default:
                // Invalid
                Debug.LogWarning("Invalid outlineWidthMode");
                return(MToon10OutlineMode.None);
            }
        }
コード例 #9
0
 private static MToon10TransparentWithZWriteMode GetMToon10TransparentWithZWriteMode(glTFMaterial material, VRMC_materials_mtoon mtoon)
 {
     if (mtoon?.TransparentWithZWrite == true)
     {
         return(MToon10TransparentWithZWriteMode.On);
     }
     else
     {
         return(MToon10TransparentWithZWriteMode.Off);
     }
 }
コード例 #10
0
ファイル: VgoMaterialImporter.cs プロジェクト: bmjoy/VGO
        /// <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);
        }
コード例 #11
0
 private static bool TryGetUvAnimationMaskTexture(GltfData data, VRMC_materials_mtoon mToon, out (SubAssetKey, TextureDescriptor) pair)
 {
     return(TryGetLinearTexture(data, new Vrm10TextureInfo(mToon.UvAnimationMaskTexture), out pair));
 }
コード例 #12
0
 private static bool TryGetOutlineWidthMultiplyTexture(GltfData data, VRMC_materials_mtoon mToon, out (SubAssetKey, TextureDescriptor) pair)
 {
     return(TryGetLinearTexture(data, new Vrm10TextureInfo(mToon.OutlineWidthMultiplyTexture), out pair));
 }
コード例 #13
0
 private static bool TryGetRimMultiplyTexture(GltfData data, VRMC_materials_mtoon mToon, out (SubAssetKey, TextureDescriptor) pair)
 {
     return(TryGetSRGBTexture(data, new Vrm10TextureInfo(mToon.RimMultiplyTexture), out pair));
 }
コード例 #14
0
        public static IEnumerable <(string key, (SubAssetKey, TextureDescriptor))> EnumerateAllTextures(GltfData data, glTFMaterial material, VRMC_materials_mtoon mToon)
        {
            if (TryGetBaseColorTexture(data, material, out var litTex))
            {
                yield return(MToon10Prop.BaseColorTexture.ToUnityShaderLabName(), litTex);
            }

            if (TryGetEmissiveTexture(data, material, out var emissiveTex))
            {
                yield return(MToon10Prop.EmissiveTexture.ToUnityShaderLabName(), emissiveTex);
            }

            if (TryGetNormalTexture(data, material, out var normalTex))
            {
                yield return(MToon10Prop.NormalTexture.ToUnityShaderLabName(), normalTex);
            }

            if (TryGetShadeMultiplyTexture(data, mToon, out var shadeTex))
            {
                yield return(MToon10Prop.ShadeColorTexture.ToUnityShaderLabName(), shadeTex);
            }

            if (TryGetShadingShiftTexture(data, mToon, out var shadeShiftTex))
            {
                yield return(MToon10Prop.ShadingShiftTexture.ToUnityShaderLabName(), shadeShiftTex);
            }

            if (TryGetMatcapTexture(data, mToon, out var matcapTex))
            {
                yield return(MToon10Prop.MatcapTexture.ToUnityShaderLabName(), matcapTex);
            }

            if (TryGetRimMultiplyTexture(data, mToon, out var rimTex))
            {
                yield return(MToon10Prop.RimMultiplyTexture.ToUnityShaderLabName(), rimTex);
            }

            if (TryGetOutlineWidthMultiplyTexture(data, mToon, out var outlineTex))
            {
                yield return(MToon10Prop.OutlineWidthMultiplyTexture.ToUnityShaderLabName(), outlineTex);
            }

            if (TryGetUvAnimationMaskTexture(data, mToon, out var uvAnimMaskTex))
            {
                yield return(MToon10Prop.UvAnimationMaskTexture.ToUnityShaderLabName(), uvAnimMaskTex);
            }
        }
コード例 #15
0
        public static glTFMaterial MToonToGltf(this MToonMaterial mtoon, List <Texture> textures)
        {
            var material = mtoon.UnlitToGltf(textures);

            var dst = new VRMC_materials_mtoon();

            // Color
            material.pbrMetallicRoughness.baseColorFactor = mtoon.Definition.Color.LitColor.ToFloat4();
            if (mtoon.Definition.Color.LitMultiplyTexture != null)
            {
                material.pbrMetallicRoughness.baseColorTexture = new glTFMaterialBaseColorTextureInfo
                {
                    index = mtoon.Definition.Color.LitMultiplyTexture.ToIndex(textures).Value
                };
            }
            dst.ShadeFactor          = mtoon.Definition.Color.ShadeColor.ToFloat3();
            dst.ShadeMultiplyTexture = mtoon.Definition.Color.ShadeMultiplyTexture.ToIndex(textures);
            material.alphaCutoff     = mtoon.Definition.Color.CutoutThresholdValue;

            // Outline
            dst.OutlineColorMode               = (UniGLTF.Extensions.VRMC_materials_mtoon.OutlineColorMode)mtoon.Definition.Outline.OutlineColorMode;
            dst.OutlineFactor                  = mtoon.Definition.Outline.OutlineColor.ToFloat3();
            dst.OutlineLightingMixFactor       = mtoon.Definition.Outline.OutlineLightingMixValue;
            dst.OutlineScaledMaxDistanceFactor = mtoon.Definition.Outline.OutlineScaledMaxDistanceValue;
            dst.OutlineWidthMode               = (UniGLTF.Extensions.VRMC_materials_mtoon.OutlineWidthMode)mtoon.Definition.Outline.OutlineWidthMode;
            dst.OutlineWidthFactor             = mtoon.Definition.Outline.OutlineWidthValue;
            dst.OutlineWidthMultiplyTexture    = mtoon.Definition.Outline.OutlineWidthMultiplyTexture.ToIndex(textures);

            // Emission
            material.emissiveFactor = mtoon.Definition.Emission.EmissionColor.ToFloat3();
            if (mtoon.Definition.Emission.EmissionMultiplyTexture != null)
            {
                material.emissiveTexture = new glTFMaterialEmissiveTextureInfo
                {
                    index = textures.IndexOfNullable(mtoon.Definition.Emission.EmissionMultiplyTexture.Texture).Value
                };
            }

            // Light
            dst.GiIntensityFactor           = mtoon.Definition.Lighting.LightingInfluence.GiIntensityValue;
            dst.LightColorAttenuationFactor = mtoon.Definition.Lighting.LightingInfluence.LightColorAttenuationValue;
            dst.ShadingShiftFactor          = mtoon.Definition.Lighting.LitAndShadeMixing.ShadingShiftValue;
            dst.ShadingToonyFactor          = mtoon.Definition.Lighting.LitAndShadeMixing.ShadingToonyValue;
            if (mtoon.Definition.Lighting.Normal.NormalTexture != null)
            {
                material.normalTexture = new glTFMaterialNormalTextureInfo
                {
                    index = textures.IndexOfNullable(mtoon.Definition.Lighting.Normal.NormalTexture.Texture).Value,
                    scale = mtoon.Definition.Lighting.Normal.NormalScaleValue
                };
            }

            // matcap
            dst.AdditiveTexture = mtoon.Definition.MatCap.AdditiveTexture.ToIndex(textures);

            // rendering
            switch (mtoon.Definition.Rendering.CullMode)
            {
            case CullMode.Back:
                material.doubleSided = false;
                break;

            case CullMode.Off:
                material.doubleSided = true;
                break;

            case CullMode.Front:
                // GLTF not support
                material.doubleSided = false;
                break;

            default:
                throw new NotImplementedException();
            }
            (material.alphaMode, dst.TransparentWithZWrite) = GetRenderMode(mtoon.Definition.Rendering.RenderMode);
            dst.RenderQueueOffsetNumber = mtoon.Definition.Rendering.RenderQueueOffsetNumber;

            // rim
            dst.RimFactor             = mtoon.Definition.Rim.RimColor.ToFloat3();
            dst.RimMultiplyTexture    = mtoon.Definition.Rim.RimMultiplyTexture.ToIndex(textures);
            dst.RimLiftFactor         = mtoon.Definition.Rim.RimLiftValue;
            dst.RimFresnelPowerFactor = mtoon.Definition.Rim.RimFresnelPowerValue;
            dst.RimLightingMixFactor  = mtoon.Definition.Rim.RimLightingMixValue;

            // texture option
            dst.UvAnimationMaskTexture         = mtoon.Definition.TextureOption.UvAnimationMaskTexture.ToIndex(textures);
            dst.UvAnimationRotationSpeedFactor = mtoon.Definition.TextureOption.UvAnimationRotationSpeedValue;
            dst.UvAnimationScrollXSpeedFactor  = mtoon.Definition.TextureOption.UvAnimationScrollXSpeedValue;
            dst.UvAnimationScrollYSpeedFactor  = mtoon.Definition.TextureOption.UvAnimationScrollYSpeedValue;
            if (material.pbrMetallicRoughness.baseColorTexture != null)
            {
                var offset = mtoon.Definition.TextureOption.MainTextureLeftBottomOriginOffset;
                var scale  = mtoon.Definition.TextureOption.MainTextureLeftBottomOriginScale;
                glTF_KHR_texture_transform.Serialize(
                    material.pbrMetallicRoughness.baseColorTexture,
                    (offset.X, offset.Y),
                    (scale.X, scale.Y)
                    );
            }

            UniGLTF.Extensions.VRMC_materials_mtoon.GltfSerializer.SerializeTo(ref material.extensions, dst);

            return(material);
        }
コード例 #16
0
        public static IEnumerable <(string key, float value)> TryGetAllFloats(glTFMaterial material, VRMC_materials_mtoon mToon)
        {
            // Rendering
            var alphaMode = GetMToon10AlphaMode(material);
            {
                yield return(MToon10Prop.AlphaMode.ToUnityShaderLabName(), (float)alphaMode);
            }

            var transparentWithZWrite = GetMToon10TransparentWithZWriteMode(material, mToon);
            {
                yield return(MToon10Prop.TransparentWithZWrite.ToUnityShaderLabName(), (float)transparentWithZWrite);
            }

            var cutoff = material?.alphaCutoff;

            if (cutoff.HasValue)
            {
                yield return(MToon10Prop.AlphaCutoff.ToUnityShaderLabName(), cutoff.Value);
            }

            var renderQueueOffset = mToon?.RenderQueueOffsetNumber;

            if (renderQueueOffset.HasValue)
            {
                yield return(MToon10Prop.RenderQueueOffsetNumber.ToUnityShaderLabName(), (float)renderQueueOffset);
            }

            var doubleSidedMode = GetMToon10DoubleSidedMode(material, mToon);
            {
                yield return(MToon10Prop.DoubleSided.ToUnityShaderLabName(), (float)doubleSidedMode);
            }

            // Lighting
            var normalScale = material?.normalTexture?.scale;

            if (normalScale.HasValue)
            {
                yield return(MToon10Prop.NormalTextureScale.ToUnityShaderLabName(), normalScale.Value);
            }

            var shadingShift = mToon?.ShadingShiftFactor;

            if (shadingShift.HasValue)
            {
                yield return(MToon10Prop.ShadingShiftFactor.ToUnityShaderLabName(), shadingShift.Value);
            }

            var shadingShiftTextureScale = mToon?.ShadingShiftTexture?.Scale;

            if (shadingShiftTextureScale.HasValue)
            {
                yield return(MToon10Prop.ShadingShiftTextureScale.ToUnityShaderLabName(), shadingShiftTextureScale.Value);
            }

            var shadingToony = mToon?.ShadingToonyFactor;

            if (shadingToony.HasValue)
            {
                yield return(MToon10Prop.ShadingToonyFactor.ToUnityShaderLabName(), shadingToony.Value);
            }

            // GI
            var giEqualization = mToon?.GiEqualizationFactor;

            if (giEqualization.HasValue)
            {
                yield return(MToon10Prop.GiEqualizationFactor.ToUnityShaderLabName(), giEqualization.Value);
            }

            // Emission

            // Rim Lighting
            var rimFresnelPower = mToon?.ParametricRimFresnelPowerFactor;

            if (rimFresnelPower.HasValue)
            {
                yield return(MToon10Prop.ParametricRimFresnelPowerFactor.ToUnityShaderLabName(), rimFresnelPower.Value);
            }

            var rimLift = mToon?.ParametricRimLiftFactor;

            if (rimLift.HasValue)
            {
                yield return(MToon10Prop.ParametricRimLiftFactor.ToUnityShaderLabName(), rimLift.Value);
            }

            var rimLightMix = mToon?.RimLightingMixFactor;

            if (rimLightMix.HasValue)
            {
                yield return(MToon10Prop.RimLightingMixFactor.ToUnityShaderLabName(), rimLightMix.Value);
            }

            // Outline
            var outlineMode = GetMToon10OutlineWidthMode(material, mToon);
            {
                yield return(MToon10Prop.OutlineWidthMode.ToUnityShaderLabName(), (float)outlineMode);
            }

            var outlineWidth = mToon?.OutlineWidthFactor;

            if (outlineWidth.HasValue)
            {
                yield return(MToon10Prop.OutlineWidthFactor.ToUnityShaderLabName(), outlineWidth.Value);
            }

            var outlineLightMix = mToon?.OutlineLightingMixFactor;

            if (outlineLightMix.HasValue)
            {
                yield return(MToon10Prop.OutlineLightingMixFactor.ToUnityShaderLabName(), outlineLightMix.Value);
            }

            // UV Animation
            var uvAnimSpeedScrollX = mToon?.UvAnimationScrollXSpeedFactor;

            if (uvAnimSpeedScrollX.HasValue)
            {
                yield return(MToon10Prop.UvAnimationScrollXSpeedFactor.ToUnityShaderLabName(), uvAnimSpeedScrollX.Value);
            }

            var uvAnimSpeedScrollY = mToon?.UvAnimationScrollYSpeedFactor;

            if (uvAnimSpeedScrollY.HasValue)
            {
                // UV coords conversion.
                // glTF (top-left origin) to Unity (bottom-left origin)
                const float invertY = -1f;

                yield return(MToon10Prop.UvAnimationScrollYSpeedFactor.ToUnityShaderLabName(), uvAnimSpeedScrollY.Value *invertY);
            }

            var uvAnimSpeedRotation = mToon?.UvAnimationRotationSpeedFactor;

            if (uvAnimSpeedRotation.HasValue)
            {
                yield return(MToon10Prop.UvAnimationRotationSpeedFactor.ToUnityShaderLabName(), uvAnimSpeedRotation.Value);
            }

            // UI
            if (true /* TODO: mToon.IsAdvancedMode */)
            {
                yield return(MToon10Prop.EditorEditMode.ToUnityShaderLabName(), 1);
            }
        }
コード例 #17
0
        public static MToonMaterial MToonFromGltf(glTFMaterial material, List <Texture> textures, VRMC_materials_mtoon extension)
        {
            var mtoon = new MToonMaterial(material.name);

            var Meta = new MetaDefinition
            {
                Implementation = "Santarh/MToon",
            };
            var Color = new ColorDefinition
            {
                LitColor             = material.pbrMetallicRoughness.baseColorFactor.ToLinearColor(Nan),
                LitMultiplyTexture   = material.pbrMetallicRoughness.baseColorTexture?.index.GetTexture(textures),
                ShadeColor           = extension.ShadeFactor.ToLinearColor(Nan),
                ShadeMultiplyTexture = extension.ShadeMultiplyTexture.GetTexture(textures),
                CutoutThresholdValue = material.alphaCutoff,
            };
            var Outline = new OutlineDefinition
            {
                OutlineColorMode              = (VrmLib.MToon.OutlineColorMode)extension.OutlineColorMode,
                OutlineColor                  = extension.OutlineFactor.ToLinearColor(Nan),
                OutlineLightingMixValue       = extension.OutlineLightingMixFactor.Value,
                OutlineScaledMaxDistanceValue = extension.OutlineScaledMaxDistanceFactor.Value,
                OutlineWidthMode              = (VrmLib.MToon.OutlineWidthMode)extension.OutlineWidthMode,
                OutlineWidthValue             = extension.OutlineWidthFactor.Value,
                OutlineWidthMultiplyTexture   = extension.OutlineWidthMultiplyTexture.GetTexture(textures),
            };
            var Emission = new EmissionDefinition
            {
                EmissionColor = material.emissiveFactor.ToLinearColor(Nan),
            };

            if (material.emissiveTexture != null)
            {
                Emission.EmissionMultiplyTexture = material.emissiveTexture.index.GetTexture(textures);
            }

            var Lighting = new LightingDefinition
            {
                LightingInfluence = new LightingInfluenceDefinition
                {
                    GiIntensityValue           = extension.GiIntensityFactor.Value,
                    LightColorAttenuationValue = extension.LightColorAttenuationFactor.Value,
                },
                LitAndShadeMixing = new LitAndShadeMixingDefinition
                {
                    ShadingShiftValue = extension.ShadingShiftFactor.Value,
                    ShadingToonyValue = extension.ShadingToonyFactor.Value,
                },
                Normal = new NormalDefinition
                {
                },
            };

            if (material.normalTexture != null)
            {
                Lighting.Normal.NormalScaleValue = material.normalTexture.scale;
                Lighting.Normal.NormalTexture    = material.normalTexture.index.GetTexture(textures);
            }

            var MatCap = new MatCapDefinition
            {
                AdditiveTexture = extension.AdditiveTexture.GetTexture(textures)
            };
            var Rendering = new RenderingDefinition
            {
                CullMode   = material.doubleSided ? CullMode.Off : CullMode.Back,
                RenderMode = GetRenderMode(material.alphaMode, extension.TransparentWithZWrite.Value),
                RenderQueueOffsetNumber = extension.RenderQueueOffsetNumber.Value,
            };
            var Rim = new RimDefinition
            {
                RimColor             = extension.RimFactor.ToLinearColor(Nan),
                RimMultiplyTexture   = extension.RimMultiplyTexture.GetTexture(textures),
                RimLiftValue         = extension.RimLiftFactor.Value,
                RimFresnelPowerValue = extension.RimFresnelPowerFactor.Value,
                RimLightingMixValue  = extension.RimLightingMixFactor.Value,
            };

            var TextureOption = new TextureUvCoordsDefinition
            {
                UvAnimationMaskTexture        = extension.UvAnimationMaskTexture.GetTexture(textures),
                UvAnimationRotationSpeedValue = extension.UvAnimationRotationSpeedFactor.Value,
                UvAnimationScrollXSpeedValue  = extension.UvAnimationScrollXSpeedFactor.Value,
                UvAnimationScrollYSpeedValue  = extension.UvAnimationScrollYSpeedFactor.Value,
            };

            if (glTF_KHR_texture_transform.TryGet(material.pbrMetallicRoughness.baseColorTexture, out glTF_KHR_texture_transform t))
            {
                TextureOption.MainTextureLeftBottomOriginOffset = t.offset.ToVector2();
                TextureOption.MainTextureLeftBottomOriginScale  = t.scale.ToVector2();
            }

            mtoon.Definition = new MToonDefinition
            {
                Meta          = Meta,
                Color         = Color,
                Outline       = Outline,
                Emission      = Emission,
                Lighting      = Lighting,
                MatCap        = MatCap,
                Rendering     = Rendering,
                Rim           = Rim,
                TextureOption = TextureOption,
            };

            return(mtoon);
        }
コード例 #18
0
 private static MToon10DoubleSidedMode GetMToon10DoubleSidedMode(glTFMaterial material, VRMC_materials_mtoon mToon)
 {
     if (material?.doubleSided == true)
     {
         return(MToon10DoubleSidedMode.On);
     }
     else
     {
         return(MToon10DoubleSidedMode.Off);
     }
 }
コード例 #19
0
        public static IEnumerable <(string key, (SubAssetKey, TextureImportParam))> TryGetAllTextures(GltfParser parser, glTFMaterial material, VRMC_materials_mtoon mToon)
        {
            if (TryGetBaseColorTexture(parser, material, out var litTex))
            {
                yield return(MToon.Utils.PropMainTex, litTex);
            }

            if (TryGetEmissiveTexture(parser, material, out var emissiveTex))
            {
                yield return(MToon.Utils.PropEmissionMap, emissiveTex);
            }

            if (TryGetNormalTexture(parser, material, out var normalTex))
            {
                yield return("_BumpMap", normalTex);
            }

            if (TryGetShadeMultiplyTexture(parser, mToon, out var shadeTex))
            {
                yield return(MToon.Utils.PropShadeTexture, shadeTex);
            }

            if (TryGetShadingShiftTexture(parser, mToon, out var shadeShiftTex))
            {
                Debug.LogWarning("Need VRM 1.0 MToon implementation.");
                yield return("_NEED_IMPLEMENTATION_MTOON_1_0_shadingShiftTexture", shadeShiftTex);
            }

            if (TryGetMatcapTexture(parser, mToon, out var matcapTex))
            {
                yield return(MToon.Utils.PropSphereAdd, matcapTex);
            }

            if (TryGetRimMultiplyTexture(parser, mToon, out var rimTex))
            {
                yield return(MToon.Utils.PropRimTexture, rimTex);
            }

            if (TryGetOutlineWidthMultiplyTexture(parser, mToon, out var outlineTex))
            {
                yield return(MToon.Utils.PropOutlineWidthTexture, outlineTex);
            }

            if (TryGetUvAnimationMaskTexture(parser, mToon, out var uvAnimMaskTex))
            {
                yield return(MToon.Utils.PropUvAnimMaskTexture, uvAnimMaskTex);
            }
        }
コード例 #20
0
        public static IEnumerable <(string key, Color value)> TryGetAllColors(glTFMaterial material, VRMC_materials_mtoon mToon)
        {
            const ColorSpace gltfColorSpace = ColorSpace.Linear;

            // Rendering
            var baseColor = material?.pbrMetallicRoughness?.baseColorFactor?.ToColor4(gltfColorSpace, ColorSpace.sRGB);

            if (baseColor.HasValue)
            {
                yield return(MToon10Prop.BaseColorFactor.ToUnityShaderLabName(), baseColor.Value);
            }

            // Lighting
            var shadeColor = mToon?.ShadeColorFactor?.ToColor3(gltfColorSpace, ColorSpace.sRGB);

            if (shadeColor.HasValue)
            {
                yield return(MToon10Prop.ShadeColorFactor.ToUnityShaderLabName(), shadeColor.Value);
            }

            // GI

            // Emission
            // Emissive factor should be stored in Linear space
            var emissionColor = material?.emissiveFactor?.ToColor3(gltfColorSpace, ColorSpace.Linear);

            if (emissionColor.HasValue)
            {
                yield return(MToon10Prop.EmissiveFactor.ToUnityShaderLabName(), emissionColor.Value);
            }

            // Rim Lighting
            var rimColor = mToon?.ParametricRimColorFactor?.ToColor3(gltfColorSpace, ColorSpace.sRGB);

            if (rimColor.HasValue)
            {
                yield return(MToon10Prop.ParametricRimColorFactor.ToUnityShaderLabName(), rimColor.Value);
            }

            // Outline
            var outlineColor = mToon?.OutlineColorFactor?.ToColor3(gltfColorSpace, ColorSpace.sRGB);

            if (outlineColor.HasValue)
            {
                yield return(MToon10Prop.OutlineColorFactor.ToUnityShaderLabName(), outlineColor.Value);
            }

            // UV Animation
        }
コード例 #21
0
 private static bool TryGetMatcapTexture(GltfParser parser, VRMC_materials_mtoon mToon, out (SubAssetKey, TextureImportParam) pair)
 {
     return(TryGetSRGBTexture(parser, new Vrm10TextureInfo(mToon.ShadingShiftTexture), out pair));
 }
コード例 #22
0
 public static IEnumerable <(string key, Vector4 value)> TryGetAllFloatArrays(glTFMaterial material, VRMC_materials_mtoon mToon)
 {
     yield break;
 }
コード例 #23
0
 private static bool TryGetRimMultiplyTexture(GltfParser parser, VRMC_materials_mtoon mToon, out (SubAssetKey, TextureImportParam) pair)
 {
     return(TryGetSRGBTexture(parser, new Vrm10TextureInfo(mToon.RimMultiplyTexture), out pair));
 }
コード例 #24
0
        public static IEnumerable <(string key, float value)> TryGetAllFloats(glTFMaterial material, VRMC_materials_mtoon mToon)
        {
            var renderMode = GetMToonRenderMode(material, mToon);
            {
                yield return(MToon.Utils.PropBlendMode, (float)renderMode);
            }

            var cullMode = GetMToonCullMode(material, mToon);
            {
                yield return(MToon.Utils.PropCullMode, (float)cullMode);
            }

            var outlineMode = GetMToonOutlineWidthMode(material, mToon);
            {
                yield return(MToon.Utils.PropOutlineWidthMode, (float)outlineMode);

                // In case of VRM 1.0 MToon, outline color mode is always MixedLighting.
                yield return(MToon.Utils.PropOutlineColorMode, (float)MToon.OutlineColorMode.MixedLighting);
            }

            var cutoff = material?.alphaCutoff;

            if (cutoff.HasValue)
            {
                yield return(MToon.Utils.PropCutoff, cutoff.Value);
            }

            var normalScale = material?.normalTexture?.scale;

            if (normalScale.HasValue)
            {
                yield return("_BumpScale", normalScale.Value);
            }

            var shadingShift = mToon?.ShadingShiftFactor;

            if (shadingShift.HasValue)
            {
                yield return(MToon.Utils.PropShadeShift, shadingShift.Value);
            }

            var shadingShiftTextureScale = mToon?.ShadingShiftTexture?.Scale;

            if (shadingShiftTextureScale.HasValue)
            {
                Debug.LogWarning("Need VRM 1.0 MToon implementation.");
                yield return("_NEED_IMPLEMENTATION_MTOON_1_0_shadingShiftTextureScale", shadingShiftTextureScale.Value);
            }

            var shadingToony = mToon?.ShadingToonyFactor;

            if (shadingToony.HasValue)
            {
                yield return(MToon.Utils.PropShadeToony, shadingToony.Value);
            }

            var giIntensity = mToon?.GiIntensityFactor;

            if (giIntensity.HasValue)
            {
                yield return(MToon.Utils.PropIndirectLightIntensity, giIntensity.Value);
            }

            var rimLightMix = mToon?.RimLightingMixFactor;

            if (rimLightMix.HasValue)
            {
                yield return(MToon.Utils.PropRimLightingMix, rimLightMix.Value);
            }

            var rimFresnelPower = mToon?.ParametricRimFresnelPowerFactor;

            if (rimFresnelPower.HasValue)
            {
                yield return(MToon.Utils.PropRimFresnelPower, rimFresnelPower.Value);
            }

            var rimLift = mToon?.ParametricRimLiftFactor;

            if (rimLift.HasValue)
            {
                yield return(MToon.Utils.PropRimLift, rimLift.Value);
            }

            // Unit conversion.
            // Because Unity implemented MToon uses centimeter unit in width parameter.
            var outlineWidth = mToon?.OutlineWidthFactor;

            if (outlineWidth.HasValue)
            {
                const float meterToCentimeter = 100f;

                yield return(MToon.Utils.PropOutlineWidth, outlineWidth.Value *meterToCentimeter);
            }

            var outlineLightMix = mToon?.OutlineLightingMixFactor;

            if (outlineLightMix.HasValue)
            {
                yield return(MToon.Utils.PropOutlineLightingMix, outlineLightMix.Value);
            }

            var uvAnimSpeedScrollX = mToon?.UvAnimationScrollXSpeedFactor;

            if (uvAnimSpeedScrollX.HasValue)
            {
                yield return(MToon.Utils.PropUvAnimScrollX, uvAnimSpeedScrollX.Value);
            }

            // UV coords conversion.
            // glTF (top-left origin) to Unity (bottom-left origin)
            var uvAnimSpeedScrollY = mToon?.UvAnimationScrollYSpeedFactor;

            if (uvAnimSpeedScrollY.HasValue)
            {
                const float invertY = -1f;

                yield return(MToon.Utils.PropUvAnimScrollY, uvAnimSpeedScrollY.Value *invertY);
            }

            var uvAnimSpeedRotation = mToon?.UvAnimationRotationSpeedFactor;

            if (uvAnimSpeedRotation.HasValue)
            {
                yield return(MToon.Utils.PropUvAnimRotation, uvAnimSpeedRotation.Value);
            }
        }
コード例 #25
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);
        }