Merge pull request #1920 from Santarh/urpEmission

Fix the error of emissiveFactor when importing into URP Lit shader.
This commit is contained in:
ousttrue 2022-11-11 19:07:53 +09:00 committed by GitHub
commit fa3194c951
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 52 additions and 39 deletions

View File

@ -141,33 +141,11 @@ namespace UniGLTF
material.globalIlluminationFlags &= ~MaterialGlobalIlluminationFlags.EmissiveIsBlack;
});
if (src.emissiveFactor != null && src.emissiveFactor.Length == 3)
var emissiveFactor = GltfMaterialImportUtils.ImportLinearEmissiveFactorFromMaterial(data, src);
if (emissiveFactor.HasValue)
{
// NOTE: glTF 仕様違反だが emissiveFactor に 1.0 より大きな値が入っていた場合もそのまま受け入れる.
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 (Extensions.VRMC_materials_hdr_emissiveMultiplier.GltfDeserializer.TryGet(src.extensions, out var ex))
{
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));
}
// NOTE: Built-in RP Standard shader's emission color is in gamma color space.
colors.Add("_EmissionColor", emissiveFactor.Value.gamma);
}
if (src.emissiveTexture != null && src.emissiveTexture.index != -1)

View File

@ -0,0 +1,36 @@
using UnityEngine;
using ColorSpace = VRMShaders.ColorSpace;
namespace UniGLTF
{
public static class GltfMaterialImportUtils
{
public static Color? ImportLinearEmissiveFactorFromMaterial(GltfData data, glTFMaterial src)
{
if (src.emissiveFactor == null || src.emissiveFactor.Length != 3) return null;
// NOTE: glTF 仕様違反だが emissiveFactor に 1.0 より大きな値が入っていた場合もそのまま受け入れる.
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 (Extensions.VRMC_materials_hdr_emissiveMultiplier.GltfDeserializer.TryGet(src.extensions, out var ex))
{
if (ex.EmissiveMultiplier != null)
{
emissiveFactor *= ex.EmissiveMultiplier.Value;
}
}
if (data.MigrationFlags.IsEmissiveFactorGamma)
{
return emissiveFactor.ToColor3(VRMShaders.ColorSpace.sRGB, VRMShaders.ColorSpace.Linear);
}
else
{
return emissiveFactor.ToColor3(ColorSpace.Linear, ColorSpace.Linear);
}
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 901463b34f824dffa3f531783cff2cc0
timeCreated: 1668078892

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 3292057f1c104100be6ed94ef578c899
timeCreated: 1668078713

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 5a76f43b22cf44db80bb2c035df97bca
timeCreated: 1668078724

View File

@ -117,20 +117,10 @@ namespace UniGLTF
material.globalIlluminationFlags &= ~MaterialGlobalIlluminationFlags.EmissiveIsBlack;
});
if (src.emissiveFactor != null && src.emissiveFactor.Length == 3)
var emissiveFactor = GltfMaterialImportUtils.ImportLinearEmissiveFactorFromMaterial(data, src);
if (emissiveFactor.HasValue)
{
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))
{
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))
{
emissiveFactor *= ex.EmissiveMultiplier.Value;
}
colors.Add("_EmissionColor", emissiveFactor);
colors.Add("_EmissionColor", emissiveFactor.Value);
}
if (src.emissiveTexture != null && src.emissiveTexture.index != -1)