UDN
Search public documentation:

MaterialInstanceConstantCH
English Translation
日本語訳
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 主页 > 材质 & 贴图 > 材质实例常量参数继承

材质实例常量参数继承


材质实例常量参数继承

概述


MaterialInstanceConstant(材质实例内容常量)对象允许用户覆盖材质上的定义的参数集合,从而创建给定材质的自定义实例。

通过在您的材质中使用一些材质表达式,您能够以每个实例为基础来提供参数。这些表达式包括:

材质表达式 描述
ScalarParameter 提供了用户可以定义的带符号的浮点值。对于 alpha 值、乘法表达式等是有用的。
VectorParameter 提供了一个用户可以自定义的四维常量值。对于颜色及 2 维、3 维、4 维分量操作(比如 UVOffset)是有用的。
TextureSampleParameter2D 提供了一个用户可以自定义的 Texture2D (二维贴图)值。对于创建一个根据实例可以使用不同贴图的材质是有用的。
TextureSampleParameter3D 提供了一个用户可以自定义的 Texture3D (三维贴图)值。
TextureSampleParameterCube 提供了一个用户可以自定义的 TextureCube (立方体贴图)值。

每个 MaterialInstanceConstant 有一个指向它父类的指针,它从其父类继承它没有重写的参数。父类可以是一个材质或者是另一个 MaterialInstanceConstant。这个系统允许设置一些有趣的继承来扩展现有材质效果。

这个文档将提供一个关于在多继承设置中这些参数的继承是如何发生的例子。将会创建一个使用特殊贴图的材质,继承的实例将验证系统的灵活性。

源贴图


使用源贴图 ColorQuarters.tga,它是一个简单的具有四个颜色的图片,且 alpha 通道中插入了数值。图片如以下所示:

SourceTexture.jpg

图 1. ColorQuarters.tga - RGB 图像

SourceTextureAlpha.jpg

图 2. ColorQuarters.tga - Alpha 通道

当把这个贴图应用到一个 BlendMode(混合模式)设置为 BLEND_Translucent 或 BLEND_Masked 的材质时,图像就将分别在红色、黄色、蓝色和绿色上显示数字 1-4。

材质


