2、颜色与纹理基础:常量颜色节点、纹理采样、UV坐标基础、平铺与偏移

好,我们正式开始材质编辑器的核心内容。这一章,我会带你搞定材质里最基础、也最常用的几个东西——颜色、纹理、UV坐标。说白了,就是让材质「看起来像什么」的关键。

我个人习惯把材质比作「画布」,而颜色和纹理就是颜料。你想想看,没有颜料,画布再大也没用。所以这一章,咱们先把颜料准备好。

2.1 常量颜色节点:最简单的颜色控制

常量颜色节点(Constant Color Node),是材质编辑器里最基础的节点之一。它的作用很简单——输出一个固定的颜色值。

你可以在材质蓝图里右键搜索「Constant」或者「Color」,就能找到它。双击节点,会弹出一个颜色选择器,你可以直接选颜色,或者手动输入RGB值。

关键点:常量颜色节点输出的是 float3 类型,也就是RGB三个通道。如果你需要透明度(Alpha),得用 Constant4Vector 节点,它输出RGBA四个通道。

我在项目中遇到过一个问题:美术同学给了一个纯红色(1,0,0),结果渲染出来偏暗。后来发现,他用的颜色值是在sRGB空间下取的,而材质编辑器默认是线性空间。嗯,这里要注意——颜色值在不同色彩空间下表现不一样。如果你发现颜色「不对」,先检查一下颜色空间设置。

小技巧:在材质编辑器里,按住 3 键然后左键点击,可以快速创建一个常量颜色节点。按住 1 键是创建标量(float),按住 2 键是创建二维向量(float2)。这些快捷键能帮你省不少时间。

2.2 纹理采样:让材质「活」起来

常量颜色节点只能输出单一颜色,太单调了。真正让材质变得丰富的是纹理采样(Texture Sample)。

纹理采样节点,说白了就是读取一张图片,然后输出每个像素的颜色值。你只需要把一张纹理贴图拖进材质编辑器,或者右键搜索「Texture Sample」,然后指定纹理资源就行。

纹理采样节点默认输出四个通道:RGBA。其中RGB是颜色,A是透明度(或者你自定义的其他数据)。

注意:纹理的尺寸、格式、压缩方式都会影响最终效果和性能。我建议你尽量使用2的幂次方尺寸(如512x512、1024x1024),并且开启sRGB选项(对于颜色贴图)。法线贴图、粗糙度贴图等非颜色贴图,记得关闭sRGB。

我曾经踩过一个坑:把法线贴图当成颜色贴图导入,结果渲染出来的模型像被泼了硫酸一样凹凸不平。后来检查才发现,法线贴图的sRGB选项没关。嗯,这个错误我犯过一次就再也没忘过。

2.3 UV坐标基础:纹理怎么「贴」上去的

纹理采样节点虽然能读取图片,但它怎么知道每个像素对应模型表面的哪个位置?答案就是UV坐标。

UV坐标,说白了就是模型表面的一张「地图」。U对应水平方向,V对应垂直方向。每个顶点的UV值都在0到1之间。纹理采样节点会根据UV坐标,去纹理上取对应的颜色。

在材质编辑器里,你可以通过 TextureCoordinate 节点来获取模型的UV坐标。这个节点默认输出 float2,也就是UV两个通道。

核心概念:UV坐标的(0,0)对应纹理的左下角,(1,1)对应纹理的右上角。但要注意,有些软件(比如Photoshop)的坐标系是左上角为原点,而Unreal里是左下角。这个差异会导致纹理上下翻转,我刚开始做材质时就被这个坑过。

你想想看,如果没有UV坐标,纹理就不知道往哪贴。所以UV坐标是材质和模型之间的「桥梁」。模型师在建模时,会为每个模型生成UV。如果UV展开得不好,纹理就会出现拉伸、接缝等问题。

2.4 平铺与偏移:控制纹理的重复和移动

有了UV坐标,我们就能控制纹理的显示方式了。最常用的两个操作是平铺(Tiling)和偏移(Offset)。

平铺,就是让纹理在模型表面重复出现。比如一块砖墙纹理,如果只贴一次,可能只覆盖一小块区域。通过平铺,你可以让砖墙纹理铺满整个墙面。

偏移,就是让纹理在UV方向上移动。比如你想让纹理向左滑动,或者向上滚动,就可以用偏移来实现。

在材质编辑器里,你可以用 Multiply 节点来实现平铺,用 Add 节点来实现偏移。具体做法是:

// 平铺:将UV坐标乘以一个值
UV * TilingValue

// 偏移:将UV坐标加上一个值
UV + OffsetValue

// 组合使用
(UV * TilingValue) + OffsetValue

举个例子,如果你想让纹理在水平方向重复4次,垂直方向重复3次,就把UV坐标乘以(4, 3)。如果你想让纹理向右移动0.5个单位,就在U方向上加上0.5。

实用技巧:在材质编辑器里,你可以用 ScalarParameter 节点来暴露平铺和偏移的参数,这样在材质实例里就能动态调整。我经常用这个来做「纹理缩放」和「纹理滚动」效果,比如流动的水面、滚动的传送带。

我记得有一次做游戏里的「全息投影」效果,需要纹理不断向上滚动。我就在材质里把UV的V方向加上一个随时间变化的偏移值,然后用 Time 节点驱动。效果出来之后,美术同学说「就是这个感觉」。

2.5 实战:做一个简单的纹理平铺效果

光说不练假把式。我们来做一个最简单的材质:

  1. 创建一个新的材质,命名为 M_TilingDemo
  2. 拖入一张纹理贴图(比如砖墙纹理)
  3. 添加一个 TextureCoordinate 节点
  4. 添加一个 Multiply 节点,将UV坐标乘以一个 ScalarParameter(命名为 Tiling,默认值设为1)
  5. 将乘法的结果连接到纹理采样节点的UV输入
  6. 将纹理采样节点的RGB输出连接到材质的Base Color

这样,你就得到了一个可以控制平铺次数的材质。在材质实例里调整 Tiling 参数,纹理就会重复或缩小。

扩展思路:你可以再加一个 ScalarParameter 来控制偏移,实现纹理的滚动效果。比如做「流动的岩浆」或者「飘动的云层」,都是基于这个原理。

2.6 常见问题与避坑指南

  • 纹理显示为纯色?检查纹理是否成功导入,以及UV坐标是否正确连接。
  • 纹理拉伸变形?可能是模型的UV展开有问题,或者平铺值设置不当。
  • 纹理颜色偏暗或偏亮?检查sRGB设置是否正确。颜色贴图要开启sRGB,法线贴图要关闭。
  • 纹理边缘出现接缝?可以尝试开启纹理的「Address X/Y」为Wrap模式,或者调整UV坐标。

我曾经遇到过一个特别诡异的问题:纹理在编辑器里看着正常,但打包到手机上就变模糊了。后来发现是纹理的Mipmap设置问题。嗯,这个坑让我学会了「纹理的Mipmap生成方式会影响最终显示效果」。

好了,这一章的内容就到这里。颜色和纹理是材质的基础,UV坐标是控制纹理的关键。下一章,我们会深入材质数学运算,看看怎么用加减乘除做出更丰富的效果。


公众号:蓝海资料掘金营,微信deep3321