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 和纹理分辨率如何影响连续性与采样成本。

third order:优化三阶重建source texels43% phase查询记录filterthirdfetches2support2resolution18绿色 = 查询点灰点 = 原 texel改变 phase 观察重建连续性;改变 resolution 观察过滤与细节保留的交换

三阶重建更平滑,但必须结合 footprint、mip 与 ringing 检查,不能只看单点曲线。

本章主题 Fast Third-Order Texture Filtering 的目标是用更少的硬件采样逼近三阶重建,而不是牺牲过滤的可解释性换取一张“看起来更糊”的图。

Fast Third-Order Texture Filtering:从 texel 到连续重建纹理输入texel gridUV · footprintphase · mipkernel 重建third-order basisfour support texelsbilinear fusion输出颜色horizontal passvertical passsmooth result快速的关键不是少算权重,而是让硬件线性采样承担一部分三阶组合

1. 三阶核与四个相邻 texel

一维纹理可以看成在整数位置记录的样本 fif_i。当查询位置位于 iii+1i+1 之间时,三阶重建通常会使用 fi1,fi,fi+1,fi+2f_{i-1},f_i,f_{i+1},f_{i+2} 四个样本,并由相位 tt 计算权重:

f(x)=w0(t)fi1+w1(t)fi+w2(t)fi+1+w3(t)fi+2. f(x)=w_0(t)f_{i-1}+w_1(t)f_i+w_2(t)f_{i+1}+w_3(t)f_{i+2}.

不同的三阶核会给出不同的权重曲线。Catmull-Rom 类核倾向于保持边缘锐度,B-spline 类核更平滑但可能偏软;一个工程实现不能只写“cubic”而不记录核的参数、边界和是否允许 overshoot。权重的和、连续性以及在常量输入上的保持能力,都应成为测试断言。

third-order kernel:四个邻居,两个硬件线性 fetchf0w0f1w1f2w2f3w3linear fetch A ≈ f0 + f1linear fetch B ≈ f2 + f3再用两个组合权重混合 A、B;相位改变时仍需保证 support 不越界

如果直接逐个读取四个 texel,三阶重建会产生较高的 dependent fetch 成本。硬件双线性采样可以把相邻的两项先合并:先选择两个合适的线性采样位置和内部相位,再用外层权重组合两个结果。这样做的关键不是“调用 bilinear 就自动变成 cubic”,而是要证明新的 fetch 位置和权重在目标核上等价或足够接近。

边界是最容易破坏等价性的地方。wrap、clamp、border color 和镜像寻址会改变 support 中缺失样本的替代值;如果两个线性 fetch 跨过不同边界,优化形式可能与直接四样本公式不一致。对纹理边缘、单 texel 纹理和非幂次尺寸建立专门回归,比只测中心区域更可靠。

2. separable filtering:把二维问题拆成两次一维重建

对于可分离的二维核,先沿 x 方向对每一行重建中间值,再沿 y 方向对中间结果重建最终像素:

F(x,y)=jwj(y)(iwi(x)fi,j). F(x,y)=\sum_j w_j(y)\left(\sum_i w_i(x)f_{i,j}\right).
separable filtering:二维核拆成两个一维 pass二维 texelhorizontal每行一维重建vertical每列一维重建separable 假设把乘法与访存拆开管理,但仍要检查两个 pass 的边界和 mip 一致性

可分离形式减少了二维权重表和实现复杂度,但它不是无条件的性能胜利:中间结果可能需要额外寄存器或临时纹理,两个方向的边界策略必须一致,mip 与各向异性 footprint 也不能只在一个方向更新。对屏幕空间后处理而言,水平与垂直 pass 还要考虑 render target 往返和带宽。

3. kernel support、footprint 与 mip

support 描述一次查询要查看多远。support 太窄时,快速移动或高对比纹理会出现 aliasing、shimmer 和相位跳变;support 太宽时,边缘会过度模糊,锐利核还可能在高对比处产生 ringing。不能只用“更宽”解决所有伪影,因为正确 support 应与屏幕像素实际覆盖的纹理区域相匹配。

texture footprint:核宽度必须匹配屏幕覆盖screen-space footprint →detail retainedkernel too narrowaliasing / shimmermatched footprintdetail without ringing三阶重建提高连续性,但不会凭空恢复已经被 minification 丢失的频率

当纹理缩小到一个屏幕像素覆盖多个 texel 时,应先通过 mip 或其他预过滤表示压低不可见频率,再在选定级别做三阶重建。若直接在最高分辨率上用尖锐三阶核,可能只是把 aliasing 重新插值成移动的波纹;若 mip 过粗,再高阶的重建也只能平滑低频结果。实现上要记录 UV 导数、mip 选择、support 半径和最终 fetch 数,方便把视觉问题与成本对应起来。

4. 误差、ringing 与性能预算

三阶核的质量不能只用静态截图判断。至少应使用常量、斜坡、阶跃、脉冲和高频棋盘格五类输入,记录重建值、最大 overshoot、边缘位置、相位连续性和边界行为。常量输入应保持常量;阶跃输入允许有预期的过渡,但 overshoot 必须受材质容忍度限制。

texture footprint:核宽度必须匹配屏幕覆盖screen-space footprint →detail retainedkernel too narrowaliasing / shimmermatched footprintdetail without ringing三阶重建提高连续性,但不会凭空恢复已经被 minification 丢失的频率

性能预算也应分层:reference 四 texel path 用来验证数值;optimized path 使用硬件 linear fetch;separable path 评估二维带宽;最终 material path 再加上颜色空间、mip、各向异性和混合。不要用一个“fetches 少”指标证明优化有效,因为寄存器压力、纹理缓存命中率、pass 数和分辨率都会改变实际 GPU 时间。

三步实验:从 reference 到快速实现

每一步只改变一个变量,先记录 source texel、phase、support、mip/分辨率和 fetch 数,再比较视觉结果。若出现 ringing 或边缘亮线,回到四样本 reference,不要直接继续调外层颜色。

分步1 / 3

第一步:用四样本 reference 验证 cubic reconstruction

选择三阶重建,拖动 sample phase 穿过 texel。观察目标点如何在四个相邻样本之间移动,并用 kernel 图核对权重 support 与边界替代值。

third-order kernel:四个邻居,两个硬件线性 fetchf0w0f1w1f2w2f3w3linear fetch A ≈ f0 + f1linear fetch B ≈ f2 + f3再用两个组合权重混合 A、B;相位改变时仍需保证 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 iii+1i+1 之间时,为什么三阶重建通常需要 i1i-1i+2i+2 的四个样本?

问题 2|分析优化误差。 你用两次 bilinear fetch 逼近四样本三阶 reference。中心区域误差很小,但边缘出现亮线。请列出排查顺序。

问题 3|选择过滤预算。 一个远景后处理 pass 在 1080p 上出现 shimmer,改用更宽三阶核后性能下降。你会如何重新设计?

名词解释

本章出现的专业名词,用大白话再讲一遍。

third-order texture filtering
cubic reconstruction
bilinear interpolation
separable filtering
kernel support
texture footprint

资料与写作方式声明

本章以GPU Gems 2 · Chapter 20. Fast Third-Order Texture Filtering权威目录界定学习范围,并结合正文列出的技术资料独立重写;不宣称复现原书正文,也不沿用原作表述。

原作版权归作者与出版社所有;本站原创教学结构与表述仅供学习交流。

讨论

评论区加载中…