public bool TryCreateParam(GltfParser parser, int i, out MaterialImportParam param) { var vrmMaterial = m_vrm.materialProperties[i]; if (vrmMaterial.shader == VRM.glTF_VRM_Material.VRM_USE_GLTFSHADER) { // fallback to gltf param = default; return(false); } // // restore VRM material // // use material.name, because material name may renamed in GltfParser. var name = parser.GLTF.materials[i].name; param = new MaterialImportParam(name, vrmMaterial.shader); param.Actions.Add(material => material.renderQueue = vrmMaterial.renderQueue); foreach (var kv in vrmMaterial.floatProperties) { param.FloatValues.Add(kv.Key, kv.Value); } var offsetScaleMap = new Dictionary <string, float[]>(); foreach (var kv in vrmMaterial.vectorProperties) { if (vrmMaterial.textureProperties.ContainsKey(kv.Key)) { // texture offset & scale offsetScaleMap.Add(kv.Key, kv.Value); } else { // vector4 var v = new Vector4(kv.Value[0], kv.Value[1], kv.Value[2], kv.Value[3]); param.Vectors.Add(kv.Key, v); } } foreach (var kv in vrmMaterial.textureProperties) { var(offset, scale) = (Vector2.zero, Vector2.one); if (offsetScaleMap.TryGetValue(kv.Key, out float[] value))
/// <summary> /// VMRC_materials_mtoon の場合にマテリアル生成情報を作成する /// </summary> /// <param name="parser"></param> /// <param name="i"></param> /// <param name="param"></param> /// <returns></returns> public static bool TryCreateParam(GltfParser parser, int i, out MaterialImportParam param) { var m = parser.GLTF.materials[i]; if (!UniGLTF.Extensions.VRMC_materials_mtoon.GltfDeserializer.TryGet(m.extensions, out UniGLTF.Extensions.VRMC_materials_mtoon.VRMC_materials_mtoon mtoon)) { // Fallback to glTF, when MToon extension does not exist. param = default; return(false); } // use material.name, because material name may renamed in GltfParser. param = new MaterialImportParam(m.name, MToon.Utils.ShaderName); foreach (var(key, (subAssetKey, value)) in Vrm10MToonMaterialTextureImporter.TryGetAllTextures(parser, m, mtoon)) { param.TextureSlots.Add(key, value); } foreach (var(key, value) in Vrm10MToonMaterialParameterImporter.TryGetAllColors(m, mtoon)) { param.Colors.Add(key, value); } foreach (var(key, value) in Vrm10MToonMaterialParameterImporter.TryGetAllFloats(m, mtoon)) { param.FloatValues.Add(key, value); } foreach (var(key, value) in Vrm10MToonMaterialParameterImporter.TryGetAllFloatArrays(m, mtoon)) { param.Vectors.Add(key, value); } param.RenderQueue = Vrm10MToonMaterialParameterImporter.TryGetRenderQueue(m, mtoon); param.Actions.Add(material => { // Set hidden properties, keywords from float properties. MToon.Utils.ValidateProperties(material, isBlendModeChangedByUser: false); }); return(true); }
/// <summary> /// VMRC_materials_mtoon の場合にマテリアル生成情報を作成する /// </summary> /// <param name="parser"></param> /// <param name="i"></param> /// <param name="param"></param> /// <returns></returns> public static bool TryCreateParam(GltfParser parser, int i, out MaterialImportParam param) { var m = parser.GLTF.materials[i]; if (!UniGLTF.Extensions.VRMC_materials_mtoon.GltfDeserializer.TryGet(m.extensions, out UniGLTF.Extensions.VRMC_materials_mtoon.VRMC_materials_mtoon mtoon)) { // fallback to gltf param = default; return(false); } // use material.name, because material name may renamed in GltfParser. param = new MaterialImportParam(m.name, MToon.Utils.ShaderName); param.Actions.Add(material => { // Texture 以外をここで設定。Texture は TextureSlots へ { // material.SetFloat(PropVersion, mtoon.Version); } { // var rendering = mtoon.Rendering; // SetRenderMode(material, rendering.RenderMode, rendering.RenderQueueOffsetNumber, // useDefaultRenderQueue: false); // SetCullMode(material, rendering.CullMode); } { // var color = mtoon.Color; material.SetColor(MToon.Utils.PropColor, m.pbrMetallicRoughness.baseColorFactor.ToColor4()); material.SetColor(MToon.Utils.PropShadeColor, mtoon.ShadeFactor.ToColor3()); material.SetFloat(MToon.Utils.PropCutoff, m.alphaCutoff); } { { material.SetFloat(MToon.Utils.PropShadeShift, mtoon.ShadingShiftFactor.Value); material.SetFloat(MToon.Utils.PropShadeToony, mtoon.ShadingToonyFactor.Value); // material.SetFloat(PropReceiveShadowRate, mtoon.prop.ShadowReceiveMultiplierValue); // material.SetFloat(PropShadingGradeRate, mtoon.mix prop.LitAndShadeMixingMultiplierValue); } { material.SetFloat(MToon.Utils.PropLightColorAttenuation, mtoon.LightColorAttenuationFactor.Value); material.SetFloat(MToon.Utils.PropIndirectLightIntensity, mtoon.GiIntensityFactor.Value); } } { material.SetColor(MToon.Utils.PropEmissionColor, m.emissiveFactor.ToColor3()); } { material.SetColor(MToon.Utils.PropRimColor, mtoon.RimFactor.ToColor3()); material.SetFloat(MToon.Utils.PropRimLightingMix, mtoon.RimLightingMixFactor.Value); material.SetFloat(MToon.Utils.PropRimFresnelPower, mtoon.RimFresnelPowerFactor.Value); material.SetFloat(MToon.Utils.PropRimLift, mtoon.RimLiftFactor.Value); } { material.SetFloat(MToon.Utils.PropOutlineWidth, mtoon.OutlineWidthFactor.Value); material.SetFloat(MToon.Utils.PropOutlineScaledMaxDistance, mtoon.OutlineScaledMaxDistanceFactor.Value); material.SetColor(MToon.Utils.PropOutlineColor, mtoon.OutlineFactor.ToColor3()); material.SetFloat(MToon.Utils.PropOutlineLightingMix, mtoon.OutlineLightingMixFactor.Value); // private // MToon.Utils.SetOutlineMode(material, outline.OutlineWidthMode, outline.OutlineColorMode); } { // material.SetTextureScale(PropMainTex, mtoon.MainTextureLeftBottomOriginScale); // material.SetTextureOffset(PropMainTex, mtoon.MainTextureLeftBottomOriginOffset); material.SetFloat(MToon.Utils.PropUvAnimScrollX, mtoon.UvAnimationScrollXSpeedFactor.Value); material.SetFloat(MToon.Utils.PropUvAnimScrollY, mtoon.UvAnimationScrollYSpeedFactor.Value); material.SetFloat(MToon.Utils.PropUvAnimRotation, mtoon.UvAnimationRotationSpeedFactor.Value); } MToon.Utils.ValidateProperties(material, isBlendModeChangedByUser: false); }); // SetTexture(material, PropMainTex, color.LitMultiplyTexture); // SetNormalMapping(material, prop.NormalTexture, prop.NormalScaleValue); // SetTexture(material, PropEmissionMap, emission.EmissionMultiplyTexture); if (m.pbrMetallicRoughness != null) { // base color if (m.pbrMetallicRoughness?.baseColorTexture != null) { param.TextureSlots.Add("_MainTex", GltfPBRMaterial.BaseColorTexture(parser, m)); } } if (m.normalTexture != null && m.normalTexture.index != -1) { // normal map param.Actions.Add(material => material.EnableKeyword("_NORMALMAP")); var textureParam = GltfPBRMaterial.NormalTexture(parser, m); param.TextureSlots.Add("_BumpMap", textureParam); param.FloatValues.Add("_BumpScale", m.normalTexture.scale); } if (m.emissiveTexture != null && m.emissiveTexture.index != -1) { var(offset, scale) = GltfMaterialImporter.GetTextureOffsetAndScale(m.emissiveTexture); var textureParam = GltfTextureImporter.CreateSRGB(parser, m.emissiveTexture.index, offset, scale); param.TextureSlots.Add("_EmissionMap", textureParam); } // TODO: if (mtoon.ShadeMultiplyTexture.HasValue) { var textureParam = GltfTextureImporter.CreateSRGB(parser, mtoon.ShadeMultiplyTexture.Value, Vector2.zero, Vector2.one); param.TextureSlots.Add("_ShadeTexture", textureParam); } if (mtoon.OutlineWidthMultiplyTexture.HasValue) { var textureParam = GltfTextureImporter.CreateSRGB(parser, mtoon.OutlineWidthMultiplyTexture.Value, Vector2.zero, Vector2.one); param.TextureSlots.Add("_OutlineWidthTexture", textureParam); } if (mtoon.AdditiveTexture.HasValue) { var textureParam = GltfTextureImporter.CreateSRGB(parser, mtoon.AdditiveTexture.Value, Vector2.zero, Vector2.one); param.TextureSlots.Add("_SphereAdd", textureParam); } if (mtoon.RimMultiplyTexture.HasValue) { var textureParam = GltfTextureImporter.CreateSRGB(parser, mtoon.RimMultiplyTexture.Value, Vector2.zero, Vector2.one); param.TextureSlots.Add("_RimTexture", textureParam);; } if (mtoon.UvAnimationMaskTexture.HasValue) { var textureParam = GltfTextureImporter.CreateSRGB(parser, mtoon.UvAnimationMaskTexture.Value, Vector2.zero, Vector2.one); param.TextureSlots.Add("_UvAnimMaskTexture", textureParam); } return(true); }
public static bool TryCreateParam(GltfParser parser, int i, out MaterialImportParam param) { if (i < 0 || i >= parser.GLTF.materials.Count) { param = default; return(false); } var src = parser.GLTF.materials[i]; param = new MaterialImportParam(GltfMaterialImporter.MaterialName(i, src), ShaderName); var standardParam = default(TextureImportParam); if (src.pbrMetallicRoughness != null || src.occlusionTexture != null) { if (src.pbrMetallicRoughness.metallicRoughnessTexture != null || src.occlusionTexture != null) { SubAssetKey key; (key, standardParam) = StandardTexture(parser, src); } if (src.pbrMetallicRoughness.baseColorFactor != null && src.pbrMetallicRoughness.baseColorFactor.Length == 4) { param.Colors.Add("_Color", src.pbrMetallicRoughness.baseColorFactor.ToColor4(ColorSpace.Linear, ColorSpace.sRGB) ); } if (src.pbrMetallicRoughness.baseColorTexture != null && src.pbrMetallicRoughness.baseColorTexture.index != -1) { var(key, textureParam) = BaseColorTexture(parser, src); param.TextureSlots.Add("_MainTex", textureParam); } if (src.pbrMetallicRoughness.metallicRoughnessTexture != null && src.pbrMetallicRoughness.metallicRoughnessTexture.index != -1) { param.Actions.Add(material => material.EnableKeyword("_METALLICGLOSSMAP")); param.TextureSlots.Add("_MetallicGlossMap", standardParam); // Set 1.0f as hard-coded. See: https://github.com/dwango/UniVRM/issues/212. param.FloatValues.Add("_Metallic", 1.0f); param.FloatValues.Add("_GlossMapScale", 1.0f); } else { param.FloatValues.Add("_Metallic", src.pbrMetallicRoughness.metallicFactor); param.FloatValues.Add("_Glossiness", 1.0f - src.pbrMetallicRoughness.roughnessFactor); } } if (src.normalTexture != null && src.normalTexture.index != -1) { param.Actions.Add(material => material.EnableKeyword("_NORMALMAP")); var(key, textureParam) = NormalTexture(parser, src); param.TextureSlots.Add("_BumpMap", textureParam); param.FloatValues.Add("_BumpScale", src.normalTexture.scale); } if (src.occlusionTexture != null && src.occlusionTexture.index != -1) { param.TextureSlots.Add("_OcclusionMap", standardParam); param.FloatValues.Add("_OcclusionStrength", src.occlusionTexture.strength); } if (src.emissiveFactor != null || (src.emissiveTexture != null && src.emissiveTexture.index != -1)) { param.Actions.Add(material => { material.EnableKeyword("_EMISSION"); material.globalIlluminationFlags &= ~MaterialGlobalIlluminationFlags.EmissiveIsBlack; }); if (src.emissiveFactor != null && src.emissiveFactor.Length == 3) { param.Colors.Add("_EmissionColor", src.emissiveFactor.ToColor3(ColorSpace.Linear, ColorSpace.Linear) ); } if (src.emissiveTexture != null && src.emissiveTexture.index != -1) { var(key, textureParam) = EmissiveTexture(parser, src); param.TextureSlots.Add("_EmissionMap", textureParam); } } param.Actions.Add(material => { BlendMode blendMode = BlendMode.Opaque; // https://forum.unity.com/threads/standard-material-shader-ignoring-setfloat-property-_mode.344557/#post-2229980 switch (src.alphaMode) { case "BLEND": blendMode = BlendMode.Fade; material.SetOverrideTag("RenderType", "Transparent"); material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); material.SetInt("_ZWrite", 0); material.DisableKeyword("_ALPHATEST_ON"); material.EnableKeyword("_ALPHABLEND_ON"); material.DisableKeyword("_ALPHAPREMULTIPLY_ON"); material.renderQueue = 3000; break; case "MASK": blendMode = BlendMode.Cutout; material.SetOverrideTag("RenderType", "TransparentCutout"); material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero); material.SetInt("_ZWrite", 1); material.SetFloat("_Cutoff", src.alphaCutoff); material.EnableKeyword("_ALPHATEST_ON"); material.DisableKeyword("_ALPHABLEND_ON"); material.DisableKeyword("_ALPHAPREMULTIPLY_ON"); material.renderQueue = 2450; break; default: // OPAQUE blendMode = BlendMode.Opaque; material.SetOverrideTag("RenderType", ""); material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero); material.SetInt("_ZWrite", 1); material.DisableKeyword("_ALPHATEST_ON"); material.DisableKeyword("_ALPHABLEND_ON"); material.DisableKeyword("_ALPHAPREMULTIPLY_ON"); material.renderQueue = -1; break; } material.SetFloat("_Mode", (float)blendMode); }); return(true); }
public static bool TryCreateParam(GltfParser parser, int i, out MaterialImportParam param) { if (i < 0 || i >= parser.GLTF.materials.Count) { param = default; return(false); } var src = parser.GLTF.materials[i]; if (!glTF_KHR_materials_unlit.IsEnable(src)) { param = default; return(false); } param = new MaterialImportParam(GltfMaterialImporter.MaterialName(i, src), ShaderName); // texture if (src.pbrMetallicRoughness.baseColorTexture != null) { var(offset, scale) = GltfMaterialImporter.GetTextureOffsetAndScale(src.pbrMetallicRoughness.baseColorTexture); var textureParam = GltfTextureImporter.CreateSRGB(parser, src.pbrMetallicRoughness.baseColorTexture.index, offset, scale); param.TextureSlots.Add("_MainTex", textureParam); } // color if (src.pbrMetallicRoughness.baseColorFactor != null && src.pbrMetallicRoughness.baseColorFactor.Length == 4) { var color = src.pbrMetallicRoughness.baseColorFactor; param.Colors.Add("_Color", (new Color(color[0], color[1], color[2], color[3])).gamma); } //renderMode param.Actions.Add(material => { if (src.alphaMode == "OPAQUE") { UniUnlit.Utils.SetRenderMode(material, UniUnlit.UniUnlitRenderMode.Opaque); } else if (src.alphaMode == "BLEND") { UniUnlit.Utils.SetRenderMode(material, UniUnlit.UniUnlitRenderMode.Transparent); } else if (src.alphaMode == "MASK") { UniUnlit.Utils.SetRenderMode(material, UniUnlit.UniUnlitRenderMode.Cutout); material.SetFloat("_Cutoff", src.alphaCutoff); } else { // default OPAQUE UniUnlit.Utils.SetRenderMode(material, UniUnlit.UniUnlitRenderMode.Opaque); } // culling if (src.doubleSided) { UniUnlit.Utils.SetCullMode(material, UniUnlit.UniUnlitCullMode.Off); } else { UniUnlit.Utils.SetCullMode(material, UniUnlit.UniUnlitCullMode.Back); } // VColor var hasVertexColor = parser.GLTF.MaterialHasVertexColor(i); if (hasVertexColor) { UniUnlit.Utils.SetVColBlendMode(material, UniUnlit.UniUnlitVertexColorBlendOp.Multiply); } UniUnlit.Utils.ValidateProperties(material, true); }); return(true); }
public static IEnumerable <(SubAssetKey, TextureImportParam)> EnumerateSubAssetKeyValue(this MaterialImportParam param) { foreach (var kv in param.TextureSlots) { var key = new SubAssetKey(typeof(Texture2D), kv.Value.UnityObjectName); yield return(key, kv.Value); } }