示例#1
0
        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);
        }