使用上面的贴图创建一个材质 ThreeParam_Mat,剪切 UV 坐标以便可以在特定的时间仅显示 4 个方块中的一个。它可以通过使用比例 (0.5, 0.5) 来缩放输入贴图坐标来实现。这个缩放的结果将会产生一个红色`1'的图像(如果混合模式设置的合理的话)。

三个用户可以定义的参数将会被插入到材质中来演示继承关系。

第一个参数 UVOffset,它是一个用于和已缩放的贴图坐标相加的向量参数。这个参数通过一个参数的名称设置为"UVOffset"的 MaterialExpressionVectorParameter 实例提供。来自这个表达式的值穿过一个仅通过 X 和 Y 值的 ComponentMask(分量蒙板)。把得到的结果和已缩放的 UV 值相加来“变换”所使用的贴图的子图像。比如,如果 UVOffset 参数的值设置为(0.5, 0.0),贴图将显示右上方的四方形。UVOffset 的默认值为 (0.0, 0.0, 0.0, 0.0),不会产生任何贴图偏移。

最终计算出的贴图坐标被传入到 TextureSample(贴图样本)表达式,该贴图样本的贴图设置为源图片。

第二个参数 TextureBright,它是一个向量参数,用于和贴图样本的 RGB 输出相乘,从而使得到的图像变亮(或者变暗…)。参数通过 MaterialExpressionVectorParameter 实例提供,其参数名称设置为"TextureBright"。这个表达式的输出和贴图的 RGB 输出一同传入到一个 Multiply(乘法)表达式中。相乘的结果最终用于作为材质的 Diffuse(漫反射)值。TextureBright(贴图亮度)的默认值为 (1.0, 1.0, 1.0, 1.0),这个值对贴图的亮度没有影响。

第三个参数 AlphaScale,是一个标量参数,用于和贴图样本的 Alpha 输出端相乘,从而可以缩放图像的最终的透明度。参数通过 MaterialExpressionScalarParameter 实例提供,并设置参数的名称为"AlphaScale"。这个表达式的输出和贴图的 Alpha 输出一同输入到 Multiply(乘法)表达式内。然后把相乘的结果作为材质最终的 Opacity(不透明度)的值。AlphaScale 的默认值设置为 1.0,这将不会对贴图的 alpha 产生影响。

最终完成的材质如下所示:

Material.jpg

图3. 材质编辑器中的 ThreeParam_Mat

当把这个材质‘按照现在的样子’应用到一个网格物体时,此时默认的编辑器立方体呈现的结果如下所示:

Cube1.jpg

图 4.应用到网格物体上的ThreeParam_Mat

正如所看到的,贴图的子图像是左上角的图片。默认值使它没有变亮、没有偏移并且图像也没有进行透明度缩放。

第一个 MateriaInstanceConstant(材质实例常量)对象


现在创建一个 MaterialInstanceConstant(材质实例常量),设置它的父类为 ThreeParam_Mat。为了覆盖父类材质的默认参数,也要设置两个向量参数的值。

第一个参数"TextureBright",设置它的值为 (5.0, 5.0, 5.0, 1.0)。这个值将覆盖父类材质的设置 (1.0, 1.0, 1.0, 1.0),并且会导致材质比如原来亮 5 倍。

第二个参数是"UVOffset",设置这个参数的值为 (0.5, 0.5, 0.0, 0.0)。这个值将会覆盖父类材质的设置 (0.0, 0.0, 0.0, 0.0),将会导致材质样本变换为右下角的图片,显示绿色的‘4’。

这个 MaterialInstanceConstant(材质实例常量)的属性如下所示:

First_MatInst.jpg

图 5. First_MatInst 的属性.

当这个材质实例常量应用到一个静态网格物体上时,结果如下所示:

Cube2.jpg

*图 6.应用到静态网格物体上的 First_MatInst 。

正如所看到的,贴图的子图像是右下角的图片。贴图比在图 4 中显示的立方体亮,所以我们的实例常量是有效的。

第二个 MateriaInstanceConstant(材质实例常量)对象


现在创建第二个 MaterialInstanceConstant(材质实例常量)Second_MatInst,并设置它的父类为 MaterialInstanceConstant(材质实例常量)First_MatInst。为了覆盖它的父类的参数,也需要设置向量参数的值。

参数"TextureBright",设置其值为 (5.0, 5.0, 5.0, 1.0)。这个值将覆盖父类材质的设置 (1.0, 1.0, 1.0, 1.0),并且会导致材质比如原来亮 5 倍。

参数"UVOffset",设置其值为 (0.5, 0.0, 0.0, 0.0)。这个值将覆盖父类材质的设置 (0.5, 0.5, 0.0, 0.0),将会导致贴图样本变换为右上角的图片,显示为黄色的‘2’。

这个 MaterialInstanceConstant(材质实例常量)的属性如下所示:

Second_MatInst.jpg

图 7. Second_MatInst 属性.

当这个材质实例常量应用到一个静态网格物体上时,结果如下所示:

Cube3.jpg

*图 8.应用到静态网格物体上的 Second_MatInst 。

正如所看到的,贴图的子图像是右上角的图片。贴图也比在图 4 中的立方体更亮 – 使用了 First_MatInst 材质提供的值,所以我们的实例常量可以正确地工作。

小结


每个显示的立方体都是用的是同一个材质,但是由于使用了 MaterialInstanceConstant(材质实例常量)导致产生不同的外观。当把它们链接在一起时,便可以从同样的基础材质中产生各种效果。

对于这个例子,创建了一个包含三个参数的材质,这些参数可以通过使用 MaterialInstanceConstant 进行覆盖。

继承的层次设置如下所示(‘-->’代表‘箭头左侧的类是箭头右侧类的父类’):
ThreeParamMat --> First_MatInst --> Second_MatInst.

以下是在这个解释中所使用的 3 个立方体的屏幕截图:

Viewport.jpg

图 9.全部 3 个示例立方体

以下的表格详细说明了每个立方体获得参数的源:

立方体 应用的材质 TextureBright(贴图亮度) UVOffset(UV偏移) AlphaScale(透明度缩放)
最左侧 ThreeParam_Mat ThreeParam_Mat ThreeParam_Mat ThreeParam_Mat
中间 First_MatInst First_MatInst First_MatInst ThreeParam_Mat
最右侧 Second_MatInst First_MatInst Second_MatInst ThreeParam_Mat