虚幻引擎工具类材质表达式 | 您所在的位置:网站首页 › 如何运用max函数计算 › 虚幻引擎工具类材质表达式 |
相关课程
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 抗锯齿纹理遮罩 黑体 凹凸贴图偏移 常量偏差比例 DDX DDY 深度消退 景深函数 去饱和度 距离 距离场梯度 与最近表面的距离 功能级别开关 菲涅尔 GI替换 光照系统替换 线性插值 噪点 上一帧开关 质量开关 绕轴旋转 球体遮罩 薄半透明 向量噪点 实用表达式 节点是会对材质造成多种不同影响的节点,或许跟以往有很大不同。例如,GIReplace节点会使用您输入的给定值取代对象间接反射颜色,而线性插值节点有助于根据alpha输入混合两个纹理。下文将详细介绍材质编辑器中提供的所有实用表达式节点。 抗锯齿纹理遮罩抗锯齿纹理遮罩(AntialiasedTextureMask) 表达式允许您使用软(抗锯齿)过渡遮罩来创建材质。此遮罩可用来在两个复杂材质属性之间混合,或者使alpha混合材质淡出(适合与"软屏蔽"配合使用)。您只需指定在其中一个通道(红色、绿色、蓝色或alpha)中指定了遮罩的材质,在此表达式中设置所使用的通道,并指定比较值。假设该通道存储0(黑色)到1(白色)范围内的灰阶值,比较函数将定义产生的遮罩是应该为0还是1。此表达式是一个参数,这使 纹理(Texture) 属性可以由子材质实例覆盖。 项目 说明 属性 阈值(Threshold) 指定用作像素范围中的分界点的值。小于此值的像素范围值将变为黑色,大于此值的像素范围值将变为白色。 通道(Channel) 指定要用作遮罩的纹理通道。 纹理(Texture) 指定要使用的遮罩纹理。 输入 UV 接收要应用于纹理遮罩的纹理坐标。 伪代码: Result = 1 if TextureLookup < Threshold then Result = 0实际实现略微复杂,因为它会尝试根据实际像素范围来返回介于0与1之间的值,以消除锯齿。 示例(为了确保质量最佳,这个128x128的小纹理未进行压缩):
用作正常纹理(左上角),以及与说明的材质表达式配合使用(右下角):
这种技术最适合在进行放大时使用,并可作用于模糊的输入内容。压缩会导致质量大幅下降,因此,请尝试使用未经压缩的低分辨率纹理。 黑体黑体(BlackBody) 表达式用来在材质中模拟黑体辐射。用户输入开氏温度,产生的颜色和强度可用来驱动"底色"(Base Color)和"自发光"(Emissive)值,以获得在物理上准确的结果。
凹凸贴图偏移(BumpOffset) 是虚幻引擎4术语,就是通常所谓的"视差贴图"。BumpOffset表达式可以使材质产生深度错觉,而不需要额外的几何体。BumpOffset材质使用灰阶_高度贴图_来提供深度信息。高度贴图中的值越亮,材质的"凸出"效果越明显;当摄像机在表面上移动时,这些区域将产生视差(移位)。高度贴图中较暗的区域将显得"距离较远",其移位程度最小。 项目 说明 属性 高度比(HeightRatio) 从_高度贴图_中取得的深度的乘数。这个值越大,深度越极端。典型值的范围是0.02到0.1。 参考平面(ReferencePlane) 指定纹理空间中要应用此效果的近似高度。值为0将使纹理完全离开表面,而值0.5(默认值)表示部分表面凸起而部分区域凹陷。 输入 坐标(Coordinate) 接收此表达式所要修改的基本纹理坐标。 高度(Height) 接收要用作高度贴图的纹理(或值)。 高度比输入(HeightRatioInput) 从_高度贴图_中取得的深度的乘数。这个值越大,深度越极端。典型值的范围是0.02到0.1。如果使用此输入,那么它将取代"高度比"(Height Ratio)属性中的任何值。
常量偏差比例(ConstantBiasScale) 表达式接收输入值,加上偏差值,然后乘以比例缩放系数并输出结果。例如,要将输入数据从[-1,1] 转换到[0,1],请使用偏差值1.0和比例缩放系数0.5。 项目 说明 偏差(Bias) 指定要与输入相加的值。 比例(Scale) 指定偏差结果的乘数。
DDX 表达式公开DDX导数计算,这是像素着色器计算中使用的一项GPU硬件功能。 DDYDDY 表达式公开DDX导数计算,这是像素着色器计算中使用的一项GPU硬件功能。 深度消退深度消退(DepthFade) 表达式用来隐藏半透明对象与不透明对象相交时出现的不美观接缝。 项目 说明 属性 消退距离(Fade Distance) 这是应该发生消退的全局空间距离。未连接消退距离(FadeDistance)输入时,将使用此距离。 输入 不透明(Opacity) 接收深度消退前对象的现有不透明度。 消退距离(FadeDistance) 这是应该发生消退的全局空间距离。
此示例的材质网络如下图所示。
景深函数(DepthOfFieldFunction) 表达式使美工能够控制当景深使材质模糊时,材质所发生的情况。它输出介于0与1之间的值,其中0代表"清晰",而1代表"完全模糊"。例如,这对于在纹理的清晰版本与模糊版本之间进行插值非常有用。"深度"(Depth)输入允许您使用其他计算来覆盖景深计算所产生的现有结果。
单击查看大图。 去饱和度去饱和度(Desaturation) 表达式对其输入进行去饱和度,即根据特定百分比将其输入的颜色转换为灰色阴影。 项目 说明 属性 亮度系数(Luminance Factors) 指定每个通道对去饱和度颜色的影响量。此属性确保在去饱和度之后,绿色比红色亮,而红色比蓝色亮。 输入 小数(Fraction) 指定要应用于输入的去饱和度数量。此百分比的范围是0.0(完全原始颜色,不去饱和度)到1.0(完全去饱和度)。
程序员需知: 定义去饱和度颜色`D 、输入颜色`I 和亮度系数`L 。输出将是`O = (1-百分比)*(D.dot(I)) + 百分比*I 距离距离(Distance) 表达式计算两个点/颜色/位置/向量之间的欧氏距离,并输出结果值。此表达式可作用于单分量、双分量、三分量和四分量向量,但此表达式的两个输入必须具有相同数目的通道。 项目 说明 输入 A 接收一个值,或接收任意长度的向量。 B 接收一个值,或接收任意长度的向量。 注意颜色如何随着摄像机距离的增加而变化。
伪代码: Result = length (A - B)低级HLSL代码: float Result = sqrt (dot (A-B, A-B)) 距离场梯度距离场梯度(DistanceFieldGradient) 材质表达式节点进行规范化后,将输出对象在距离场中的X,Y,Z移动方向。 这使DistanceFieldGradient材质表达式节点非常适合于需要模拟液体流的材质。 必须在 项目设置(Project Settings) 的 渲染(Rendering) 下启用 生成网格体距离场(Generate Mesh Distance Fields) ,此表达式才能正确工作。 项目 说明 位置(Position) 如果未输入任何内容,那么默认为当前全局位置。 这里是在材质中使用 DistanceFieldGradient 材质表达式的示例。 在此示例中,请务必注意,DistanceFieldGradient首先进行规范化,然后输入到"Mask Channel节点。 这样做的原因是,如果不首先对DistanceFieldGradient进行规范化,您将无法获得方向性数据。 为了方便在材质实例中进行RGB通道切换,添加了"遮罩通道"(Mask Channel)参数。
单击查看大图。 以下是作用中的DistanceFieldGradient示例。 下图显示启用各种RGB后DistanceFieldGradient将会使用的数据。
单击查看大图。 编号 说明 1 启用R通道并禁用所有其他通道。 2 启用G通道并禁用所有其他通道。 3 启用B通道并禁用所有其他通道。 与最近表面的距离与最近表面的距离(DistanceToNearestSurface) 材质表达式节点允许材质对"全局距离场"关卡中的任何点进行取样。 这个材质表达式将输出从距离场到场景中最近遮挡体的带符号距离(以全局空间单位计)。 必须在 项目设置(Project Settings) 的 渲染(Rendering) 下启用 生成网格体距离场(Generate Mesh Distance Fields) ,此表达式才能正确工作。 项目 说明 位置(Position) 如果未输入任何内容,那么默认为当前全局位置。 以下是作用中的 DistanceToNearestSurface 材质表达式示例。
单击查看大图。
在此示例中,DistanceToNearestSurface输送到材质上的"不透明"(Opacity)输入,而该材质应用于放在关卡地板正上方的"静态网格"平面。 DistanceToNearestSurface的作用是告诉材质,"静态网格"平面仅从红色区域开始与场景中的其他"静态网格"相交。 功能级别开关FeatureLevelSwitch 节点允许您建立简化的材质,以用于功能不太强大的设备。 用法示例 :您可能有一个采用10个重叠纹理及复杂数学运算的材质,但仅将单个静态纹理用于移动设备(功能级别ES2)。 项目 说明 默认值(Default) 默认功能级别。 ES2 由OpenGL ES2的核心功能定义的功能级别。 ES3.1 由金属级设备的功能定义的功能级别。 SM4 由DX10 Shader Model 4的核心功能定义的功能级别。 SM5 由DX11 Shader Model 5的核心功能定义的功能级别。 菲涅尔菲涅尔(Fresnel) 表达式根据表面法线与摄像机方向的标量积来计算衰减。当表面法线正对着摄像机时,输出值为0。当表面法线垂直于摄像机时,输出值为1。结果限制在[0,1]范围内,以确保不会在中央产生任何负颜色。 项目 说明 属性 指数(Exponent) 指定输出值的衰减速度。值越大,意味着衰减越紧或越快。 基本反射小数(Base Reflect Fraction) 指定从正对表面的方向查看表面时,镜面反射的小数。值为1将有效地禁用菲涅耳效果。 输入 指数输入(ExponentIn) 指定输出值的衰减速度。值越大,意味着衰减越紧或越快。如果使用此输入,那么值将始终取代"指数"(Exponent)属性值。 基本反射小数(Base Reflect Fraction) 指定从正对表面的方向查看表面时,镜面反射的小数。值为1将有效地禁用菲涅耳效果。如果使用此输入,那么值将始终取代"指数"(Exponent)属性值。 法线(Normal) 接收三通道向量值,该值代表表面在全局空间中的法线。要查看应用于菲涅耳对象表面的法线贴图的结果,请将该法线贴图连接到材质的"法线"(Normal)输入,然后连接一个PixelNormalWS 表达式到Fresnel上的此输入。如果未指定任何法线,那么将使用网格的切线法线。
GI替换(GIReplace) 允许美工指定另一个表达式链(通常较为简单),以便在材质用于GI时使用。 用法示例 :光照系统静态GI和LPV动态GI使用此表达式。 项目 说明 默认值(Default) 默认GI。 静态间接(StaticIndirect) 用于烘焙间接照明。 动态间接(DynamicIndirect) 用于动态间接照明。 光照系统替换光照系统替换(LightmassReplace) 表达式用来在编译材质以用于正常渲染用途时传递"实时"(Realtime)输入,并在导出材质到光照系统以用于全局照明时传递"光照系统"(Lightmass)输入。使用此表达式可以避免使用导出版本无法正确处理的材质表达式,例如"全局位置"(WorldPosition)。 项目 说明 实时(Realtime) 接收要传递以用于正常渲染的值。 光照系统(Lightmass) 接收在导出材质到光照系统时要传递的值。 线性插值线性插值(LinearInterpolate) 表达式根据用作遮罩的第三个输入值,在两个输入值之间进行混合。您可以将其想像成用于定义两个纹理之间的过渡效果的遮罩,例如Photoshop中的层遮罩。遮罩Alpha的强度确定从两个输入值获取颜色的比例。如果Alpha为0.0色,那么将使用第一个输入。如果Alpha为1.0,那么将使用第二个输入。如果Alpha介于0.0与1.0之间,那么输出是两个输入之间的混合。请记住,混合按通道进行。因此,如果Alpha为RGB颜色,那么Alpha的红色通道值定义A与B的红色通道之间的混合,而与Alpha的绿色通道 无关 ,该通道定义A与B的绿色通道之间的混合。 项目 说明 属性 常量A(Const A) 映射到0.0的值。仅当未连接A输入时才使用。 常量B(Const B) 映射到1.0的值。仅当未连接B输入时才使用。 常量Alpha(Const Alpha) 接收要用作遮罩alpha的值。仅当未连接Alpha输入时才使用。 输入 A 接收映射到0.0的值。 B 接收映射到1.0的值。 Alpha 接收要用作遮罩alpha的值。 程序员需知: LinearInterpolate根据参数值Alpha在A与B之间执行按通道插值。
噪点(Noise) 表达式建立过程式噪点场,以使您能够控制其生成方式。 项目 说明 属性 比例(Scale) 更改噪点单元的整体大小。数字越小,噪点越大。 质量(Quality) 外观/性能设置。值越小,速度越快,但效果越差;值越大,速度越慢,但效果更好。 函数 函数 说明 Simplex 基于纹理 高质量,可直接使用并用于凹凸,每个等级约77个指令,4个纹理查找,不能平铺。 Gradient 基于纹理 高质量,可直接使用并用于凹凸。无平铺:每个等级约61个指令,8个纹理查找。平铺:每个等级约74个指令,8个纹理查找。即使"非平铺"模式的重复也可以达到128。适用于重复大小范围小于等于128。之前被标记为"柏林"(Perlin)噪点。 Fast Gradient 3D纹理 高质量,可直接使用, **不适用**于凹凸,每个等级约16个指令,1个纹理查找。固定以16重复进行平铺,快速梯度噪点不可选择"平铺"模式。 Gradient 计算 高质量,可直接使用并用于凹凸。无平铺:每个等级约80个指令,无纹理。平铺:每个等级约143个指令,无纹理。 Value 计算 低质量,但为纯计算。无平铺:每个等级约53个指令,无纹理。平铺:每个等级约118个指令,无纹理。之前被错误标记为梯度(Gradient)噪点。 Voronoi 亦称沃利或单元噪点。质量为1则搜索8个单元,质量为2则搜索16个单元,质量为3则搜索27个单元,质量为4则搜索32个单元。每个单元总共搜索约20个指令。 干扰(Turbulence) 启用"干扰"(Turbulence)后,每个噪点倍频只会在结果中增加绝对值。改变视觉特征,并且会塑造出类似于清晰的山脊形状 级别(Levels) 不同范围要合并的不同噪点级数量乘以级别数量的计算成本。 最小输出(Output Min) 噪点计算的最低值输出。 最大输出(Output Max) 噪点计算的最高值输出。 级别范围(Level Scale) 级别范围始终为活动状态,确定每个新倍频的范围变化量。 平铺(Tiling) 对于支持该属性的噪点函数,允许噪点平铺。在将噪点烘焙到无缝包裹纹理时,该属性成本更高,但十分有用。 重复大小(Repeat Size) 平铺时,噪点的重复频率。 输入 位置(Position) 允许通过 3D 向量来调整纹理大小。 过滤宽度(FilterWidth) 实际上,控制应用于噪点纹理的模糊量。
上一帧开关(Previous Frame Switch) 材质表达式可用于生成正确的动态向量,以正确用于时间抗锯齿和动态模糊,从而辅助材质中复杂顶点动画的实现。 仅随时间而变的材质已经可以不加修改直接使用,但是,它们无法考虑可能在运行时影响动画的其他变量,例如材质参数。上一帧开关材质表达式可用于跟踪这些参数如何变化,从而手动解决这些问题。例如,在蓝图中,它们可以手动提供表达式,用于帧之间的世界位置偏移变化所导致的动态向量生成。 必须在 项目设置(Project Settings) 的 渲染(Rendering) 下启用来自顶点变形的速度后,此表达式才能正确生效: 4.24及之前版本使用 来自顶点变形的精准速度(Accurate Velocities from Vertex Deformations) 4.25及之后版本使用 来自顶点变形的输出速度(Output velocities from vertex deformation) 项目 说明 当前帧(Current Frame) 用作起点参考的方向向量。 上一帧(Previous Frame) 用作要添加模糊量的XYZ参考的方向向量。 下面是一个在材质中使用 Previous Frame Switch 材质表达式的示例。
在该示例中,Previous Frame Switch使用常量值通过"Multiply节点控制方向模糊。 在该示例中,您可以看到该函数在Epic自家游戏(如《堡垒之夜》)中的使用效果,通过在屏幕上聚集的顶点动画控制动态模糊。 右侧动画使用上一帧开关(Previous Frame Switch)来添加一些动态模糊,而左侧动画则没有。 视口显示标记编辑器视口的 显示(Show) > 可视化(Visualize) > 上一帧的重新投影(Previous Frame's Reprojection) 下有一个显示标记,可以与 上一帧开关(Previous Frame Switch) 一起使用,诊断并更正当前帧和上一帧的定向向量中的差异。
启用后,此可视化器会将当前帧颜色与上一帧比较,并返回两个帧之间的差异。 如果没有差异,材质会在视口中显示为灰色(如左图)。如果定向向量不匹配,材质会显示彩色覆层(如右图)。
质量开关(QualitySwitch) 表达式允许根据引擎在不同质量级别之间的切换使用不同的表达式网络,例如在较低端的设备上使用较低的质量。 项目 说明 默认值(Default) 此输入用于针对默认视觉质量而设计的网络。 低(Low) 此输入用于针对较低视觉质量而设计的网络。 高(High) 此输入用于针对较高视觉质量而设计的网络。 绕轴旋转绕轴旋转(RotateAboutAxis) 表达式在给定旋转轴、该轴上的某个点以及旋转角度的情况下,旋转三通道向量输入。此表达式适合于使用"全局位置偏移"(WorldPositionOffset)产生质量优于简单剪切的动画。 项目 说明 规范化旋转轴(NormalizedRotationAxis) 接收一个规范化 (0-1) 向量,它代表对象的旋转轴。 旋转角度(RotationAngle) 旋转角度。值1表示完全360度旋转。 枢轴点(PivotPoint) 接收代表枢轴点的三通道向量,对象将绕着该枢轴点旋转。 位置(Position) 接收代表对象位置的三通道向量。创建RotateAboutAxis表达式时,将自动创建一个WorldPosition表达式并将其连接至此输入。
在以上示例中,预览平面将显示为绕着它的垂直轴旋转。 球体遮罩球体遮罩(SphereMask) 表达式根据距离计算来输出遮罩值。如果某一个输出是某个点的位置,而另一输入是具有某半径的球体的中心,那么遮罩值将是0(位于球体外部)和1(位于球体内部),并存在一定的过渡区域。此表达式可作用于单分量、双分量、三分量和四分量向量。 项目 说明 属性 衰减半径(Attenuation Radius) 指定用于距离计算的半径。 硬度百分比(Hardness Percent) 指定过渡区域大小。此项目类似于Photoshop的笔刷硬度值。0表示硬过渡,100表示最大化过渡区域(软过渡)。 输入 A 接收一个值,该值代表要检查的点的位置。 B 接收一个值,该值代表球体中心。 节点将输出值1,直至摄像机超过特定距离,此后将输出0。
薄半透明材质输出 表达式可在单通道中精准再现基于物理的半透明材质。它可用于创建 真正的 染色或彩色半透明材质并对光照和着色做出精准的反馈。
点击查看大图 在创建染色玻璃材质时,需要白色的高光和染色的背景。它们都由基于物理的着色器在单通道中渲染,并能够表现从空气中反弹到玻璃内的光线,以及从玻璃内反弹到空气中的光线。
在材质细节面板中进行以下设置即可启用薄半透明材质输出: 混合模式(Blend Mode) :半透明 着色模型(Shading Model) :薄半透明 光照模式(Lighting Mode) :表面ForwardShading 向量噪点
向量噪点材质(Vector Noise Material)表达式添加了更多的三维或四维向量噪点结果以在材质中使用。由于这些函数会产生运行时间开销,建议在使用它们开发外观之后,使用虚幻引擎4.13及其后续版本中引入的渲染目标功能,将所有或部分计算烘焙到纹理中。这些材质表达式允许在最终资源的引擎中开发程序外观,从而提供了一种使用外部工具创建程序生成的纹理以应用于虚幻引擎中的资源的替代方法。在向量噪点材质表达式(Vector Noise Material Expression)中,你将看到以下向量噪点类型。 图像 选项 说明
单元格噪点(Cellnoise) 为三维网格中的每个对象返回随机颜色(即从应用于节点输入的数学下限运算)。对于给定位置,结果始终保持一致,因此可以提供一种可靠的方法来将随机性添加到材质中。该向量噪点(Vector Noise)函数的计算非常便宜,因此没有必要为了性能而将它烘焙到纹理中。
Perlin三维噪点(Perlin 3D Noise) 为三维网格中的每个对象返回随机颜色(即从应用于节点输入的数学下限运算)。对于给定位置,结果始终保持一致,因此可以提供一种可靠的方法来将随机性添加到材质中。该向量噪点(Vector Noise)函数的计算非常便宜,因此没有必要为了性能而将它烘焙到纹理中。
Perlin梯度(Perlin Gradient) 计算标量Perlin Simplex噪点的分析三维梯度。输出为四个通道,其中前三个(RGB)为梯度噪点,第四个(A)为标量噪点。该噪点类型对于表面上的凹凸或者流动贴图很有用。
Perlin梯度(Perlin Gradient) 计算向量Perlin Simplex噪点(又名旋度噪点)的分析三维旋度。输出为一个三维有向旋度向量,它对流体或粒子流动很有用。
Voronoi 计算与标量噪点材质节点相同的Voronoi噪点。标量Voronoi噪点在三维空间中散射种子点,并返回与相隔最近的一个种子点的距离。向量噪点(Vector Noise)变体返回RGB中最近的种子点的位置,以及在A中与它相隔的距离。特别是与单元格噪点(Cellnoise)结合使用时,这可以允许每个Voronoi单元格执行一些随机行为。 下面是一个简单的石床材质,使用向量噪点(Vector Noise)/Voronoi的距离分量,并结合向量噪点(Vector Noise)/单元格噪点(Cellnoise),来调整一些表面凹凸并在缝隙和种子位置中混合苔藓,以更改每块岩石的颜色和凹凸高度。
正如普通的Perlin噪点一样,基于导数的Perlin旋度和Perlin梯度运算也可以按倍频添加在一起。对于更复杂表达式的导数,有必要计算表达式结果的梯度。为了帮助实现这一点,可以将要计算的表达式放入一个材质函数中,并将其与以下辅助节点一起使用。 选项 说明 Prepare3DDeriv 利用四面体图形中的位置偏移计算三维导数。在该函数产生的每个偏移位置计算同一个三维函数,然后将结果值输入Compute3DDeriv。 Compute3DDeriv 利用四面体图形中的位置偏移计算三维导数。与Prepare3DDeriv一起使用。 GradFrom3DDeriv 根据Prepare3DDeriv/Compute3DDeriv的结果计算三维梯度向量。 CurlFrom3DDeriv 根据Prepare3DDeriv/Compute3DDeriv的结果计算三维向量场的旋度。 这些辅助材质函数使用四面体图形中间隔的基本表达式的四个求值来近似计算这些基于导数的运算。 你将在下面看到各种噪点函数的相关说明,这些函数可以在向量噪点材质表达式(Vector Noise Material Expression)中找到。 项目 说明 属性 函数 函数 说明 单元格噪点(Cellnoise) 为三维空间中的每个整数网格单元格提供随机颜色。大约有10条指令。 Perlin三维噪点(Perlin 3D Noise) 计算性Perlin噪点,带三维输出,每个通道输出的范围为-1到1。如果只使用红色通道,则有大约83条指令;如果使用所有三个通道,则有125条指令。 Perlin梯度(Perlin Gradient) 计算Perlin噪点函数的梯度。RGB输出包含梯度向量,A为标量噪点。大约有106条指令。 Perlin旋度(Perlin Curl) 计算三维旋度噪点。输出为Perlin三维噪点的数学旋度。大约有162条指令。 Voronoi 与 噪点(Noise) 表达式中的Voronoi函数的算法和指令数相同,但RGB为每个Voronoi单元格中最近的种子点的位置,A为与该种子点相隔的距离。 质量(Quality) 外观/性能设置。值越小,速度越快,但可能外观越差;值越大,速度越慢,但可能外观越好。 平铺(Tiling) 对于支持它的噪点函数,它允许平铺噪点。此函数使用成本较高,但在将噪点烘焙到无缝缠绕纹理时很有用。 平铺大小(Tile Size) 平铺时噪点应多久重复一次。对于Perlin噪点变体,平铺大小(Tile Size)必须是三的倍数。 输入 位置(Position) 允许通过三维向量来调整纹理大小。 单元格噪点(Cell Noise) 材质示例:
点击查看大图。 Perlin梯度(Perlin Gradient) 材质示例:
点击查看大图。 Voronoi 材质示例:
点击查看大图。 |
CopyRight 2018-2019 实验室设备网 版权所有 |