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); }
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); }