纹理采样基础:纹理坐标、纹理对象、采样器类型、纹理平铺与偏移

纹理采样,说白了就是怎么把一张图片贴到模型表面。很多新手觉得这步很简单,不就是拖个贴图进去吗?嗯,其实背后有不少门道。我在项目里见过太多因为纹理采样没搞明白,导致效果翻车的案例。

今天咱们就把这块彻底讲透。从最基础的纹理坐标开始,到采样器类型的选择,再到平铺偏移的实战技巧。你想想看,这些东西搞懂了,材质表现力至少提升一个档次。

纹理采样核心 纹理坐标 (UV) 纹理对象 采样器类型 平铺与偏移 UV0 / UV1 / 世界坐标 2D / 3D / Cube / Volume Wrap / Filter / Mipmap Tiling / Offset / Panning

纹理坐标:贴图的位置密码

纹理坐标,大家习惯叫它 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 坐标到采样器配置,再到平铺偏移的实战应用,每一步都有它的讲究。我个人觉得,理解这些基础比学那些花哨的节点更重要。基础打牢了,后面做复杂材质才能得心应手。

专注资料整理