Base-纹理过滤与Mipmap
纹理采样并不是在图片里找一个颜色那么简单。把一张小图放大,需要决定纹素之间的颜色;把远处一大片纹理压到一个像素,又需要避免细节变成闪烁。这是两种不同的采样问题。
双线性插值解决局部重建,Mipmap 提供不同尺度的预过滤结果,三线性过滤平滑层级过渡,各向异性过滤则处理倾斜表面上的细长采样区域。理解它们各自补的是什么,比记住“画质从低到高”的顺序更有用。
1. 从像素看纹素足迹
屏幕上的一个像素,经过投影和 UV 映射,会在纹理上对应一个区域,称为纹素足迹。近处放大的纹理可能是多个屏幕像素覆盖一个纹素;远处缩小的纹理则可能是一个像素覆盖几十个纹素。
前者缺的是中间值,后者缺的是合理平均。仅增加插值不能彻底解决后者:一个远处像素若仍只取附近少数原始纹素,摄像机轻微移动就会采到另一组细节,产生走样。

原笔记配图:规则网格在远处被压缩到少数像素后出现混叠,展示缩小过滤面对的问题。
2. 双线性插值:四个邻居的加权
设采样点在四个纹素中心之间,局部坐标为 s、t,二者位于 0 到 1:
1 | |
这相当于先水平方向插值,再垂直方向插值。它可以让放大后的纹理连续,但不会凭空恢复缺失的细节;对像素美术而言,这种平滑也未必是目标。
双线性不是对任意四个整数 UV 直接平均。真正的权重由采样位置相对纹素中心的位置决定,归一化 UV 到纹素空间还涉及纹理尺寸与半纹素位置。

原笔记配图:双线性插值先沿两个水平方向插值,再按局部竖直坐标混合。

原笔记配图:最近邻、线性及更高阶插值的形状对照;它属于采样重建问题,不是 GPU 块压缩格式。
3. Mipmap:先准备不同尺度的答案
Mipmap 的第 0 级是原图,第 1 级宽高各减半,继续下降直到最小尺寸。对于足够大的二维方形纹理,完整链的纹素数约为:
1 | |
因此额外纹素量约为原图的 1/3,而不是增加一倍。块压缩的小尺寸尾部、对齐以及非方形纹理会使实际字节数偏离这个近似。
选择层级时,可以把屏幕一个像素在纹理空间的覆盖宽度记为 rho,粗略使用 lod = log2(rho)。覆盖约 1 个纹素时是第 0 级,不是第 1 级;覆盖约 8 个纹素宽时接近第 3 级。
像素着色器通常利用相邻片元导数估算 UV 变化,再换算成纹素尺度。手工显式 LOD、计算着色器和不连续分支中的采样,需要另行考虑导数来源与合法性。

原笔记配图:从第 0 级到更粗 Mip 的图像层级:索引增大时,分辨率下降。

原笔记配图:投影后的纹素足迹与 LOD 的尺度关系;图中使用的是近似的足迹尺度估计。

原笔记配图:将 LOD 直接取整时,相邻层级之间可能出现明显分界。
4. 三线性过滤:在两级之间过渡
LOD 为 2.4 时,只取第 2 级会让层级切换突兀。三线性过滤在第 2、3 级各做一次双线性过滤,然后以 0.4 为权重混合。
名字里的“第三个维度”是层级,不是三维纹理。概念上涉及两个层级共八个纹素,但不能把这直接解释为八次独立显存事务:纹理单元、缓存、压缩和访问局部性都会改变硬件成本。

原笔记配图:分别在两个相邻 Mip 中双线性采样,再按连续 LOD 混合。

原笔记配图:三线性过滤使不同 Mip 之间的可见分界更平滑,但不保证消除全部混叠。
5. 各向异性过滤:保住细长方向的细节
斜着看一条道路时,像素映射到纹理上的区域常常一边长、一边短。若只按照最长边选择一个较小的 Mip,短边方向也被过度平均,道路会糊。
各向异性过滤沿足迹进行更合适的多点采样,在抑制长轴走样的同时保留短轴细节。它通常增加采样与带宽成本,并不要求纹理内存固定增加三倍;最大各向异性倍数也不等于固定采样次数。

原笔记配图:各向异性足迹与矩形预过滤的旧资料示意。Ripmaps、积分图与硬件各向异性过滤不是同一个实现。

原笔记配图:同一个屏幕像素在倾斜表面的纹理空间中形成细长足迹。

原笔记配图:积分图通过额外存储查询矩形区域的和;这是另一类预过滤结构,不等同于普通 Mipmap。
6. 工程上如何选择
观察远处地面闪烁时,先确认有没有 Mipmap、LOD Bias 是否过低;斜坡变糊时,再检查各向异性过滤。UI 和像素画可能刻意使用点采样,但三维场景纹理通常需要考虑缩小过滤。
Mipmap 的生成还取决于数据含义。颜色应关注线性光空间的过滤;法线需考虑方向与归一化;Alpha Clip 的遮罩可能需要覆盖率保持。并非所有通道都适合直接逐字节平均。
总结
过滤的核心是让一个屏幕像素代表正确尺度的纹理区域。双线性补中间值,Mipmap 补尺度,三线性补层级连续性,各向异性补足迹形状。采样质量、显存容量和运行时带宽应分别评估,不能用一个固定倍率概括。