コード例 #1
0
        public static IEnumerable <TextureExportItem> GetTextures(Material m)
        {
            var props = PreShaderPropExporter.GetPropsForSupportedShader(m.shader.name);

            if (props == null)
            {
                yield return(new TextureExportItem(m.mainTexture, glTFTextureTypes.BaseColor));
            }

            foreach (var prop in props.Properties)
            {
                if (prop.ShaderPropertyType == ShaderPropertyType.TexEnv)
                {
                    yield return(new TextureExportItem(m.GetTexture(prop.Key), GetglTFTextureType(m.shader.name, prop.Key)));
                }
            }
        }
コード例 #2
0
        public static glTF_VRM_Material CreateFromMaterial(Material m, List <Texture> textures)
        {
            var material = new glTF_VRM_Material
            {
                name        = m.name,
                shader      = m.shader.name,
                renderQueue = m.renderQueue,
            };

            if (!PreShaderPropExporter.VRMExtensionShaders.Contains(m.shader.name))
            {
                material.shader = glTF_VRM_Material.VRM_USE_GLTFSHADER;
                return(material);
            }

            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 = textures.IndexOf(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);
                }
            }

            return(material);
        }
コード例 #3
0
ファイル: VRMMaterialExporter.cs プロジェクト: vrm-c/UniVRM
        public static glTF_VRM_Material CreateFromMaterial(Material m, ITextureExporter textureExporter)
        {
            var material = new glTF_VRM_Material
            {
                name        = m.name,
                shader      = m.shader.name,
                renderQueue = m.renderQueue,
            };

            if (m.shader.name != MToon.Utils.ShaderName)
            {
                material.shader = glTF_VRM_Material.VRM_USE_GLTFSHADER;
                return(material);
            }

            var prop = PreShaderPropExporter.GetPropsForMToon();

            if (prop == null)
            {
                throw new Exception("arienai");
            }
            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:
                    {
                        // No color conversion. Because color property is serialized to raw float array.
                        var value = m.GetColor(kv.Key).ToFloat4(ColorSpace.Linear, ColorSpace.Linear);
                        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       = -1;
                            var isNormalMap = kv.Key == "_BumpMap";
                            if (isNormalMap)
                            {
                                value = textureExporter.RegisterExportingAsNormal(texture);
                            }
                            else
                            {
                                var needsAlpha = kv.Key == "_MainTex";
                                value = textureExporter.RegisterExportingAsSRgb(texture, needsAlpha);
                            }
                            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);
                }
            }

            return(material);
        }