MMD

您所在的位置:网站首页 木材材质贴图怎么做 MMD

MMD

2024-07-08 22:33| 来源: 网络整理| 查看: 265

        大嘎吼啊!我系KarlvonDonitz,MMD-Ray材质系统讲解,这系一款船新教程,只需三番种,你就会学会MMD-Ray材质。就算你没学会,评论区我将置顶我对应的视频教程!可以观看视频来学习哦,这个文字版的是教程讲义与备注,其实你可以当作我留给你的笔记哦。各位小老婆们收好你老公大人满满的爱,不要太爱我哦~(本篇文章长达1万多字,非常感谢各位耐心观看)

0x00 MMD-Ray所支持的贴图

        在我们来学习MMD-Ray的材质系统前,我们需要先来了解下MMD-Ray所支持的贴图有多少啦!截至到目前我所使用的Ray-master版本(7/18/2018)中所支持的贴图中英文对应如下:

ALBEDO_MAP 反射贴图

ALBEDO_SUB_MAP 次表面反射贴图

ALPHA_MAP 阿尔法通道贴图(透明通道贴图)

NORMAL_MAP 法线贴图

NORMAL_SUB_MAP 次表面法线贴图

SMOOTHNESS_MAP 平滑度贴图

METALNESS_MAP 金属度贴图

SPECULAR_MAP 高光贴图

OCCLUSION_MAP 闭塞贴图

PARALLAX_MAP 视差贴图

EMISSIVE_MAP 自发光贴图

        最后还有自定义贴图A和B,但是这两个有点麻烦所以我单独放到本教程的最后的章节来说啦。

0x01 ALBEDO_MAP 反射贴图

      反射贴图,顾名思义就是材质反射出来的颜色。所以,我们可以让他变得不一样的颜色啦~比如:

将反射贴图改成绿色!

       看,经过一点小小的处理,就可以让贴图变成绿色了!但是怎么做呢?先来看看在MMD-Ray材质中对应的fx代码(一般都是位于MMD-Ray文件中Materials文件夹中xxx.fx的文件)。一般在你未作改变的时候是这个样子的:

#define ALBEDO_MAP_FROM 3

#define ALBEDO_MAP_UV_FLIP 0

#define ALBEDO_MAP_APPLY_SCALE 0

#define ALBEDO_MAP_APPLY_DIFFUSE 1

#define ALBEDO_MAP_APPLY_MORPH_COLOR 0

#define ALBEDO_MAP_FILE "albedo.png"

const float3 albedo = 1.0;

const float2 albedoMapLoopNum = 1.0;

        那么这些都代表了什么呢?让我们一个个来解释吧!

         #define ALBEDO_MAP_FROM

         这个语句的意思就是反射贴图从哪里来。后面的数字就是你要告诉他的方式啦,一共0-8,9种来源,分别是0 : 使用浮点变量指定颜色;1 : 使用图片 (bmp, png, jpg, tga, dds) 路径添加贴图; 2 : 使用动态图片 (gif, apng) 添加路径;3 : 从PMX模型中提取基础颜色;4 : 从PMX模型中提取环环境贴图;5 : 从TOON贴图中提取;6 : 从DummyScreen.x模型中提取颜色;7 : 从PMX模型中提取环境光;8 : 从PMX模型中提取高光颜色。怎么,有点晕晕的?别急,给你说下比较常用的吧,一般来说反射贴图就是你漫反射出来的效果,所以一般不会改变,总之一般情况下是3啦,但有可能用到的就是DummyScreen.x中的颜色,这时候就是6啦。

#define ALBEDO_MAP_UV_FLIP

       这个如果懂一点的人就知道是UV翻转的意思,什么你不知道?UV翻转就是说你贴图坐标0-1是左边是0还是右边是0啦(亦或者是上下)。一般你UV坐标不正确的时候用来对齐,但是MMD-Ray并不支持UV裁剪哦。所以这个后面的数字就一共4个啦!0:不反转;1 : 水平翻转;2 : 垂直翻转;3 : 交换UV坐标。

ALBEDO_MAP_APPLY_SCALE

       这个是对应下面那句const float3 albedo = 1.0;的。说白了,scale表示大小,但是你没说怎么叠加啊,所以这里就是用来表达叠加方式的啦。这里一共有3种方式0:不叠加;1:乘法;2:指数。

