mtoon material export 実装

This commit is contained in:
ousttrue
2021-04-21 16:39:22 +09:00
parent ba4a7e79d9
commit b90e781773
2 changed files with 21 additions and 186 deletions

View File

@@ -1,5 +1,4 @@
using System;
using UniGLTF;
using UniGLTF;
using UnityEngine;
using VRMShaders;
@@ -7,103 +6,6 @@ namespace UniVRM10
{
public class Vrm10MaterialExporter : MaterialExporter
{
protected override glTFMaterial CreateMaterial(Material m)
{
switch (m.shader.name)
{
case "VRM/UnlitTexture":
return Export_VRMUnlitTexture(m);
case "VRM/UnlitTransparent":
return Export_VRMUnlitTransparent(m);
case "VRM/UnlitCutout":
return Export_VRMUnlitCutout(m);
case "VRM/UnlitTransparentZWrite":
return Export_VRMUnlitTransparentZWrite(m);
case "VRM/MToon":
return Export_VRMMToon(m);
default:
return base.CreateMaterial(m);
}
}
static glTFMaterial Export_VRMUnlitTexture(Material m)
{
var material = glTF_KHR_materials_unlit.CreateDefault();
material.alphaMode = "OPAQUE";
return material;
}
static glTFMaterial Export_VRMUnlitTransparent(Material m)
{
var material = glTF_KHR_materials_unlit.CreateDefault();
material.alphaMode = "BLEND";
return material;
}
static glTFMaterial Export_VRMUnlitCutout(Material m)
{
var material = glTF_KHR_materials_unlit.CreateDefault();
material.alphaMode = "MASK";
return material;
}
static glTFMaterial Export_VRMUnlitTransparentZWrite(Material m)
{
var material = glTF_KHR_materials_unlit.CreateDefault();
material.alphaMode = "BLEND";
return material;
}
static glTFMaterial Export_VRMMToon(Material m)
{
var material = glTF_KHR_materials_unlit.CreateDefault();
switch (m.GetTag("RenderType", true))
{
case "Transparent":
material.alphaMode = "BLEND";
break;
case "TransparentCutout":
material.alphaMode = "MASK";
material.alphaCutoff = m.GetFloat("_Cutoff");
break;
default:
material.alphaMode = "OPAQUE";
break;
}
switch ((int)m.GetFloat("_CullMode"))
{
case 0:
material.doubleSided = true;
break;
case 1:
Debug.LogWarning("ignore cull front");
break;
case 2:
// cull back
break;
default:
throw new NotImplementedException();
}
return material;
}
#region CreateFromMaterial
static readonly string[] TAGS = new string[]{
"RenderType",
// "Queue",
};
public override glTFMaterial ExportMaterial(Material m, TextureExporter textureExporter)
{
if (m.shader.name != MToon.Utils.ShaderName)
@@ -111,14 +13,27 @@ namespace UniVRM10
return base.ExportMaterial(m, textureExporter);
}
// convert MToon intermediate value from UnityEngine.Material
var def = MToon.Utils.GetMToonParametersFromMaterial(m);
// gltfMaterial
var material = new glTFMaterial
{
name = m.name,
emissiveFactor = new float[] { 0, 0, 0 },
pbrMetallicRoughness = new glTFPbrMetallicRoughness
{
baseColorFactor = def.Color.LitColor.ToArray(),
baseColorTexture = new glTFMaterialBaseColorTextureInfo
{
index = textureExporter.ExportSRGB(def.Color.LitMultiplyTexture),
},
},
emissiveFactor = def.Emission.EmissionColor.ToArray(),
};
// default values
// VRMC_materials_mtoon
var mtoon = new UniGLTF.Extensions.VRMC_materials_mtoon.VRMC_materials_mtoon
{
Version = "",
@@ -129,7 +44,10 @@ namespace UniVRM10
ShadeColorFactor = new float[] { 0, 0, 0 },
// ShadeMultiplyTexture;
ShadeMultiplyTexture = new UniGLTF.Extensions.VRMC_materials_mtoon.TextureInfo
{
Index = textureExporter.ExportSRGB(def.Color.ShadeMultiplyTexture),
},
// Lighting
ShadingShiftFactor = 0,
@@ -172,92 +90,9 @@ namespace UniVRM10
UvAnimationRotationSpeedFactor = 0,
};
// var prop = PreShaderPropExporter.GetPropsForSupportedShader(m.shader.name);
// if (prop == null)
// {
// Debug.LogWarningFormat("Fail to export shader: {0}", m.shader.name);
// }
// else
// {
// foreach (var keyword in m.shaderKeywords)
// {
// material.keywordMap.Add(keyword, m.IsKeywordEnabled(keyword));
// }
// // get properties
// //material.SetProp(prop);
// foreach (var kv in prop.Properties)
// {
// switch (kv.ShaderPropertyType)
// {
// case ShaderPropertyType.Color:
// {
// var value = m.GetColor(kv.Key).ToArray();
// material.vectorProperties.Add(kv.Key, value);
// }
// break;
// case ShaderPropertyType.Range:
// case ShaderPropertyType.Float:
// {
// var value = m.GetFloat(kv.Key);
// material.floatProperties.Add(kv.Key, value);
// }
// break;
// case ShaderPropertyType.TexEnv:
// {
// var texture = m.GetTexture(kv.Key);
// if (texture != null)
// {
// var value = kv.Key == "_BumpMap"
// ? textureExporter.ExportNormal(texture)
// : textureExporter.ExportSRGB(texture)
// ;
// if (value == -1)
// {
// Debug.LogFormat("not found {0}", texture.name);
// }
// else
// {
// material.textureProperties.Add(kv.Key, value);
// }
// }
// // offset & scaling
// var offset = m.GetTextureOffset(kv.Key);
// var scaling = m.GetTextureScale(kv.Key);
// material.vectorProperties.Add(kv.Key,
// new float[] { offset.x, offset.y, scaling.x, scaling.y });
// }
// break;
// case ShaderPropertyType.Vector:
// {
// var value = m.GetVector(kv.Key).ToArray();
// material.vectorProperties.Add(kv.Key, value);
// }
// break;
// default:
// throw new NotImplementedException();
// }
// }
// }
// foreach (var tag in TAGS)
// {
// var value = m.GetTag(tag, false);
// if (!String.IsNullOrEmpty(value))
// {
// material.tagMap.Add(tag, value);
// }
// }
UniGLTF.Extensions.VRMC_materials_mtoon.GltfSerializer.SerializeTo(ref material.extensions, mtoon);
return material;
}
#endregion
}
}

View File

@@ -27,7 +27,7 @@ namespace UniVRM10
}
public static Color ToColor3(this float[] src, Color defaultValue = default)
{
if (src == null || src.Length != 3)
if (src == null || src.Length < 3)
{
throw new NotImplementedException();
}