GPU Gems 2 · Chapter 20. Fast Third-Order Texture Filtering
用三阶核重建连续纹理信号,结合硬件双线性采样与可分离过滤,在细节、ringing、mip 和采样成本之间取得平衡。
学习目标
- 能解释 Fast Third-Order Texture Filtering 如何用三阶核重建纹理,并区分线性基线、三阶支持域与硬件 fetch 数量
- 能把 cubic reconstruction 拆成权重、硬件双线性采样和 separable filtering 两个方向,并说明边界、mip 与 ringing 的约束
- 能调节 ThirdOrderFilteringLab 的 phase、kernel support 和纹理分辨率,定位 aliasing、过度模糊与采样成本的交换
先把“纹理平滑”拆成重建与采样
纹理过滤不是简单地把邻近颜色平均。GPU Gems 2 第 20 章 Fast Third-Order Texture Filtering 讨论的是:把离散 texel 当作连续信号的样本,在任意 UV 位置重建一个平滑值;与此同时,shader 还要面对有限的纹理 fetch、硬件线性插值、mipmap 和屏幕像素 footprint。
先打开实验,固定纹理分辨率,拖动 sample phase 穿过一个 texel。观察线性基线和三阶重建在 texel 之间的过渡,再增大 kernel support,最后改变 resolution。你应该能看到一个清晰的取舍:更高阶的核可以让曲线更连续,但不代表它能恢复已经丢失的高频细节,也可能带来 overshoot 或更多计算。
Fast third-order filtering 实验
对比线性基线与三阶重建,观察 phase、kernel support 和纹理分辨率如何影响连续性与采样成本。
三阶重建更平滑,但必须结合 footprint、mip 与 ringing 检查,不能只看单点曲线。
本章主题 Fast Third-Order Texture Filtering 的目标是用更少的硬件采样逼近三阶重建,而不是牺牲过滤的可解释性换取一张“看起来更糊”的图。
↡在纹理离散样本之间使用三阶核进行连续信号重建的过滤方法;它通常使用四个相邻样本的一维支持域。 ↡依据目标位置与相邻 texel 的相对相位计算权重,并组合四个样本得到平滑值的重建过程。1. 三阶核与四个相邻 texel
一维纹理可以看成在整数位置记录的样本 。当查询位置位于 与 之间时,三阶重建通常会使用 四个样本,并由相位 计算权重:
不同的三阶核会给出不同的权重曲线。Catmull-Rom 类核倾向于保持边缘锐度,B-spline 类核更平滑但可能偏软;一个工程实现不能只写“cubic”而不记录核的参数、边界和是否允许 overshoot。权重的和、连续性以及在常量输入上的保持能力,都应成为测试断言。
如果直接逐个读取四个 texel,三阶重建会产生较高的 dependent fetch 成本。硬件双线性采样可以把相邻的两项先合并:先选择两个合适的线性采样位置和内部相位,再用外层权重组合两个结果。这样做的关键不是“调用 bilinear 就自动变成 cubic”,而是要证明新的 fetch 位置和权重在目标核上等价或足够接近。
边界是最容易破坏等价性的地方。wrap、clamp、border color 和镜像寻址会改变 support 中缺失样本的替代值;如果两个线性 fetch 跨过不同边界,优化形式可能与直接四样本公式不一致。对纹理边缘、单 texel 纹理和非幂次尺寸建立专门回归,比只测中心区域更可靠。
2. separable filtering:把二维问题拆成两次一维重建
↡把二维过滤核写成水平一维核与垂直一维核的连续应用,从而复用一维权重和硬件采样优化。对于可分离的二维核,先沿 x 方向对每一行重建中间值,再沿 y 方向对中间结果重建最终像素:
可分离形式减少了二维权重表和实现复杂度,但它不是无条件的性能胜利:中间结果可能需要额外寄存器或临时纹理,两个方向的边界策略必须一致,mip 与各向异性 footprint 也不能只在一个方向更新。对屏幕空间后处理而言,水平与垂直 pass 还要考虑 render target 往返和带宽。
3. kernel support、footprint 与 mip
↡过滤核在空间中具有非零权重的范围;support 越宽,参与重建的 texel 越多,也越可能产生更平滑或更昂贵的结果。support 描述一次查询要查看多远。support 太窄时,快速移动或高对比纹理会出现 aliasing、shimmer 和相位跳变;support 太宽时,边缘会过度模糊,锐利核还可能在高对比处产生 ringing。不能只用“更宽”解决所有伪影,因为正确 support 应与屏幕像素实际覆盖的纹理区域相匹配。
↡一个屏幕像素映射回纹理后覆盖的空间区域;它由 UV 导数、投影缩放和采样方向决定,用来选择过滤宽度与 mip 级别。当纹理缩小到一个屏幕像素覆盖多个 texel 时,应先通过 mip 或其他预过滤表示压低不可见频率,再在选定级别做三阶重建。若直接在最高分辨率上用尖锐三阶核,可能只是把 aliasing 重新插值成移动的波纹;若 mip 过粗,再高阶的重建也只能平滑低频结果。实现上要记录 UV 导数、mip 选择、support 半径和最终 fetch 数,方便把视觉问题与成本对应起来。
4. 误差、ringing 与性能预算
三阶核的质量不能只用静态截图判断。至少应使用常量、斜坡、阶跃、脉冲和高频棋盘格五类输入,记录重建值、最大 overshoot、边缘位置、相位连续性和边界行为。常量输入应保持常量;阶跃输入允许有预期的过渡,但 overshoot 必须受材质容忍度限制。
性能预算也应分层:reference 四 texel path 用来验证数值;optimized path 使用硬件 linear fetch;separable path 评估二维带宽;最终 material path 再加上颜色空间、mip、各向异性和混合。不要用一个“fetches 少”指标证明优化有效,因为寄存器压力、纹理缓存命中率、pass 数和分辨率都会改变实际 GPU 时间。
三步实验:从 reference 到快速实现
每一步只改变一个变量,先记录 source texel、phase、support、mip/分辨率和 fetch 数,再比较视觉结果。若出现 ringing 或边缘亮线,回到四样本 reference,不要直接继续调外层颜色。
第一步:用四样本 reference 验证 cubic reconstruction
选择三阶重建,拖动 sample phase 穿过 texel。观察目标点如何在四个相邻样本之间移动,并用 kernel 图核对权重 support 与边界替代值。
常见误区
本章小结
- Fast Third-Order Texture Filtering 把离散 texel 当作连续信号样本,用三阶 kernel 在任意 phase 重建颜色;它提高连续性,但不能恢复已丢失的频率。
- cubic reconstruction 通常使用四个相邻 texel;硬件 bilinear interpolation 可以合并贡献,但必须用 reference path 验证权重和边界等价性。
- separable filtering 把二维核拆成水平与垂直两次一维过滤,减少公式复杂度,却可能增加带宽、临时结果和 pass 成本。
- kernel support 与 texture footprint、mip 和屏幕覆盖率共同决定 aliasing、模糊、ringing 与 fetch 预算。
- 发布前用常量、阶跃、脉冲、棋盘格、全 phase 和边界模式做差分测试,再用完整 GPU profile 判断优化是否值得。
练习
问题 1|解释四样本 support。 查询位置位于 texel 与 之间时,为什么三阶重建通常需要 到 的四个样本?
问题 2|分析优化误差。 你用两次 bilinear fetch 逼近四样本三阶 reference。中心区域误差很小,但边缘出现亮线。请列出排查顺序。
问题 3|选择过滤预算。 一个远景后处理 pass 在 1080p 上出现 shimmer,改用更宽三阶核后性能下降。你会如何重新设计?
名词解释
本章出现的专业名词,用大白话再讲一遍。
- third-order texture filtering
- cubic reconstruction
- bilinear interpolation
- separable filtering
- kernel support
- texture footprint