← ALL ARTICLES
数学与采样5 MIN READ

采样与混叠

全库目录221
本文目录11

远处棋盘格会出现本来没有的大块条纹,因为像素网格把高频变化采成了错误的低频。我们先用频率解释这份歧义,再看过滤、提高采样密度和时间抖动分别改变了什么。

信号和频率

信号可以是一维声音、二维图像、纹理、阴影可见性,也可以是随时间变化的像素颜色。

频率描述变化速度:

  • 大块平缓颜色是低频;
  • 细线、硬边和密集纹理是高频;
  • 一次突变同时包含很多频率成分。

空间频率关注每个单位距离变化多少次。时间频率关注每秒变化多少次。

采样和混叠(Aliasing)

采样把连续信号记录为离散值。如果采样频率不足,高频信号会伪装成错误的低频信号,这就是混叠。

Nyquist-Shannon 采样定理给出的理想条件是:采样频率至少高于信号最高频率的两倍。真实图像通常不是严格带限信号,硬边甚至包含无限高频。因此实时渲染只能先过滤再近似采样。

混叠的频域机制

采样在频域中相当于把原信号的频谱按采样频率为间隔复制平移。采样频率足够高时,各份拷贝互不重叠,用一个低通滤波器取出中间那份就能还原信号;采样不足时,相邻拷贝互相叠进来,高频成分落入低频位置,叠进去的部分无法与原信号分离——这就是混叠不可逆的原因。

由此得到渲染中的两条直接推论:

  • 先过滤,再采样。Mipmap、各向异性过滤、带限的程序纹理,本质都是在采样前把信号带宽压到采样能力之内;
  • 分辨率决定上限。对均匀点采样,奈奎斯特频率是每两个像素一个周期;稳定重建还要求输入严格带限并满足重建核的假设。更高频的细节需要在采样前过滤,或通过更多空间、时间样本估计像素覆盖。这样能得到稳定的平均贡献,但不能在输出网格上保留原来的高频形状。这也是远处高频法线需要收敛、过细几何需要切换 LOD 的信号学依据。

取一维信号f(x)=cos(2π*0.75*x),在整数x采样。样本依次为1、0、−1、0、1,与cos(2π*0.25*x)的整数样本完全相同。采样率为每单位1次时,0.75周期/单位折叠成0.25;仅凭这些样本,重建器没有信息判定原来是哪一条曲线。这把频谱重叠落实到了可复算的样本歧义。

先把信号在每个像素宽度内平均,得到的是覆盖贡献,而不是在中心取一次值。对单位宽盒核,频率f的振幅乘以sin(πf)/(πf);0.75周期的振幅降到约0.3001,但尚未归零,因此盒滤波只能缓解该混叠。理想带限重建要求更严格的频谱条件;实际纹理Mip和像素滤波是在有限成本下选择核与残余误差。

采样误差与重建误差

离散图像中的两类误差需要分别定位:

  • 走样:频率超出采样能力,高频折回成低频。几何锯齿、纹理摩尔纹属于此类,对策是过滤或超采样;
  • 重建误差:已有样本通过所选滤波核生成连续图像时,核的通带、支撑范围和负瓣会影响模糊、锐度与振铃。放大模糊可能来自源采样已丢细节,也可能来自重建核,不能只凭最终画面认定原因。

把这两种混为一谈是常见误区——如果已有样本足够表达信号,先改重建滤波器才能利用这些信息;增加真实源样本仍可能改善细节,单纯插入更多插值点则不会恢复已经丢失的内容。

常见混叠:

  • 三角形边缘出现阶梯;
  • 远处棋盘纹理闪烁;
  • 细栅栏产生摩尔纹;
  • 高光随相机移动跳动;
  • 阴影边缘出现锯齿和游动。

低通和高通

低通滤波保留缓慢变化,削弱高频。模糊、纹理缩小前的预过滤和 Bloom 降采样都与低通有关。

高通滤波保留快速变化。边缘检测和锐化会强调高频,也更容易放大噪声。

Mipmap在缩小前过滤高频,可以减少闪烁,同时也移除了部分细节。检查时先看所选级别与像素足迹是否匹配,再判断模糊是否超过必要程度。

傅里叶变换

Fourier Transform 把信号从位置/时间域分解到频率域。直觉上,它是在问:这个信号由多少种不同频率和相位的正弦波组成?

离散傅里叶变换(DFT)对 NN 个样本直接计算通常需要 O(N2)O(N^2)。快速傅里叶变换(FFT)利用对称和递归结构把常见情况降到 O(Nlog⁡N)O(N\log N)。

实时图形中的常见用途:

  • 频域卷积;
  • 海面波浪频谱;
  • Bloom 或大核滤波的特定实现;
  • 音频和频谱可视化;
  • 分析采样和重建问题。

FFT 不是“所有模糊都更快”。小核滤波、分辨率、数据搬运和变换开销都会影响选择。

时域噪声和抖动

在低采样数算法中,可以让每帧使用不同随机样本,再通过多帧累积收敛。这会把固定的结构化误差变成随时间变化的噪声。

理想的抖动需要:

  • 单帧分布足够均匀;
  • 多帧序列覆盖更多位置;
  • 与重投影和历史拒绝配合;
  • 避免肉眼明显的周期。

蓝噪声强调把能量推到高频,人眼更不容易注意,后续滤波也更容易处理。但蓝噪声不是自动正确,缩放、平铺和时序循环仍可能暴露模式。

程序条纹的足迹积分

下面的 HLSL 输入是连续 UV,输出是经过像素覆盖估计的周期条纹。fwidth 近似当前 2x2 像素组内相位的变化范围:

hlsl
float BandLimitedStripe(float2 uv, float frequency)
{
    float x = uv.x * frequency;
    float footprint = max(fwidth(x), 1e-5);
    float lo = x - 0.5 * footprint;
    float hi = x + 0.5 * footprint;
    float integralLo = floor(lo) * 0.5 + max(frac(lo) - 0.5, 0.0);
    float integralHi = floor(hi) * 0.5 + max(frac(hi) - 0.5, 0.0);
    return saturate((integralHi - integralLo) / footprint);
}

频率接近或超过像素采样能力时,过渡带随 Footprint 变宽,减少闪烁。这是相位区间盒滤波模型,用周期积分处理回绕与大足迹;fwidth对屏幕足迹仍是近似。它不会恢复已经丢失的信息。把相机逐渐拉远并对比硬 step;硬边版本会产生摩尔纹,导数版本应平滑收敛到平均值。

验证方法

用同一条周期信号改变采样步长,比较原频率与离散结果。过滤必须先于抽取;放大已有样本只能改变重建,不能恢复已丢失的频率。导数片段对一维条纹做相位区间积分,仍需用实际像素足迹检查二维投影近似。

条纹函数是片元阶段HLSL片段,要求导数可用且相位连续;它只近似一维相位足迹。CPU积分检查和DXC入口见下方链接,完整渲染与动态画面仍需目标工程验证。

本机CPU验证:周期相位积分由 completion_reference.py 检查,运行 python 知识库/examples/mechanisms/completion_reference.py。这些检查验证周期积分与回绕,不包含GPU执行或实际像素足迹。

编译记录:compile_completion.py从正文片段补最小入口,以DXC编译StripePS通过。编译检查不包含完整引擎或GPU输出。

相关主题

参考资料

  • Matt Pharr, Wenzel Jakob, Greg Humphreys, Physically Based Rendering, Sampling and Reconstruction chapters.
  • PBRT第四版8.1节 Sampling Theory:采样、重建和频域混叠;2026-10-22核读。