Convert emissiveFactor's color space into gamma with Built-in RP Standard shader.

This commit is contained in:
Masataka SUMI
2022-11-04 22:52:34 +09:00
parent d9e4a744a6
commit 8521e98817
4 changed files with 30 additions and 8 deletions

View File

@@ -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 :(

View File

@@ -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))

View File

@@ -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)

View File

@@ -6,5 +6,10 @@
/// Before UniGLTF v0.69, roughness value in the texture was invalid squared value.
/// </summary>
public bool IsRoughnessTextureValueSquared { get; set; } = false;
/// <summary>
/// Built-in RP Standard shader's emission color is exported in gamma color space until UniGLTF v0.106.0.
/// </summary>
public bool IsEmissiveFactorGamma { get; set; } = false;
}
}