protected virtual UrhoPBRMaterial FromMetallicGlossiness(Material mat, MetallicGlossinessShaderArguments arguments) { var material = new UrhoPBRMaterial(); material.NormalTexture = GetScaledNormalTextureName(arguments.Bump, arguments.BumpScale, material); material.EmissiveTexture = Engine.EvaluateTextrueName(arguments.Emission); material.AOTexture = BuildAOTextureName(arguments.Occlusion, arguments.OcclusionStrength); material.BaseColorTexture = Engine.EvaluateTextrueName(arguments.BaseColor); var metalicGlossinesTexture = Engine.EvaluateTextrueName(arguments.MetallicGloss); var smoothnessTexture = Engine.EvaluateTextrueName(arguments.Smoothness); var linearMetallic = new Color(arguments.Metallic, 0, 0, 1).linear.r; if (string.IsNullOrWhiteSpace(metalicGlossinesTexture) && string.IsNullOrWhiteSpace(smoothnessTexture)) { material.Metallic = linearMetallic; material.Roughness = 1.0f - arguments.Glossiness; } else { var texNameBuilder = new StringBuilder(); if (!string.IsNullOrWhiteSpace(metalicGlossinesTexture)) { texNameBuilder.Append(Path.GetDirectoryName(metalicGlossinesTexture).FixAssetSeparator()); } else { texNameBuilder.Append(Path.GetDirectoryName(smoothnessTexture).FixAssetSeparator()); } if (texNameBuilder.Length > 0) { texNameBuilder.Append('/'); } if (!string.IsNullOrWhiteSpace(metalicGlossinesTexture)) { texNameBuilder.Append(Path.GetFileNameWithoutExtension(metalicGlossinesTexture)); } else { texNameBuilder.AppendFormat(CultureInfo.InvariantCulture, "{0:0.00}", linearMetallic); } if (smoothnessTexture != metalicGlossinesTexture) { texNameBuilder.Append('.'); texNameBuilder.Append(Path.GetFileNameWithoutExtension(smoothnessTexture)); } if (arguments.SmoothnessRemapMax < 0.999f) { texNameBuilder.Append('.'); texNameBuilder.AppendFormat(CultureInfo.InvariantCulture, "{0:0.000}", arguments.SmoothnessRemapMax); } texNameBuilder.Append(".MetallicRoughness.png"); material.MetallicRoughnessTexture = texNameBuilder.ToString(); } material.BaseColor = arguments.BaseColorColor.linear; material.AlphaBlend = arguments.Transparent; material.Cull = Urho3DCulling.ccw; material.ShadowCull = Urho3DCulling.ccw; if (arguments.AlphaTest) { material.PixelShaderDefines.Add("ALPHAMASK"); } material.EmissiveColor = arguments.EmissiveColor.linear; material.MatSpecColor = new Color(1, 1, 1, 0); material.UOffset = new Vector4(arguments.MainTextureScale.x, 0, 0, arguments.MainTextureOffset.x); material.VOffset = new Vector4(0, arguments.MainTextureScale.y, 0, arguments.MainTextureOffset.y); material.EvaluateTechnique(); return(material); }
public UrhoPBRMaterial FromSpecularGlossiness(SpecularGlossinessShaderArguments arguments) { var material = new UrhoPBRMaterial(); material.NormalTexture = GetScaledNormalTextureName(arguments.Bump, arguments.BumpScale); material.EmissiveTexture = Engine.EvaluateTextrueName(arguments.Emission); material.AOTexture = BuildAOTextureName(arguments.Occlusion, arguments.OcclusionStrength); var diffuseTextrueName = Engine.EvaluateTextrueName(arguments.Diffuse); var specularTexture = Engine.EvaluateTextrueName(arguments.PBRSpecular.Texture); string smoothnessTexture; if (arguments.Smoothness.Texture == arguments.Diffuse) { smoothnessTexture = diffuseTextrueName; } else { smoothnessTexture = specularTexture; } if (string.IsNullOrWhiteSpace(specularTexture) && string.IsNullOrWhiteSpace(diffuseTextrueName)) { var pbrValues = PBRUtils.ConvertToMetallicRoughnessSRGB(new PBRUtils.SpecularGlossiness { diffuse = arguments.DiffuseColor, specular = arguments.PBRSpecular.Color, opacity = arguments.DiffuseColor.a, glossiness = arguments.Glossiness }).linear(); material.BaseColor = pbrValues.baseColor; material.Metallic = pbrValues.metallic; material.Roughness = pbrValues.roughness; } else { { var baseColorTextureNameBuilder = new StringBuilder(); if (!string.IsNullOrWhiteSpace(diffuseTextrueName)) { baseColorTextureNameBuilder.Append( Path.GetDirectoryName(diffuseTextrueName).FixAssetSeparator()); } else { baseColorTextureNameBuilder.Append(Path.GetDirectoryName(specularTexture).FixAssetSeparator()); } if (baseColorTextureNameBuilder.Length > 0) { baseColorTextureNameBuilder.Append('/'); } if (!string.IsNullOrWhiteSpace(diffuseTextrueName)) { baseColorTextureNameBuilder.Append(Path.GetFileNameWithoutExtension(diffuseTextrueName)); } else { baseColorTextureNameBuilder.Append(FormatRGB(arguments.DiffuseColor.linear)); } baseColorTextureNameBuilder.Append('.'); if (!string.IsNullOrWhiteSpace(specularTexture)) { baseColorTextureNameBuilder.Append(Path.GetFileNameWithoutExtension(specularTexture)); } else { baseColorTextureNameBuilder.Append(FormatRGB(arguments.PBRSpecular.Color.linear)); } baseColorTextureNameBuilder.Append(".BaseColor.dds"); material.BaseColorTexture = baseColorTextureNameBuilder.ToString(); } { var metallicTextureNameBuilder = new StringBuilder(); if (!string.IsNullOrWhiteSpace(specularTexture)) { metallicTextureNameBuilder.Append(Path.GetDirectoryName(specularTexture).FixAssetSeparator()); } else { metallicTextureNameBuilder.Append(Path.GetDirectoryName(diffuseTextrueName) .FixAssetSeparator()); } if (metallicTextureNameBuilder.Length > 0) { metallicTextureNameBuilder.Append('/'); } if (!string.IsNullOrWhiteSpace(specularTexture)) { metallicTextureNameBuilder.Append(Path.GetFileNameWithoutExtension(specularTexture)); } else { metallicTextureNameBuilder.Append(FormatRGB(arguments.PBRSpecular.Color.linear)); } metallicTextureNameBuilder.Append('.'); if (!string.IsNullOrWhiteSpace(diffuseTextrueName)) { metallicTextureNameBuilder.Append(Path.GetFileNameWithoutExtension(diffuseTextrueName)); } else { metallicTextureNameBuilder.Append(FormatRGB(arguments.DiffuseColor.linear)); } if (!string.IsNullOrWhiteSpace(smoothnessTexture)) { if (arguments.GlossinessTextureScale < 0.999f) { metallicTextureNameBuilder.Append('.'); metallicTextureNameBuilder.AppendFormat(CultureInfo.InvariantCulture, "{0:0.000}", arguments.GlossinessTextureScale); } } else { if (arguments.Glossiness > 0) { metallicTextureNameBuilder.Append('.'); metallicTextureNameBuilder.AppendFormat(CultureInfo.InvariantCulture, "{0:0.000}", arguments.Glossiness); } } metallicTextureNameBuilder.Append(".MetallicRoughness.dds"); material.MetallicRoughnessTexture = metallicTextureNameBuilder.ToString(); } if (arguments.Diffuse != null) { material.BaseColor = arguments.DiffuseColor.linear; } else { material.BaseColor = Color.white; } } material.AlphaBlend = arguments.Transparent; if (arguments.AlphaTest) { material.PixelShaderDefines.Add("ALPHAMASK"); } if (arguments.Emission != null) { material.EmissiveColor = Color.white; } else { material.EmissiveColor = arguments.EmissiveColor.linear; } material.MatSpecColor = new Color(1, 1, 1, 0); material.UOffset = new Vector4(arguments.MainTextureScale.x, 0, 0, arguments.MainTextureOffset.x); material.VOffset = new Vector4(0, arguments.MainTextureScale.y, 0, arguments.MainTextureOffset.y); material.EvaluateTechnique(); return(material); }