#define ALBEDO_MAP_APPLY_DIFFUSE

        这个一般来说,我个人保持默认了(其实是懒),这个你可以当作开关。0是关闭1是开启。当你开启时将会读取PMX模型中的扩散色定义。

#define ALBEDO_MAP_APPLY_MORPH_COLOR

       道理同上,也是个开关,不过这次是打开后将会接受MMD控制器的约束。

#define ALBEDO_MAP_FILE "albedo.png"

       这个则是当你定义#define ALBEDO_MAP_FROM中为1,也就是文件路径时需要的了。""两个引号中加入你文件的名称,一般见于你需要的额外材质(比如法线什么的)。格式可以按照绝对路径填写,如果是同一个目录下,可以只写文件名。

const float3 albedo = 1.0;

       这里需要区分两种情况了,当你是否开启ALBEDO_MAP_APPLY_SCALE的颜色叠加了,如果你开启了你就需要做的是对RGB通道进行赋值一般格式为const float3 albedo = float3(1,0,0);里面的数字为0-1毕竟按照RGB排列,但是如果你希望同时对通道做一样的改变则可以按照const float3 albedo = 0.5这样就可以做到同时对三个数字赋值了。但是当你没有开启ALBEDO_MAP_APPLY_SCALE的时候,如果你#define ALBEDO_MAP_FROM 中定义的是0(使用浮点变量指定颜色)的话,这里则是填写颜色了。格式为const float3 albedo = float3(1,0,0);(1对应255,支持小数)。如果你拿到的是256色制的RGB数值,那么你可以写成const float3 albedo = float3(r, g, b) / 255.0不过还是要提醒一下当你使用屏幕取色时,Ray-MMD对应的RGB为sRGB色彩空间,请务必记得Gamma值矫正!一般为2.2或1.8,格式可以写为 const float3 albedo = pow(float3(r, g, b), 2.2)其中RGB为0-1的数值。

const float2 albedoMapLoopNum = 1.0;

        这个则是UV重叠次数啦,一般来说设置为1,除非特殊必要,比如缩小或者放大贴图,则会对应的放大或减小数值。

0x02 ALBEDO_SUB_MAP 次表面反射贴图

   我说句老实话一般并不会开启这个贴图,就连我自己其实也很少开....但是教程要说,还是讲下吧,代码如下:

#define ALBEDO_SUB_ENABLE 0

#define ALBEDO_SUB_MAP_FROM 0  

#define ALBEDO_SUB_MAP_UV_FLIP 0  

#define ALBEDO_SUB_MAP_APPLY_SCALE 0    

#define ALBEDO_SUB_MAP_FILE "albedo.png" 

const float3 albedoSub = 1.0;

const float2 albedoSubMapLoopNum = 1.0;

        说句老实话,这里只有第一句#define ALBEDO_SUB_ENABLE是和反射贴图不一样的了。

#define ALBEDO_SUB_ENABLE

        一共有6个选择:0 : 无;1 : 贴图运算乘法;2 : 贴图指数运算;3 : 贴图加法运算;4 : 黑色素;5 : 透明混合。一般来说,最有可能的就是黑色素贴图了吧...不过在下真的很少用啦我也就不多说了。

0x03 ALPHA_MAP 阿尔法通道贴图(透明通道贴图)

       抱歉,您现在所看到的贴图在Materials中并不支持编辑哦,因为这个的定义存在于MMD-Ray的Main.fx的定义中啦~不过讲真的,MMD对透明层真的很不友好的啦!

       莫名觉得很短,还是说几句吧,在MMD-Ray的Main.fx这个系列中,对于这个材质的代码如下:

#define ALPHA_MAP_FROM 3

#define ALPHA_MAP_UV_FLIP 0

#define ALPHA_MAP_SWIZZLE 3

#define ALPHA_MAP_FILE "alpha.png"

const float alpha = 1.0;

const float alphaThreshold = 0.999;

const float alphaMapLoopNum = 1.0;

       其中你没见到的就只有#define ALPHA_MAP_SWIZZLE 3和const float alphaThreshold = 0.999;了。先来说下#define ALPHA_MAP_SWIZZLE 3,这里后面的数字代表读取哪个通道,默认为3,也就是阿尔法通道,其他的则对应RGB,也就是0,1,2。const float alphaThreshold = 0.999;则是透明的阈值,一般无限逼近1就是兼容透明层,如果不要透明层就设定为0吧。

