private void DumpGlossinessReflectivity(Material material, bool metallic, BabylonPBRMaterial babylonPbrMaterial)
{
if (material.HasProperty("_Glossiness"))
{
babylonPbrMaterial.microSurface = material.GetFloat("_Glossiness");
}
if (metallic)
{
if (material.HasProperty("_Metallic"))
{
var metalness = material.GetFloat("_Metallic");
babylonPbrMaterial.reflectivity = new float[] { metalness * babylonPbrMaterial.albedo[0], metalness * babylonPbrMaterial.albedo[1], metalness * babylonPbrMaterial.albedo[2] };
if (babylonPbrMaterial.albedoTexture != null)
{
var albedoTexture = material.GetTexture("_MainTex") as Texture2D;
if (albedoTexture != null)
{
var albedoPixels = GetPixels(albedoTexture);
var reflectivityTexture = new Texture2D(albedoTexture.width, albedoTexture.height, TextureFormat.RGBA32, false);
reflectivityTexture.alphaIsTransparency = true;
babylonPbrMaterial.useMicroSurfaceFromReflectivityMapAlpha = true;
var metallicTexture = material.GetTexture("_MetallicGlossMap") as Texture2D;
if (metallicTexture == null)
{
for (var i = 0; i < albedoTexture.width; i++)
{
for (var j = 0; j < albedoTexture.height; j++)
{
albedoPixels[j * albedoTexture.width + i].r *= metalness;
albedoPixels[j * albedoTexture.width + i].g *= metalness;
albedoPixels[j * albedoTexture.width + i].b *= metalness;
albedoPixels[j * albedoTexture.width + i].a = babylonPbrMaterial.microSurface;
}
}
}
else
{
var metallicPixels = GetPixels(metallicTexture);
for (var i = 0; i < albedoTexture.width; i++)
{
for (var j = 0; j < albedoTexture.height; j++)
{
var metallicPixel = metallicPixels[j * albedoTexture.width + i];
albedoPixels[j * albedoTexture.width + i].r *= metallicPixel.r;
albedoPixels[j * albedoTexture.width + i].g *= metallicPixel.r;
albedoPixels[j * albedoTexture.width + i].b *= metallicPixel.r;
albedoPixels[j * albedoTexture.width + i].a = metallicPixel.a;
}
}
}
reflectivityTexture.SetPixels(albedoPixels);
reflectivityTexture.Apply();
var textureName = albedoTexture.name + "_MetallicGlossMap.png";
var babylonTexture = new BabylonTexture { name = textureName };
var textureScale = material.GetTextureScale("_MainTex");
babylonTexture.uScale = textureScale.x;
babylonTexture.vScale = textureScale.y;
var textureOffset = material.GetTextureOffset("_MainTex");
babylonTexture.uOffset = textureOffset.x;
babylonTexture.vOffset = textureOffset.y;
var reflectivityTexturePath = Path.Combine(Path.GetTempPath(), textureName);
File.WriteAllBytes(reflectivityTexturePath, reflectivityTexture.EncodeToPNG());
babylonScene.AddTexture(reflectivityTexturePath);
if (File.Exists(reflectivityTexturePath))
{
File.Delete(reflectivityTexturePath);
}
babylonPbrMaterial.reflectivityTexture = babylonTexture;
}
}
//else
//{
// TODO. Manage Albedo Cube Texture.
//}
}
}
else
{
if (material.HasProperty("_SpecColor"))
{
babylonPbrMaterial.reflectivity = material.GetColor("_SpecColor").ToFloat();
}
babylonPbrMaterial.reflectivityTexture = DumpTextureFromMaterial(material, "_SpecGlossMap");
if (babylonPbrMaterial.reflectivityTexture != null && babylonPbrMaterial.reflectivityTexture.hasAlpha)
{
babylonPbrMaterial.useMicroSurfaceFromReflectivityMapAlpha = true;
}
}
}