public UnityEngine.Material LoadMaterial(MMDMaterial mmdMaterial, MMDUnityConfig config)
        {
            var mainTexture   = _textureLoader.LoadTexture(mmdMaterial.Texture);
            var isTransparent = mmdMaterial.DiffuseColor.a < 0.9999f || mmdMaterial.EdgeColor.a < 0.9999f ||
                                IsTextireTransparent(mainTexture);
            var material = new UnityEngine.Material(GetShader(mmdMaterial, config, isTransparent));

            ConfigMaterial(mmdMaterial, config, material, mainTexture);
            return(material);
        }
        private static Shader GetShader(MMDMaterial mmdMaterial, MMDUnityConfig config, bool isTransparent)
        {
            //"MMD/Transparent/PMDMaterial-with-Outline-CullBack-NoCastShadow"
            var shaderName = BuildShaderName(mmdMaterial, config, isTransparent);
            var ret        = Shader.Find(shaderName);

            if (ret == null)
            {
                Debug.LogWarning("Can't find shader " + shaderName);
            }
            return(ret);
        }
        public void RefreshMaterialConfig(MMDMaterial mmdMaterial, MMDUnityConfig config, UnityEngine.Material material)
        {
            var mainTexture   = _textureLoader.LoadTexture(mmdMaterial.Texture);
            var isTransparent = mmdMaterial.DiffuseColor.a < 0.9999f || mmdMaterial.EdgeColor.a < 0.9999f ||
                                IsTextireTransparent(mainTexture);
            var shaderName = BuildShaderName(mmdMaterial, config, isTransparent);

            if (!material.shader.name.Equals(shaderName))
            {
                material.shader = Shader.Find(shaderName);
            }
            ConfigMaterial(mmdMaterial, config, material, mainTexture);
        }
        private void ConfigMaterial(MMDMaterial mmdMaterial, MMDUnityConfig config, UnityEngine.Material material, Texture mainTexture)
        {
            material.SetColor("_Color", mmdMaterial.DiffuseColor);
            material.SetFloat("_Opacity", mmdMaterial.DiffuseColor.a);
            material.SetColor("_AmbColor", mmdMaterial.AmbientColor);
            material.SetColor("_SpecularColor", mmdMaterial.SpecularColor);
            material.SetFloat("_Shininess", mmdMaterial.Shiness);
            material.SetFloat("_OutlineWidth", mmdMaterial.EdgeSize);
            material.SetColor("_OutlineColor", mmdMaterial.EdgeColor);
            if (mainTexture != null)
            {
                material.mainTexture      = mainTexture;
                material.mainTextureScale = new Vector2(1, 1);
            }


            if (mmdMaterial.SubTextureType != MMDMaterial.SubTextureTypeEnum.MatSubTexOff)
            {
                var additionalTexture =
                    mmdMaterial.SubTexture == null ? null : _textureLoader.LoadTexture(mmdMaterial.SubTexture);
                if (additionalTexture != null)
                {
                    additionalTexture.wrapMode = TextureWrapMode.Clamp;
                    switch (mmdMaterial.SubTextureType)
                    {
                    case MMDMaterial.SubTextureTypeEnum.MatSubTexSpa:
                        material.SetTexture("_SphereAddTex", additionalTexture);
                        material.SetTextureScale("_SphereAddTex", new Vector2(1, 1));
                        break;

                    case MMDMaterial.SubTextureTypeEnum.MatSubTexSph:
                        material.SetTexture("_SphereMulTex", additionalTexture);
                        material.SetTextureScale("_SphereMulTex", new Vector2(1, 1));
                        break;
                    }
                }
            }

            RefreshShaderKeywords(mmdMaterial, config, material);

            var toonTexture = _textureLoader.LoadTexture(mmdMaterial.Toon);

            if (toonTexture != null)
            {
                toonTexture.wrapMode = TextureWrapMode.Clamp;
                material.SetTexture("_ToonTex", toonTexture);
                material.SetTextureScale("_ToonTex", new Vector2(1, 1));
            }
        }
        private static string BuildShaderName(MMDMaterial mmdMaterial, MMDUnityConfig config, bool isTransparent)
        {
            var shaderNameBuilder = new StringBuilder();

            shaderNameBuilder.Append("VRM/");
            if (isTransparent)
            {
                shaderNameBuilder.Append("UnlitTransparentZWrite");
            }
            else
            {
                shaderNameBuilder.Append("UnlitTexture");
            }

            var shaderName = shaderNameBuilder.ToString();

            return(shaderName);
        }
 private void RefreshShaderKeywords(MMDMaterial mmdMaterial, MMDUnityConfig config, UnityEngine.Material material)
 {
     RefreshDrawSelfShadowKeyword(MMDUnityConfig.DealSwitch(config.EnableDrawSelfShadow, mmdMaterial.DrawSelfShadow),
                                  material);
 }
Пример #7
0
        public UnityEngine.Material[] LoadModelMaterials(MaterialLoader materialLoader, MMDUnityConfig config, RawMMDModel model)
        {
            var ret = new UnityEngine.Material[model.Parts.Length];

            for (var i = 0; i < model.Parts.Length; i++)
            {
                ret[i]      = materialLoader.LoadMaterial(model.Parts[i].Material, config);
                ret[i].name = model.Parts[i].Material.Name;
            }
            return(ret);
        }