BK / GRAPHICS NOTES
REAL-TIME / 07

纹理:在连续表面上查询离散数据

纹理不仅保存颜色,也能保存法线、粗糙度、阴影和任意查找数据。真正困难的部分,是如何在像素网格和纹素网格之间稳定地采样。

阅读约 10 分钟前置:光栅化、光照难度:进阶

01 / UV 把表面连接到图像

纹理坐标通常写作 (u,v),大多在 0 到 1 范围内。模型每个顶点携带 UV,光栅器在三角形内部进行透视校正插值,片元着色器再用结果查询纹理。

UV 棋盘纹理映射到倾斜四边形UV SPACESURFACE(0,0)(1,0)(0,1)
展开过程会在模型表面产生接缝,也会带来局部拉伸;UV 布局是在二者之间权衡。

一个空间顶点在 UV 接缝两侧可能需要两份纹理坐标,因此在顶点缓冲中也会被拆成两个逻辑顶点。UV 重叠可复用纹理区域,但不适合要求每处唯一数据的烘焙。

02 / 放大时:一个纹素覆盖多个像素

当纹理被放大,采样点落在纹素之间。最近邻过滤选择最接近的纹素,边缘清晰但呈块状;双线性过滤读取周围四个纹素并按距离加权,结果更平滑。

双线性过滤 = 对四个相邻纹素做两次水平插值 + 一次垂直插值
过滤方式代价视觉特征
最近邻1 次邻近查询锐利、像素化
双线性4 个纹素参与平滑、略模糊
双三次等高级过滤更多纹素参与质量更高,实时中较少直接使用
过滤不会创造真实细节。它只决定如何从已有离散样本重建连续信号;低分辨率纹理放得再平滑,信息仍然有限。

03 / 缩小时:一个像素覆盖许多纹素

直接从最高分辨率纹理取一个样本,会漏掉该像素覆盖区域内的大量纹素,引发闪烁和摩尔纹。Mipmap 预先保存逐级缩小的纹理,每一级宽高减半。

Level 0: W × H
Level 1: W/2 × H/2
Level n: 1 × 1

GPU 根据纹理坐标在屏幕上的变化率选择合适层级。三线性过滤会在相邻两个 Mipmap 层各做双线性采样,再对两层结果插值,减少层级切换边界。

各向异性过滤

地面等掠射表面在屏幕上的像素足迹细长而非正方形。各向异性过滤沿主要方向取更多样本,可显著改善远处斜面清晰度。

04 / 范围外坐标与纹理语义

寻址模式定义 UV 超出 0 到 1 后如何处理:重复适合平铺材质;镜像重复减弱边缘突变;钳制适合不会重复的贴图;边框模式返回指定颜色。

纹理类型颜色空间典型通道
基础色、发光色sRGBRGB(A)
法线、粗糙度、金属度线性数据常合并通道
深度、阴影线性数据单通道
HDR 环境图线性浮点RGB

法线纹理存的是编码后的方向。常见切线空间法线会从 [0,1] 解码回 [-1,1],再通过 TBN 基变换到着色空间。

05 / 常见伪影从采样关系排查

  • 远处闪烁:缺少 Mipmap,或缩小过滤设置错误。
  • 接缝渗色:图集单元边缘留白不足,过滤读到了相邻区域。
  • 法线方向异常:通道约定、切线基或颜色空间错误。
  • 纹理上下颠倒:图像原点与 API 的 V 轴约定不同。
  • 画面过暗:颜色纹理未做 sRGB 解码,或数据纹理被错误解码。
关键问题:一个屏幕像素在纹理空间覆盖多大、多长的区域?过滤器的任务就是为这个“像素足迹”估计代表值。