采样与混叠
全库目录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)对 个样本直接计算通常需要 。快速傅里叶变换(FFT)利用对称和递归结构把常见情况降到 。
实时图形中的常见用途:
- 频域卷积;
- 海面波浪频谱;
- Bloom 或大核滤波的特定实现;
- 音频和频谱可视化;
- 分析采样和重建问题。
FFT 不是“所有模糊都更快”。小核滤波、分辨率、数据搬运和变换开销都会影响选择。
时域噪声和抖动
在低采样数算法中,可以让每帧使用不同随机样本,再通过多帧累积收敛。这会把固定的结构化误差变成随时间变化的噪声。
理想的抖动需要:
- 单帧分布足够均匀;
- 多帧序列覆盖更多位置;
- 与重投影和历史拒绝配合;
- 避免肉眼明显的周期。
蓝噪声强调把能量推到高频,人眼更不容易注意,后续滤波也更容易处理。但蓝噪声不是自动正确,缩放、平铺和时序循环仍可能暴露模式。
程序条纹的足迹积分
下面的 HLSL 输入是连续 UV,输出是经过像素覆盖估计的周期条纹。fwidth 近似当前 2x2 像素组内相位的变化范围:
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核读。