0x04 NORMAL_MAP 法线贴图

      大部分MMD新人接触的第一个贴图就是法线贴图了,之前我的MMD-MME编程教学中也讲述了法线贴图的工作原理。这里笼统的说下,法线贴图就是扰动原有面的法向量来制造阴影让你觉得凹凸的贴图。对的,实际意思就是让你觉得有细节的小把戏(所以有一些让你不对劲的地方)那么怎么做的更好呢?(就看后面的视差贴图啦)法线贴图我个人更推荐大家用在一些不是平整的小物件上来增加细节,这样既不会让你电脑负载太大,而且同时效果也比较优秀。为什么不推荐大而且平坦的地方呢?我们用图说FA!

讲真有改变?

仔细看看?有改变么?其实是有的,只是并没有这么好的效果,而且不妨让我们增大数值试试看?

100倍的效果(雾

      当我们开启100倍的效果,地板都变红了.....别问我为啥开100,我只是闲得无聊而已!

      既然我们知道了效果,我们应该怎么设置呢?还是老方法,先看代码吧....

#define NORMAL_MAP_FROM 0

#define NORMAL_MAP_TYPE 0

#define NORMAL_MAP_UV_FLIP 0

#define NORMAL_MAP_FILE "Normal.png"

const float normalMapScale = 1.0;

const float normalMapLoopNum = 1.0;

       看起来和反射贴图很相似嘛,也许你想这么说。但是我告诉,恰恰相反,这个和反射贴图其实是 完 全 一 致 的格式!(打 字 带 空 格 !)

        但是还是要仔细的给大家说下,第一个也就是:

#define NORMAL_MAP_FROM 0

      意思就是法线贴图的来源处,一般来说都是设置1,也就是文件路径。所以自然#define NORMAL_MAP_FILE "Normal.png"中的Normal.png往往需要改变啦。其他的来源和反射贴图是一样的啦。我就直接照抄了!1 : 使用图片 (bmp, png, jpg, tga, dds) 路径添加贴图; 2 : 使用动态图片 (gif, apng) 添加路径;3 : 从PMX模型中提取基础颜色;4 : 从PMX模型中提取环环境贴图;5 : 从TOON贴图中提取;6 : 从DummyScreen.x模型中提取颜色;7 : 从PMX模型中提取环境光;8 : 从PMX模型中提取高光颜色。

#define NORMAL_MAP_TYPE 0

      这个则是反射贴图没有的一项,意思是类型,一共4种情况。0 : 从RGB通道计算空间;法线1 : 从RG 通道计算空间法线 2 : 从世界空间正常灰度凹凸贴图PerturbNormalLQ;计算3 : 从世界空间正常灰度凹凸贴图PerturbNormalHQ 计算 ;一般情况下直接使用0就可以了。但是还是要说的就是使用的法线贴图需要是相对法线贴图(一般都是蓝色的),而不能使用世界法线贴图(一般是像是色谱一样可以看到红绿蓝三个颜色)。

#define NORMAL_MAP_UV_FLIP 0

       这一项也是和反射贴图一样的控制。0:不反转;1 : 水平翻转;2 : 垂直翻转;3 : 交换UV坐标。

#define NORMAL_MAP_FILE "Normal.png"

       唔,这个就像是我说的,文件路径。一般情况下使用法线贴图都需要改的。""两个引号中加入你文件的名称,一般见于你需要的额外材质(比如法线什么的)。格式可以按照绝对路径填写,如果是同一个目录下,可以只写文件名。

const float normalMapScale = 1.0;

        这一项则是表示法线贴图强度,一般来说1就足够了,觉得不够深可以考虑增加。取值范围从负无穷到正无穷都可以。是的,也就是说,你可以翻转法线贴图的朝向哦!

const float normalMapLoopNum = 1.0;

       这个则是贴图的迭代次数,其实就是大小啦,数值越大就会越小,也是看情况,一般数值都是1啦。

0x05 NORMAL_SUB_MAP

       这个效果其实和法线贴图是重叠的,所以,就连代码都是一致的,我觉得我真的没法说啥了:/

#define NORMAL_SUB_MAP_FROM 0

#define NORMAL_SUB_MAP_TYPE 0

#define NORMAL_SUB_MAP_UV_FLIP 0

#define NORMAL_SUB_MAP_FILE "Normal.png"

const float normalSubMapScale = 1.0;

const float normalSubMapLoopNum = 1.0;

       使用方式和法线贴图也是一致,两个贴图是相互叠加运算的.....我就不多说了

0x06 SMOOTHNESS_MAP 平滑度贴图

平滑度贴图,顾名思义嘛,就是说这个有多滑。越滑就越有菲涅尔效应啦。

菲涅尔,给你不一样的感觉

       不不不,我不用飘柔的,谢谢了!

       这就是平滑度贴图的效果,一般来说地面反射就是这么做到的(如果你没有这个效果,请在Ray.conf中开启SSR功能)。接下来,来看看代码了!

#define SMOOTHNESS_MAP_FROM 0

#define SMOOTHNESS_MAP_TYPE 0

#define SMOOTHNESS_MAP_UV_FLIP 0

#define SMOOTHNESS_MAP_SWIZZLE 0

#define SMOOTHNESS_MAP_APPLY_SCALE 0

#define SMOOTHNESS_MAP_FILE "smoothness.png"

const float smoothness = 1;

const float smoothnessMapLoopNum = 1.0;

       经过先前的几个贴图是不是觉得自己已经能看懂不少了?但是我还是有需要说的啦。

#define SMOOTHNESS_MAP_FROM 0

       就是来源,但是别急,这次多了一个9号选择,从PMX模型中提取高光强度 。其他选择和之前一样。(照抄x2)1 : 使用图片 (bmp, png, jpg, tga, dds) 路径添加贴图; 2 : 使用动态图片 (gif, apng) 添加路径;3 : 从PMX模型中提取基础颜色;4 : 从PMX模型中提取环环境贴图;5 : 从TOON贴图中提取;6 : 从DummyScreen.x模型中提取颜色;7 : 从PMX模型中提取环境光;8 : 从PMX模型中提取高光颜色。

#define SMOOTHNESS_MAP_TYPE 0

        这个定义你的平滑度计算方式,一共3种,虽然你未必清楚,但是我还是要说。0 : 平滑模式 (CRENGINE 寒霜引擎算法);1 : 从光滑度计算粗糙度 ( UE4/GGX/SubstancePainter2 textures的计算方式); 2 : 从光滑度计算粗糙度 by 1.0 - Roughness ( UE4/GGX/SubstancePainter2 的线性粗糙度算法)。要是你问我1和2有啥区别,那就是1的公式是1.0 - (粗糙度^ 0.5)。个人推荐,你要是不清楚就直接用0就可以了,如果无聊可以试试看其他的.....

       后面的几个则和之前介绍的完全一致了,我就不再说了....

0x07 METALNESS_MAP 金属度贴图

金属度,就是说这玩意有多铁,头越铁,越容易被磁铁吸住(大雾)

这个贴图就是用在金属上的了,用来说这个玩意的金属程度有多厉害。我们可以看看效果:

这才叫铁

       我们可以看到金属不但让地面变黑,而且还出现了一点反射光,当然,大部分时候配合法线和光滑贴图会有更好的效果。然后还是看看代码!

#define METALNESS_MAP_FROM 0

#define METALNESS_MAP_UV_FLIP 0

#define METALNESS_MAP_SWIZZLE 0

#define METALNESS_MAP_APPLY_SCALE 0

#define METALNESS_MAP_FILE "metalness.png"

const float metalness = 0.0;

const float metalnessMapLoopNum = 1.0;

       Nice,还是这样,老味道,一毛一样。不过值得嘱咐的一句话就是在:

const float metalness = 0.0;

       这不是负无穷到正无穷哦!而是0-1的区间内,你超过了,就按照0或者1的啦,别想这么头铁了!

0x08 SPECULAR_MAP 高光贴图

        这个就是亮贴图的时候了!并不,这可不是光污染的来源哦,不要认错了!

注意灯下的反光

       是不是觉得不咋亮,当然,这个是表示高光的,可不是自发光。所以效果在这种大平面效果当然没啥了,不过细节表现上可不一般了哦!代码的项目则是一如既往的一毛一样:

#define SPECULAR_MAP_FROM 0

#define SPECULAR_MAP_TYPE 0

#define SPECULAR_MAP_UV_FLIP 0

#define SPECULAR_MAP_SWIZZLE 0

#define SPECULAR_MAP_APPLY_SCALE 0

#define SPECULAR_MAP_FILE "SPECULAR.png"

const float3 specular = 1.0;

const float2 specularMapLoopNum = 1.0;

        但是要说的事情还是有的,那就是第二句的类型了!

#define SPECULAR_MAP_TYPE 0

        一共5种类型0 : 颜色算法1   F(x) = 0.08*(x  ) (from UE4 textures); 1 : 颜色算法2   F(x) = 0.16*(x^2) (from Frostbite textures); 2 : 灰度算法1   F(x) = 0.08*(x  ) (from UE4 textures);3 : 灰度算法2 F(x) = 0.16*(x^2) (from Frostbite textures);4 : 反射率0.04(就是0.5),但只有第一行为0时才可以使用。总而言之,你试一下哪个好看不就行了吗,我也不知道该用哪个.......

0x09 OCCLUSION_MAP 闭塞贴图

        很多人都不知道闭塞是用来干嘛的,实际它是用来体现某些区域因为遮挡而造成的完全黑,你可以理解成也就是光线被吸收了,折射不出来。图我就不放出来了,因为默认下一定要是1,如果为0的话,材质一定为黑色的,而且要比各位非酋还要黑。当然,最重要的是我怕看到这片黑屏幕中帅气的我(擦擦鼻血,并不!)代码也是十分的熟悉了.....

#define OCCLUSION_MAP_FROM 0

#define OCCLUSION_MAP_UV_FLIP 0

#define OCCLUSION_MAP_SWIZZLE 0

#define OCCLUSION_MAP_APPLY_SCALE 0 

#define OCCLUSION_MAP_FILE "OCCLUSION.png"

const float occlusion = 1.0;

const float occlusionMapLoopNum = 1.0;

        这里需要再次说的就是,请注意const float occlusion = 1.0;的数值一定是1,如果为0则材质一定为黑色了!!!!

0x0A PARALLAX_MAP 视差贴图

        这个一般才是重头戏吧.....视察贴图对我来说算是法线贴图的升级版本。一般情况下我都推荐各位使用视差贴图,因为这个可以给我带来更好的效果和比法线贴图更好的阴影遮挡关系。不多BB,直接给你们看看效果:

更好的遮挡效果

        咋样,是不是比法线厉害多了?所以,一般为了表现平面的凹凸,一般都会使用视差贴图,但是别开太高哦,别问我为什么!至于代码也是一如既往的一模一样了

#define PARALLAX_MAP_FROM 1

#define PARALLAX_MAP_TYPE 0

#define PARALLAX_MAP_UV_FLIP 0

#define PARALLAX_MAP_SWIZZLE 0

#define PARALLAX_MAP_FILE "PARALLAX.png"

const float parallaxMapScale = 1.0;

const float parallaxMapLoopNum = 1.0;

       唯一可以说的就是:

#define PARALLAX_MAP_TYPE 0

       这个语句中的参数0和1分别为0 : 计算不透明度1 : 计算视差遮挡的透明度和最佳的 SSDO。其他的真的就没法说了....

0x0B EMISSIVE_MAP 自发光贴图

我tm亮爆,兄弟!这就是MMD-Ray俗称光污染的罪魁祸首了!自发光贴图就是用来发光的啊,亮爆!图片我也不展示了,免得你们找我赔钱说亮瞎狗眼了。代码直接给你们:

#define EMISSIVE_ENABLE 0

#define EMISSIVE_MAP_FROM 0

#define EMISSIVE_MAP_UV_FLIP 0

#define EMISSIVE_MAP_APPLY_SCALE 0

#define EMISSIVE_MAP_APPLY_MORPH_COLOR 0

#define EMISSIVE_MAP_APPLY_MORPH_INTENSITY 0

#define EMISSIVE_MAP_APPLY_BLINK 0

#define EMISSIVE_MAP_FILE "emissive.png"

const float3 emissive = 1.0;

const float3 emissiveBlink = 1.0;

const float  emissiveIntensity = 1.0;

const float2 emissiveMapLoopNum = 1.0;

         对的,这个贴图也复杂了一点,但是别怕,大部分的你还是知道的。我们来一点点分析看看。

#define EMISSIVE_ENABLE 0

       这个讲述是否开启自发光,0关闭1开启。如果你希望它不会刺瞎你的眼睛,还是好好关掉吧。

#define EMISSIVE_MAP_FROM 0

       唔,一样的,来源是哪里,但是别记错了,这个可没第10个选项。

#define EMISSIVE_MAP_UV_FLIP 0

       这........就是UV翻转了......

#define EMISSIVE_MAP_APPLY_SCALE 0

      老坛酸菜牛肉面,还是和之前一样的....

#define EMISSIVE_MAP_APPLY_MORPH_COLOR 0

#define EMISSIVE_MAP_APPLY_MORPH_INTENSITY 0

        这两个需要一起了,第一表示是否激活,如果激活的话,有多亮,所以第一个只有0和1,而第二个,你可以选择亮爆眼睛999999什么的.....

#define EMISSIVE_MAP_APPLY_BLINK 0

       Blink的意思就是闪烁啦,意思就是要不要闪烁,对应后面的时间。

#define EMISSIVE_MAP_FILE "emissive.png"

       我......你懂的吧......

const float3 emissive = 1.0;

        这个则是颜色了,如果你第二句#define EMISSIVE_MAP_FROM 为0则有用,指定方式和之前的一样。格式为const float3 albedo = float3(1,0,0);(1对应255,支持小数)。如果你拿到的是256色制的RGB数值,那么你可以写成const float3 albedo = float3(r, g, b) / 255.0不过还是要提醒一下当你使用屏幕取色时,Ray-MMD对应的RGB为sRGB色彩空间,请务必记得Gamma值矫正!一般为2.2或1.8,格式可以写为 const float3 albedo = pow(float3(r, g, b), 2.2)其中RGB为0-1的数值。

const float3 emissiveBlink = 1.0;

       闪烁的间隔,定义域在1-10这段区间内哦!

const float  emissiveIntensity = 1.0;

       听君一句劝,别太高了,真的,对身体不好......意思就是有多亮.......真的,没有上限的......

const float2 emissiveMapLoopNum = 1.0;

        意思和以前一样啦,迭代次数。还是越大越小哦!

0x0C 自定义的材质

     自定义材质中一共有0-8,9种方式开启。

#define CUSTOM_ENABLE 0

    这个定义开启方式。开启后对应材质分别如下:

0 : 默认            // customA = 无效,    customB = 无效

1 : 集成的皮肤// customA = 弯曲度,  customB = 透射色;

2 : 自发光的占位符  // customA = 无效,    customB = 无效

3 : 卡通              // customA = 分段,    customB = 阴影颜色

4 : 玻璃              // customA = 弯曲度   customB = 透射色

5 : 布料              // customA = 光泽度,      customB = 模糊色

6 : 清漆层        // customA = 光滑度, customB = 无效;

 7 : 次表面         // customA = 弯曲度,  customB = 透射色;

8:卡通阴影       // customA = 阈值,  customB = 无效;

这些会在下次的教程中详细谈到,这次想给大家列表,可以对应自己需要的试试看。

0x0D 最后的话

        你以为就这么结束了么?我的MMD教学还没这么简单哦,要知道MME还是可以自己编程的,所以一定要保持创意力而不要拘泥于格式化。按照条条框框走着的太千篇一律了,可以自己尝试一下新操作。不妨思考,试试看下面对自发光贴图的改变

float time1:TIME;

#define EMISSIVE_ENABLE 1

#define EMISSIVE_MAP_FROM 0

#define EMISSIVE_MAP_UV_FLIP 0

#define EMISSIVE_MAP_APPLY_SCALE 0

#define EMISSIVE_MAP_APPLY_MORPH_COLOR 0

#define EMISSIVE_MAP_APPLY_MORPH_INTENSITY 0

#define EMISSIVE_MAP_APPLY_BLINK 0

#define EMISSIVE_MAP_FILE "emissive.png"

static float3 emissive = float3(cos(time1),sin(time1),cos(time1));

const float3 emissiveBlink = 1.0;

const float  emissiveIntensity = 1.0;

const float2 emissiveMapLoopNum = 1.0;

        感谢各位的支持以及耐心的观看这万字的教程。希望各位创作者们可以保持创造的心态来制作更精品的视频!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3