From 8521e988172d7aab9da9aaddff7e91068fa4299d Mon Sep 17 00:00:00 2001 From: Masataka SUMI Date: Fri, 4 Nov 2022 22:52:34 +0900 Subject: [PATCH] Convert emissiveFactor's color space into gamma with Built-in RP Standard shader. --- .../Extensions/ColorConversionExtensions.cs | 5 ++++ .../BuiltInStandardMaterialExporter.cs | 3 ++- .../Materials/GltfPbrMaterialImporter.cs | 25 +++++++++++++------ .../Runtime/UniGLTF/IO/MigrationFlags.cs | 5 ++++ 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/Assets/UniGLTF/Runtime/Extensions/ColorConversionExtensions.cs b/Assets/UniGLTF/Runtime/Extensions/ColorConversionExtensions.cs index 1e6daabe7..e78ab1556 100644 --- a/Assets/UniGLTF/Runtime/Extensions/ColorConversionExtensions.cs +++ b/Assets/UniGLTF/Runtime/Extensions/ColorConversionExtensions.cs @@ -40,6 +40,11 @@ namespace UniGLTF return new Color(src[0], src[1], src[2], 1f).ConvertColorSpace(srcColorSpace, dstColorSpace); } + public static Color ToColor3(this Vector3 src, ColorSpace srcColorSpace, ColorSpace dstColorSpace) + { + return new Color(src.x, src.y, src.z).ConvertColorSpace(srcColorSpace, dstColorSpace); + } + private static Color ConvertColorSpace(this Color srcColor, ColorSpace srcColorSpace, ColorSpace dstColorSpace) { // Need pattern matching :( diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/BuiltInRP/Export/Materials/BuiltInStandardMaterialExporter.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/BuiltInRP/Export/Materials/BuiltInStandardMaterialExporter.cs index e2f8d66df..f7b4b9c7b 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/BuiltInRP/Export/Materials/BuiltInStandardMaterialExporter.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/BuiltInRP/Export/Materials/BuiltInStandardMaterialExporter.cs @@ -189,7 +189,8 @@ namespace UniGLTF color /= maxColorComponent; UniGLTF.glTF_KHR_materials_emissive_strength.Serialize(ref dst.extensions, maxColorComponent); } - dst.emissiveFactor = color.ToFloat3(ColorSpace.Linear, ColorSpace.Linear); + // NOTE: Built-in RP Standard shader's emission color is in gamma color space. + dst.emissiveFactor = color.ToFloat3(ColorSpace.sRGB, ColorSpace.Linear); } if (src.HasProperty(EmissionTexturePropertyName)) diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/BuiltInRP/Import/Materials/GltfPbrMaterialImporter.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/BuiltInRP/Import/Materials/GltfPbrMaterialImporter.cs index cb5c8767e..a24b96048 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/BuiltInRP/Import/Materials/GltfPbrMaterialImporter.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/BuiltInRP/Import/Materials/GltfPbrMaterialImporter.cs @@ -143,19 +143,30 @@ namespace UniGLTF if (src.emissiveFactor != null && src.emissiveFactor.Length == 3) { - var emissiveFactor = src.emissiveFactor.ToColor3(ColorSpace.Linear, ColorSpace.Linear); - if (UniGLTF.glTF_KHR_materials_emissive_strength.TryGet(src.extensions, out UniGLTF.glTF_KHR_materials_emissive_strength emissiveStrength)) + var emissiveFactor = new Vector3(src.emissiveFactor[0], src.emissiveFactor[1], src.emissiveFactor[2]); + if (glTF_KHR_materials_emissive_strength.TryGet(src.extensions, out var emissiveStrength)) { emissiveFactor *= emissiveStrength.emissiveStrength; } - else if (UniGLTF.Extensions.VRMC_materials_hdr_emissiveMultiplier.GltfDeserializer.TryGet(src.extensions, - out UniGLTF.Extensions.VRMC_materials_hdr_emissiveMultiplier. - VRMC_materials_hdr_emissiveMultiplier ex)) + else if (Extensions.VRMC_materials_hdr_emissiveMultiplier.GltfDeserializer.TryGet(src.extensions, out var ex)) { - emissiveFactor *= ex.EmissiveMultiplier.Value; + if (ex.EmissiveMultiplier != null) + { + emissiveFactor *= ex.EmissiveMultiplier.Value; + } + } + + if (data.MigrationFlags.IsEmissiveFactorGamma) + { + // NOTE: Do nothing. + colors.Add("_EmissionColor", emissiveFactor.ToColor3(ColorSpace.sRGB, ColorSpace.sRGB)); + } + else + { + // NOTE: Built-in RP Standard shader's emission color is in gamma color space. + colors.Add("_EmissionColor", emissiveFactor.ToColor3(ColorSpace.Linear, ColorSpace.sRGB)); } - colors.Add("_EmissionColor", emissiveFactor); } if (src.emissiveTexture != null && src.emissiveTexture.index != -1) diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MigrationFlags.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MigrationFlags.cs index 1dfa79e80..0da201b7d 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MigrationFlags.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MigrationFlags.cs @@ -6,5 +6,10 @@ /// Before UniGLTF v0.69, roughness value in the texture was invalid squared value. /// public bool IsRoughnessTextureValueSquared { get; set; } = false; + + /// + /// Built-in RP Standard shader's emission color is exported in gamma color space until UniGLTF v0.106.0. + /// + public bool IsEmissiveFactorGamma { get; set; } = false; } } \ No newline at end of file