private static string BuildShaderName(MmdMaterial mmdMaterial, MmdUnityConfig config, bool isTransparent) { var shaderNameBuilder = new StringBuilder(); shaderNameBuilder.Append("MMD/"); if (isTransparent) { shaderNameBuilder.Append("Transparent/"); } shaderNameBuilder.Append("PMDMaterial"); if (MmdUnityConfig.DealSwitch(config.EnableEdge, mmdMaterial.DrawEdge)) { shaderNameBuilder.Append("-with-Outline"); } if (!mmdMaterial.DrawDoubleFace) { shaderNameBuilder.Append("-CullBack"); } if (!MmdUnityConfig.DealSwitch(config.EnableCastShadow, mmdMaterial.CastSelfShadow)) { shaderNameBuilder.Append("-NoCastShadow"); } var shaderName = shaderNameBuilder.ToString(); return(shaderName); }
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); }
public UnityEngine.Material[] LoadMaterials(MmdUnityConfig config) { 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); //Debug.LogFormat("material {0} render queue {1}", i, ret[i].renderQueue); } return(ret); }
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)); } }
public void UpdateMaterialsConfig(UnityEngine.Material[] materials, MmdUnityConfig config) { if (_model == null) { return; } if (materials.Length != _model.Parts.Length) { throw new ArgumentException( "UpdateMaterialsConfig: material count should be equal to model part count"); } for (var i = 0; i < _model.Parts.Length; i++) { _materialLoader.RefreshMaterialConfig(_model.Parts[i].Material, config, materials[i]); } }
public void UpdateConfig(MmdUnityConfig config) { _config = config; RefreshByConfig(); }
private void RefreshShaderKeywords(MmdMaterial mmdMaterial, MmdUnityConfig config, UnityEngine.Material material) { RefreshDrawSelfShadowKeyword(MmdUnityConfig.DealSwitch(config.EnableDrawSelfShadow, mmdMaterial.DrawSelfShadow), material); }