纹理采样基础:纹理坐标、纹理对象、采样器类型、纹理平铺与偏移
纹理采样,说白了就是怎么把一张图片贴到模型表面。很多新手觉得这步很简单,不就是拖个贴图进去吗?嗯,其实背后有不少门道。我在项目里见过太多因为纹理采样没搞明白,导致效果翻车的案例。
今天咱们就把这块彻底讲透。从最基础的纹理坐标开始,到采样器类型的选择,再到平铺偏移的实战技巧。你想想看,这些东西搞懂了,材质表现力至少提升一个档次。
纹理坐标:贴图的位置密码
纹理坐标,大家习惯叫它 UV。U 和 V 其实就是贴图上的横向和纵向位置,范围通常是 0 到 1。你想想看,模型上的每个顶点都对应一个 UV 坐标,GPU 就是靠这个坐标去贴图上取颜色。
UE5 里默认用的是 UV0。但有些复杂模型会有多套 UV,比如 UV1 用来做光照贴图,UV2 用来做细节纹理。我在做写实角色时,经常把皮肤细节放在 UV1 上,这样不影响主贴图的布局。
核心要点:纹理坐标的本质是「映射关系」。模型顶点位置 → UV 坐标 → 贴图像素。这个链条断了任何一个环节,材质都会出问题。
获取纹理坐标的方式有几种:
- TextureCoordinate 节点:最常用,直接输出 UV0 或 UV1
- WorldPosition 转换:用世界坐标做纹理映射,适合地形或三平面映射
- 自定义 UV:通过材质函数或蓝图计算,实现扭曲、流动等效果
我的习惯:在材质编辑器里,我总会先拖一个 TextureCoordinate 节点看看 UV 布局。按住 L 键预览,能快速发现 UV 拉伸或重叠的问题。这招帮我省了不少调试时间。
纹理对象:贴图本身的门道
纹理对象就是咱们导入的那张图片。但 UE5 里它不只是图片,还包含了压缩格式、Mipmap 链、纹理组等信息。
常见的纹理对象类型:
| 类型 | 用途 | 注意事项 |
|---|---|---|
| Texture2D | 普通贴图 | 最常用,支持 Mipmap |
| TextureCube | 环境贴图 | 6 张面组成,用于反射 |
| Texture2DArray | 纹理数组 | 多张贴图打包,节省采样 |
| VolumeTexture | 体积纹理 | 3D 纹理,用于烟雾等 |
导入纹理时,有几个参数我特别在意:
- 压缩设置:法线贴图用 TC Normalmap,颜色贴图用 BC7 或 DXT5
- Mipmap 生成:默认开启,但 UI 贴图建议关掉,避免文字模糊
- 纹理组:把同类贴图分到一组,方便统一调整 LOD 偏置
我曾经踩过的坑:有一次做建筑可视化,所有贴图都用了默认压缩。结果法线贴图细节全丢了,墙面看起来像塑料。后来才发现法线贴图必须手动指定压缩格式为 TC Normalmap。嗯,从那以后我每次导入贴图都会检查这个参数。
采样器类型:GPU 怎么读贴图
采样器告诉 GPU 怎么从纹理对象里取颜色。它主要管两件事:寻址模式和过滤模式。
寻址模式(Wrap):
- Wrap:平铺重复,UV 超出 1 就回到 0
- Clamp:边缘拉伸,UV 超出 1 就取边缘颜色
- Mirror:镜像重复,像镜子一样来回反射
- Border:边界填充,超出部分显示指定颜色
过滤模式(Filter):
- Point:最近点采样,像素感强,适合像素风格
- Bilinear:双线性插值,平滑过渡,最常用
- Trilinear:三线性插值,Mipmap 之间也做混合
- Anisotropic:各向异性过滤,斜视角时细节保留最好
性能与画质的权衡:各向异性过滤效果最好,但开销也最大。我一般只在主材质上用 4x 或 8x,远处的细节材质用 Bilinear 就够了。你想想看,一个场景里几百个材质都用最高采样,帧率肯定扛不住。
在 UE5 材质编辑器里,采样器通过 Sampler Type 节点来配置。你也可以用 Texture Sample 节点直接连纹理对象,它会自动使用默认采样器。
// 材质蓝图中的采样器配置示例
// 创建一个自定义采样器节点
SamplerGroup: Default
Filter: Bilinear
AddressX: Wrap
AddressY: Wrap
MipBias: 0.0
MaxAnisotropy: 4
纹理平铺与偏移:让贴图动起来
平铺和偏移是纹理采样的两个基本操作。平铺控制贴图重复多少次,偏移控制贴图的位置。
平铺(Tiling):
说白了就是把 UV 坐标乘以一个倍数。比如 Tiling 设为 (2, 2),那么原来 0 到 1 的范围就变成了 0 到 2,贴图会重复两次。配合 Wrap 寻址模式,就能实现无缝平铺。
偏移(Offset):
给 UV 坐标加上一个偏移量。这个操作常用来做纹理动画,比如流动的水、滚动的字幕。
实战技巧:做水面材质时,我会用 Time 节点驱动偏移,让 UV 随时间变化。配合两个不同方向和速度的纹理层,就能模拟出真实的水流效果。我建议你试试看,效果很惊艳。
在材质蓝图里,平铺和偏移通常通过 MaterialFunction 或直接操作 UV 来实现:
// 平铺偏移的数学表达
float2 UV = TextureCoordinate * Tiling + Offset;
// 实际材质节点连接
// 1. TextureCoordinate 节点输出 UV
// 2. Multiply 节点乘以 Tiling 值
// 3. Add 节点加上 Offset 值
// 4. 结果连到 Texture Sample 的 UV 输入
常见的平铺偏移应用场景:
- 无缝纹理:Tiling 设为 (4, 4),配合 Wrap 模式,地面贴图重复 4 次
- UV 动画:Offset 随时间变化,实现流动效果
- 细节纹理:主纹理 Tiling 小,细节纹理 Tiling 大,叠加出丰富细节
- 视差偏移:根据视角方向偏移 UV,模拟深度感
注意:平铺值不是越大越好。Tiling 太高会导致纹理重复感明显,看起来像棋盘格。我一般控制在 2 到 8 之间,配合细节纹理来增加变化。如果非要大面积平铺,建议用 Procedural 纹理或者多套纹理混合。
好了,纹理采样的基础就这些。从 UV 坐标到采样器配置,再到平铺偏移的实战应用,每一步都有它的讲究。我个人觉得,理解这些基础比学那些花哨的节点更重要。基础打牢了,后面做复杂材质才能得心应手。