/// <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); }
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; } }
/// <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); }
/// <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); }