01 / UV 把表面连接到图像
纹理坐标通常写作 (u,v),大多在 0 到 1 范围内。模型每个顶点携带 UV,光栅器在三角形内部进行透视校正插值,片元着色器再用结果查询纹理。
一个空间顶点在 UV 接缝两侧可能需要两份纹理坐标,因此在顶点缓冲中也会被拆成两个逻辑顶点。UV 重叠可复用纹理区域,但不适合要求每处唯一数据的烘焙。
02 / 放大时:一个纹素覆盖多个像素
当纹理被放大,采样点落在纹素之间。最近邻过滤选择最接近的纹素,边缘清晰但呈块状;双线性过滤读取周围四个纹素并按距离加权,结果更平滑。
双线性过滤 = 对四个相邻纹素做两次水平插值 + 一次垂直插值
| 过滤方式 | 代价 | 视觉特征 |
|---|---|---|
| 最近邻 | 1 次邻近查询 | 锐利、像素化 |
| 双线性 | 4 个纹素参与 | 平滑、略模糊 |
| 双三次等高级过滤 | 更多纹素参与 | 质量更高,实时中较少直接使用 |
过滤不会创造真实细节。它只决定如何从已有离散样本重建连续信号;低分辨率纹理放得再平滑,信息仍然有限。
03 / 缩小时:一个像素覆盖许多纹素
直接从最高分辨率纹理取一个样本,会漏掉该像素覆盖区域内的大量纹素,引发闪烁和摩尔纹。Mipmap 预先保存逐级缩小的纹理,每一级宽高减半。
Level 0: W × H
Level 1: W/2 × H/2
Level n: 1 × 1
Level 1: W/2 × H/2
Level n: 1 × 1
GPU 根据纹理坐标在屏幕上的变化率选择合适层级。三线性过滤会在相邻两个 Mipmap 层各做双线性采样,再对两层结果插值,减少层级切换边界。
各向异性过滤
地面等掠射表面在屏幕上的像素足迹细长而非正方形。各向异性过滤沿主要方向取更多样本,可显著改善远处斜面清晰度。
04 / 范围外坐标与纹理语义
寻址模式定义 UV 超出 0 到 1 后如何处理:重复适合平铺材质;镜像重复减弱边缘突变;钳制适合不会重复的贴图;边框模式返回指定颜色。
| 纹理类型 | 颜色空间 | 典型通道 |
|---|---|---|
| 基础色、发光色 | sRGB | RGB(A) |
| 法线、粗糙度、金属度 | 线性数据 | 常合并通道 |
| 深度、阴影 | 线性数据 | 单通道 |
| HDR 环境图 | 线性浮点 | RGB |
法线纹理存的是编码后的方向。常见切线空间法线会从 [0,1] 解码回 [-1,1],再通过 TBN 基变换到着色空间。
05 / 常见伪影从采样关系排查
- 远处闪烁:缺少 Mipmap,或缩小过滤设置错误。
- 接缝渗色:图集单元边缘留白不足,过滤读到了相邻区域。
- 法线方向异常:通道约定、切线基或颜色空间错误。
- 纹理上下颠倒:图像原点与 API 的 V 轴约定不同。
- 画面过暗:颜色纹理未做 sRGB 解码,或数据纹理被错误解码。
关键问题:一个屏幕像素在纹理空间覆盖多大、多长的区域?过滤器的任务就是为这个“像素足迹”估计代表值。