diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/GltfPBRMaterial.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/GltfPBRMaterial.cs index 434a8b826..b38096100 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/GltfPBRMaterial.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/GltfPBRMaterial.cs @@ -1,8 +1,6 @@ -using System.Threading.Tasks; -using UnityEngine; +using UnityEngine; using VRMShaders; - namespace UniGLTF { /// @@ -103,8 +101,9 @@ namespace UniGLTF if (src.pbrMetallicRoughness.baseColorFactor != null && src.pbrMetallicRoughness.baseColorFactor.Length == 4) { - var color = src.pbrMetallicRoughness.baseColorFactor; - param.Colors.Add("_Color", (new Color(color[0], color[1], color[2], color[3])).gamma); + param.Colors.Add("_Color", + src.pbrMetallicRoughness.baseColorFactor.ToColor4(ColorSpace.Linear, ColorSpace.sRGB) + ); } if (src.pbrMetallicRoughness.baseColorTexture != null && src.pbrMetallicRoughness.baseColorTexture.index != -1) @@ -153,7 +152,9 @@ namespace UniGLTF if (src.emissiveFactor != null && src.emissiveFactor.Length == 3) { - param.Colors.Add("_EmissionColor", new Color(src.emissiveFactor[0], src.emissiveFactor[1], src.emissiveFactor[2])); + param.Colors.Add("_EmissionColor", + src.emissiveFactor.ToColor3(ColorSpace.Linear, ColorSpace.Linear) + ); } if (src.emissiveTexture != null && src.emissiveTexture.index != -1) diff --git a/Assets/VRM10/Runtime/IO/Vrm10MaterialImporter.cs b/Assets/VRM10/Runtime/IO/Vrm10MaterialImporter.cs index 5ca26aa08..3f42855c1 100644 --- a/Assets/VRM10/Runtime/IO/Vrm10MaterialImporter.cs +++ b/Assets/VRM10/Runtime/IO/Vrm10MaterialImporter.cs @@ -1,45 +1,11 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using UniGLTF; +using UniGLTF; using UnityEngine; using VRMShaders; - namespace UniVRM10 { public static class Vrm10MaterialImporter { - public static Color ToColor4(this float[] src, Color defaultValue = default) - { - if (src == null || src.Length != 4) - { - throw new NotImplementedException(); - } - - var v = new Vector4( - src[0], - src[1], - src[2], - src[3] - ); - return v; - } - public static Color ToColor3(this float[] src, Color defaultValue = default) - { - if (src == null || src.Length < 3) - { - throw new NotImplementedException(); - } - - var v = new Vector4( - src[0], - src[1], - src[2] - ); - return v; - } - /// /// VMRC_materials_mtoon の場合にマテリアル生成情報を作成する /// @@ -75,8 +41,15 @@ namespace UniVRM10 } { // var color = mtoon.Color; - material.SetColor(MToon.Utils.PropColor, m.pbrMetallicRoughness.baseColorFactor.ToColor4()); - if (mtoon.ShadeColorFactor != null) material.SetColor(MToon.Utils.PropShadeColor, mtoon.ShadeColorFactor.ToColor3()); + material.SetColor(MToon.Utils.PropColor, m.pbrMetallicRoughness.baseColorFactor + .ToColor4(UniGLTF.ColorSpace.Linear, UniGLTF.ColorSpace.sRGB) + ); + if (mtoon.ShadeColorFactor != null) + { + material.SetColor(MToon.Utils.PropShadeColor, mtoon.ShadeColorFactor + .ToColor3(UniGLTF.ColorSpace.Linear, UniGLTF.ColorSpace.sRGB) + ); + } material.SetFloat(MToon.Utils.PropCutoff, m.alphaCutoff); } { @@ -91,17 +64,29 @@ namespace UniVRM10 } } { - material.SetColor(MToon.Utils.PropEmissionColor, m.emissiveFactor.ToColor3()); + material.SetColor(MToon.Utils.PropEmissionColor, + m.emissiveFactor.ToColor3(UniGLTF.ColorSpace.Linear, UniGLTF.ColorSpace.Linear) + ); } { - if (mtoon.ParametricRimColorFactor != null) material.SetColor(MToon.Utils.PropRimColor, mtoon.ParametricRimColorFactor.ToColor3()); + if (mtoon.ParametricRimColorFactor != null) + { + material.SetColor(MToon.Utils.PropRimColor, mtoon.ParametricRimColorFactor + .ToColor3(UniGLTF.ColorSpace.Linear, UniGLTF.ColorSpace.sRGB) + ); + } if (mtoon.RimLightingMixFactor.HasValue) material.SetFloat(MToon.Utils.PropRimLightingMix, mtoon.RimLightingMixFactor.Value); if (mtoon.ParametricRimFresnelPowerFactor.HasValue) material.SetFloat(MToon.Utils.PropRimFresnelPower, mtoon.ParametricRimFresnelPowerFactor.Value); if (mtoon.ParametricRimLiftFactor.HasValue) material.SetFloat(MToon.Utils.PropRimLift, mtoon.ParametricRimLiftFactor.Value); } { if (mtoon.OutlineWidthFactor.HasValue) material.SetFloat(MToon.Utils.PropOutlineWidth, mtoon.OutlineWidthFactor.Value); - if (mtoon.OutlineColorFactor != null) material.SetColor(MToon.Utils.PropOutlineColor, mtoon.OutlineColorFactor.ToColor3()); + if (mtoon.OutlineColorFactor != null) + { + material.SetColor(MToon.Utils.PropOutlineColor, mtoon.OutlineColorFactor + .ToColor3(UniGLTF.ColorSpace.Linear, UniGLTF.ColorSpace.sRGB) + ); + } if (mtoon.OutlineLightingMixFactor.HasValue) material.SetFloat(MToon.Utils.PropOutlineLightingMix, mtoon.OutlineLightingMixFactor.Value); // private diff --git a/Assets/VRM10/Runtime/Migration/MigrationMToon.cs b/Assets/VRM10/Runtime/Migration/MigrationMToon.cs index f74402795..1a07cf141 100644 --- a/Assets/VRM10/Runtime/Migration/MigrationMToon.cs +++ b/Assets/VRM10/Runtime/Migration/MigrationMToon.cs @@ -5,25 +5,15 @@ using UniGLTF; using UniGLTF.Extensions.VRMC_materials_mtoon; using UniJSON; using UnityEngine; - +using ColorSpace = UniGLTF.ColorSpace; namespace UniVRM10 { public static class MigrationMToon { - static float[] ToFloat4(this Color color) + static Color ToColor(JsonNode node, ColorSpace srcColorSpace, ColorSpace dstColorSpace) { - return new float[] { color.r, color.g, color.b, color.a }; - } - - static float[] ToFloat3(this Color color) - { - return new float[] { color.r, color.g, color.b }; - } - - static Color ToColor(JsonNode node) - { - return node.ArrayItems().Select(x => x.GetSingle()).ToArray().ToColor4(); + return node.ArrayItems().Select(x => x.GetSingle()).ToArray().ToColor4(srcColorSpace, dstColorSpace); } static float[] ToFloat4(JsonNode node) @@ -90,23 +80,23 @@ namespace UniVRM10 switch (key) { case "_Color": - definition.Color.LitColor = ToColor(kv.Value); + definition.Color.LitColor = ToColor(kv.Value, ColorSpace.sRGB, ColorSpace.sRGB); break; case "_ShadeColor": - definition.Color.ShadeColor = ToColor(kv.Value); + definition.Color.ShadeColor = ToColor(kv.Value, ColorSpace.sRGB, ColorSpace.sRGB); break; case "_EmissionColor": - definition.Emission.EmissionColor = ToColor(kv.Value); + definition.Emission.EmissionColor = ToColor(kv.Value, ColorSpace.Linear, ColorSpace.Linear); break; case "_OutlineColor": - definition.Outline.OutlineColor = ToColor(kv.Value); + definition.Outline.OutlineColor = ToColor(kv.Value, ColorSpace.sRGB, ColorSpace.sRGB); break; case "_RimColor": - definition.Rim.RimColor = ToColor(kv.Value); + definition.Rim.RimColor = ToColor(kv.Value, ColorSpace.sRGB, ColorSpace.sRGB); break; case "_MainTex": @@ -315,7 +305,7 @@ namespace UniVRM10 var dst = new VRMC_materials_mtoon(); // Color - gltfMaterial.pbrMetallicRoughness.baseColorFactor = mtoon.Definition.Color.LitColor.ToFloat4(); + gltfMaterial.pbrMetallicRoughness.baseColorFactor = mtoon.Definition.Color.LitColor.ToFloat4(ColorSpace.sRGB, ColorSpace.Linear); if (mtoon.TextureIndexMap.MainTex.HasValue) { gltfMaterial.pbrMetallicRoughness.baseColorTexture = new glTFMaterialBaseColorTextureInfo @@ -332,7 +322,7 @@ namespace UniVRM10 (value[2], value[3]) ); } - dst.ShadeColorFactor = mtoon.Definition.Color.ShadeColor.ToFloat3(); + dst.ShadeColorFactor = mtoon.Definition.Color.ShadeColor.ToFloat3(ColorSpace.sRGB, ColorSpace.Linear); if (mtoon.TextureIndexMap.ShadeTexture.HasValue) { dst.ShadeMultiplyTexture = new TextureInfo { Index = mtoon.TextureIndexMap.ShadeTexture.Value }; @@ -340,7 +330,7 @@ namespace UniVRM10 gltfMaterial.alphaCutoff = mtoon.Definition.Color.CutoutThresholdValue; // Outline - dst.OutlineColorFactor = ToFloat3(mtoon.Definition.Outline.OutlineColor); + dst.OutlineColorFactor = mtoon.Definition.Outline.OutlineColor.ToFloat3(ColorSpace.sRGB, ColorSpace.Linear); dst.OutlineLightingMixFactor = mtoon.Definition.Outline.OutlineLightingMixValue; dst.OutlineWidthMode = (UniGLTF.Extensions.VRMC_materials_mtoon.OutlineWidthMode)mtoon.Definition.Outline.OutlineWidthMode; dst.OutlineWidthFactor = mtoon.Definition.Outline.OutlineWidthValue; @@ -350,7 +340,7 @@ namespace UniVRM10 } // Emission - gltfMaterial.emissiveFactor = mtoon.Definition.Emission.EmissionColor.ToFloat3(); + gltfMaterial.emissiveFactor = mtoon.Definition.Emission.EmissionColor.ToFloat3(ColorSpace.Linear, ColorSpace.Linear); if (mtoon.TextureIndexMap.EmissionMap.HasValue) { gltfMaterial.emissiveTexture = new glTFMaterialEmissiveTextureInfo @@ -413,7 +403,7 @@ namespace UniVRM10 dst.RenderQueueOffsetNumber = mtoon.Definition.Rendering.RenderQueueOffsetNumber; // rim - dst.ParametricRimColorFactor = mtoon.Definition.Rim.RimColor.ToFloat3(); + dst.ParametricRimColorFactor = mtoon.Definition.Rim.RimColor.ToFloat3(ColorSpace.sRGB, ColorSpace.Linear); if (mtoon.TextureIndexMap.RimTexture.HasValue) { dst.RimMultiplyTexture = new TextureInfo { Index = mtoon.TextureIndexMap.RimTexture.Value };