Skip to content

Commit

Permalink
handle emissive color conversions in gamma space and with specific Un…
Browse files Browse the repository at this point in the history
…ity shaders better
  • Loading branch information
hybridherbst committed Sep 5, 2023
1 parent cacb3ec commit 0fdc0e4
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 2 deletions.
12 changes: 12 additions & 0 deletions Runtime/Scripts/Extensions/SchemaExtensions.cs
Expand Up @@ -334,6 +334,12 @@ public static UnityEngine.Color ToUnityColorLinear(this GLTF.Math.Color color)
var c = new UnityEngine.Color(color.R, color.G, color.B, color.A);
return c;
}

public static UnityEngine.Color ToUnityColorGamma(this GLTF.Math.Color color)
{
var c = new UnityEngine.Color(color.R, color.G, color.B, color.A).linear;
return c;
}

public static GLTF.Math.Color ToNumericsColorRaw(this UnityEngine.Color color)
{
Expand All @@ -346,6 +352,12 @@ public static GLTF.Math.Color ToNumericsColorLinear(this UnityEngine.Color color
var lc = color.linear;
return new GLTF.Math.Color(lc.r, lc.g, lc.b, lc.a);
}

public static GLTF.Math.Color ToNumericsColorGamma(this UnityEngine.Color color)
{
var lc = color.gamma;
return new GLTF.Math.Color(lc.r, lc.g, lc.b, lc.a);
}

public static GLTF.Math.Color[] ToNumericsColorLinear(this UnityEngine.Color[] inColorArr)
{
Expand Down
15 changes: 14 additions & 1 deletion Runtime/Scripts/SceneExporter/ExporterMaterials.cs
Expand Up @@ -163,11 +163,24 @@ public MaterialId ExportMaterial(Material materialObj)

if (materialObj.IsKeywordEnabled("_EMISSION") || materialObj.IsKeywordEnabled("EMISSION") || materialObj.HasProperty("emissiveTexture") || materialObj.HasProperty("_EmissiveTexture"))
{
// In Gamma space, some materials treat their emissive color inputs differently than in Linear space.
// This is super confusing when converting materials, but we also need to handle it correctly here.
var isUnityMaterialWithWeirdColorspaceHandling = QualitySettings.activeColorSpace == ColorSpace.Gamma &&
(materialObj.shader.name == "Standard" || materialObj.shader.name == "Standard (Specular setup)" ||
materialObj.shader.name == "Standard (Roughness setup)" ||
materialObj.shader.name == "Universal Render Pipeline/Lit" ||
materialObj.shader.name == "Universal Render Pipeline/Simple Lit" ||
materialObj.shader.name == "Universal Render Pipeline/Unlit");

if (materialObj.HasProperty("_EmissionColor") || materialObj.HasProperty("emissiveFactor") || materialObj.HasProperty("_EmissiveFactor"))
{
var c = materialObj.HasProperty("_EmissionColor") ? materialObj.GetColor("_EmissionColor") : materialObj.HasProperty("emissiveFactor") ? materialObj.GetColor("emissiveFactor") : materialObj.GetColor("_EmissiveFactor");
DecomposeEmissionColor(c, out var emissiveAmount, out var maxEmissiveAmount);
material.EmissiveFactor = emissiveAmount.ToNumericsColorRaw();

if (isUnityMaterialWithWeirdColorspaceHandling)
material.EmissiveFactor = emissiveAmount.ToNumericsColorRaw();
else
material.EmissiveFactor = emissiveAmount.ToNumericsColorGamma();

if(maxEmissiveAmount > 1)
{
Expand Down
2 changes: 1 addition & 1 deletion Runtime/Scripts/SceneImporter/ImporterMaterials.cs
Expand Up @@ -641,7 +641,7 @@ void SetTransformKeyword()
}
}

uniformMapper.EmissiveFactor = QualitySettings.activeColorSpace == ColorSpace.Linear ? def.EmissiveFactor.ToUnityColorLinear() : def.EmissiveFactor.ToUnityColorRaw();
uniformMapper.EmissiveFactor = QualitySettings.activeColorSpace == ColorSpace.Linear ? def.EmissiveFactor.ToUnityColorLinear() : def.EmissiveFactor.ToUnityColorLinear();

var emissiveExt = GetEmissiveStrength(def);
if (emissiveExt != null)
Expand Down

0 comments on commit 0fdc0e4

Please sign in to comment.