空间滤波

时域累积能复用历史,但新显露区域和首次进入场景仍需依赖当前样本。空间滤波 Spatial Filtering 将附近像素按权重组合,降低少量样本的随机波动。

记输入颜色为 C(q)C(q),输出中心为 pp,邻域为 N(p)\mathcal N(p),基本形式是

C^(p)=∑q∈N(p)w(p,q)C(q)∑q∈N(p)w(p,q).\widehat C(p)=\frac{\sum_{q\in\mathcal N(p)}w(p,q)C(q)} {\sum_{q\in\mathcal N(p)}w(p,q)}.

高斯滤波 Gaussian Filtering 让越近的样本权重越大:

ws(p,q)=exp⁡ ⁣[−∥p−q∥22σs2].w_s(p,q)=\exp\!\left[-\frac{\|p-q\|^2}{2\sigma_s^2}\right].

这里位置差以像素为单位,σs\sigma_s 控制范围。高斯核的共同常数因子会在归一化中抵消,因此不用单独写其密度前因子;σs\sigma_s 不能省略或与世界距离混用。

1
2
3
4
5
6
7
8
9
10
11
12
13
// 输入和输出用不同缓冲,逐颜色通道做同一加权平均。
for each output pixel p:
sumColor = 0
sumWeights = 0
for each valid pixel q in neighborhood(p):
offset = q - p
weight = exp(-dot(offset, offset) / (2 * sigmaSpatialSquared))
sumColor += weight * input[q]
sumWeights += weight
if sumWeights > 0:
output[p] = sumColor / sumWeights
else:
output[p] = input[p]

除以权重和,使常量输入仍输出同一常量,也让截断窗口、屏幕边界下的结果保持合适尺度。GPU 中原位读写同一图像可能产生数据竞争,多轮处理需要独立缓冲或 Ping-Pong。

普通高斯平滑降低细节也模糊人物与相机边缘

右图背景小变化变少,人物轮廓、相机和三脚架也变模糊。空间距离只说明像素在图上接近,不能说明它们属于同一表面或具有相同真实颜色。

双边保边

双边滤波 Bilateral Filtering 同时考虑空间距离与颜色差。跨过真实边界时,即使位置近,也降低混合权重:

w(p,q)=exp⁡ ⁣[−∥p−q∥22σs2]exp⁡ ⁣[−∥C(p)−C(q)∥22σc2].w(p,q)=\exp\!\left[-\frac{\|p-q\|^2}{2\sigma_s^2}\right] \exp\!\left[-\frac{\|C(p)-C(q)\|^2}{2\sigma_c^2}\right].

第一项称 Spatial Weight,第二项称 Range Weight;输出仍按总权重归一化。σc\sigma_c 很小时,仅颜色非常相近的像素互相贡献;很大时,Range Weight 接近一,行为回到普通空间平滑。

双边滤波前后山地、积雪与水面边缘的变化

右侧天空与水面的细小变化减少,山脊和积雪边界仍较清楚,因为跨这些边界的颜色差较大。山体内部细纹也被削弱,保边不意味着所有纹理细节都能保留。

在低 SPP 图像中,真实颜色相同的两个像素可能因为随机样本而差别很大。若用带噪颜色决定相似度,会把噪点当成边缘,阻止本应进行的平滑。还需要更可靠的参考信号。

几何向导

联合双边滤波 Joint Bilateral Filtering / Cross Bilateral Filtering 用另一份数据决定混合权重,平均的仍是待重建辐射。向导 Guide 可以是深度、法线、位置、材质或物体 ID,也可以是较稳定的颜色。

例如

w(p,q)=ws(p,q)wz(p,q)wn(p,q)wc(p,q).w(p,q)=w_s(p,q)w_z(p,q)w_n(p,q)w_c(p,q).

深度差、法线差和颜色差分别有对应尺度参数;不要求每项都采用高斯。ID 可以用“相同为一、不同为零”的离散项,法线也可以用点积幂次。归一化只处理权重总量,不会抵消不同单位或错误的尺度。

Cornell Box中分别由深度、法线和颜色限制混合的点对

AA 在后墙、BB 在前方盒面,朝向相近但深度不同,Depth Guide 可防止两者混合。BB、CC 位于不同朝向的盒面,Normal Guide 能保护折角。DD、EE 的颜色和亮暗差异也可以由 Color Guide 加以限制;这里还存在几何区别,不能据图认为只有颜色才会区分它们。

同一平面上的阴影或反射边界,深度和法线可能都相同,需要照明或颜色向导。反过来,强噪声颜色不可靠时,干净的几何向导可以先划定相同表面内的候选样本。各项共同决定取舍,并不存在对所有场景都合适的一份固定参数。

常规光栅化 G-buffer 不带间接路径的随机颜色噪声,但仍可能有几何走样、纹理法线变化或其他随机主可见性效果。不能把它无条件称为无噪真值。

可分离核

一个 N×NN\times N 邻域直接访问约需 N2N^2 个样本。小窗口还可接受,大窗口的读写与计算成本会很高。FFT 可以加速某些固定卷积,但来回转换和中间数据也有成本,保边滤波还不是普通平移不变卷积。

可分离核 Separable Kernel 满足 K(x,y)=Kx(x)Ky(y)K(x,y)=K_x(x)K_y(y)。二维高斯指数可拆成两个一维指数,因此可以先水平过滤,再竖直过滤:

(C∗K)(x,y)=∫∫C(x−u,y−v)Kx(u)Ky(v) du dv=∫[∫C(x−u,y−v)Kx(u) du]Ky(v) dv.\begin{aligned} (C*K)(x,y) &=\int\int C(x-u,y-v)K_x(u)K_y(v)\,\mathrm du\,\mathrm dv\\ &=\int\left[\int C(x-u,y-v)K_x(u)\,\mathrm du\right]K_y(v)\,\mathrm dv. \end{aligned}

每像素访问量由 N2N^2 变为约 2N2N,代价是多一个 Pass 和中间缓冲。精确等价还需要边界扩展、截断窗口与归一化约定一致。

普通双边权重依赖中心与邻点的数据,相邻像素各有不同核。做完水平 Pass 后再以新数据计算竖直权重,一般不等于原二维双边;即使固定 Guide,也不能普遍将 Range Weight 分离。小窗口中两者可能视觉接近,可以作为工程近似,但不能沿用高斯的严格等价结论。

间隔采样

另一种扩大范围的方式是多轮小核。À-trous Wavelet Filtering 每轮保留相同数量的抽头 Tap,但让抽头间隔依次为 1,2,4,8,…1,2,4,8,\ldots。Tap 是一次读取并加权的样本位置,“有孔”的核在这些位置之间插入零权重。

à-trous各层非零抽头之间的间隔逐步扩大

图用一维表示层级:黑点对应非零位置,灰点是这一层跳过的位置;箭头指向计算所用的抽头。每一层仍给每个输出像素生成结果,灰点不表示那些像素从图像中消失,也没有建立下采样 mip 图。

二维可用 5×55\times5 核。第 ii 轮采 q=p+2i(a,b)q=p+2^i(a,b),a,b∈{−2,−1,0,1,2}a,b\in\{-2,-1,0,1,2\};原输入先经过前一轮,再参与更大间隔的一轮。五轮约为 25×5=12525\times5=125 次读取,而直接 64×6464\times64 窗口有 40964096 次读取。最后一轮间隔为 1616,单轮足迹覆盖 65×6565\times65;考虑前轮依赖后总支持域更大,不能将结果等同于一个均匀 65×6565\times65 平均核。

为什么稀疏读取还能过滤较大范围?第一轮先降低高频,后一轮再扩大尺度,处理更低频的变化。

先抑制高频再扩大间隔的频谱直觉

左图蓝色区域先由第一轮减弱,橙色区域再由更宽的第二轮处理;右图用频谱重复说明稀疏采样需要控制剩余高频,否则不同频段会相互干扰。“No aliasing”依赖理想化的频带条件,不是任何保边滤波都保证无伪影。

更具体地,固定一维核 h[k]h[k] 放大间隔为 ss 后,其频率响应为

Hs(ω)=∑kh[k]e−iωsk=H1(sω).H_s(\omega)=\sum_kh[k]e^{-\mathrm i\omega sk}=H_1(s\omega).

它出现重复的通带,前轮低通使这些重复通带内的高频输入减小。由于输出未降采样,这不等于输出抽取引起的经典频谱折叠;课程图表达的是扩大采样间隔前需要抑制高频的直觉。保边权重随位置变化时,也不再有一份全图统一的卷积频响,残余高频和边界仍可能形成网格伪影,可用额外小核缓和,但会增加平滑。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 每轮使用上一轮输出,不在同一纹理原位更新。
input = currentSignal
for level in 0 .. levels - 1:
spacing = 2 ^ level
for each pixel p:
sumValue = 0
sumWeights = 0
for offset in kernel5x5:
q = p + spacing * offset
if outsideImage(q):
continue
weight = kernelWeight[offset] * edgeWeight(p, q)
sumValue += weight * input[q]
sumWeights += weight
output[p] = sumValue / max(sumWeights, epsilon)
swap(input, output)

这种小样本加时空滤波的组织也可用于 PCSS、SSR 等带噪估计,输入含义和用于保边的 Guide 要对应具体信号,不能对所有中间量使用同一组阈值。

异常限幅

Outlier 是偏离局部样本分布的值。Monte Carlo 的少数高贡献路径可能形成极亮点,常称 Fireflies;它们进入大窗口后,会扩散为较大的亮斑。

少数极亮路径在图像中形成散布的亮点

墙面与地面上的小亮点,与较平滑的照明背景差别很大。若先将这些点与邻域平均,它们会影响更多像素。实时管线因而常在空间滤波前限制极端样本。

用当前 5×55\times5 或 7×77\times7 邻域亮度 ℓ(q)\ell(q) 估计

μ=1N∑qℓ(q),v=1N∑q[ℓ(q)−μ]2,σ=max⁡(v,0).\mu=\frac1N\sum_q\ell(q), \qquad v=\frac1N\sum_q[\ell(q)-\mu]^2, \qquad \sigma=\sqrt{\max(v,0)}.

将中心值夹到 [μ−kσ,μ+kσ][\mu-k\sigma,\mu+k\sigma],课堂举 k≈1k\approx1–33。σ\sigma 是标准差,不能把存储的方差 vv 直接代入这个范围。Clamping 保留截断范围内的值,超出部分只收回到边界,不是将亮点清零。

局部方差同时包含真实边缘和噪声,亮点自身也会影响统计。中位数或其他稳健统计可以减少部分问题,RGB 逐通道、亮度域或颜色空间中的范围限制也会产生不同颜色结果。

正确的稀有路径贡献可能很大,限幅会丢掉它的部分能量,也可能损失真实小高光。它是低样本预算下的有偏折衷,不能称为无损去噪或增加样本的等价替代;输入仍应保留 HDR,不能预先统一截到 [0,1][0,1]。

历史限幅

同样的统计思想可以作用于重投影历史:用当前帧空间重建结果的邻域估计范围,再将历史值 HH 收回该范围,之后按时间权重混合。

H′=clamp⁡(H,μcurrent−kσcurrent,μcurrent+kσcurrent),Ct=αC‾t+(1−α)H′.H'=\operatorname{clamp}(H,\mu_{\rm current}-k\sigma_{\rm current}, \mu_{\rm current}+k\sigma_{\rm current}), \quad C_t=\alpha\overline C_t+(1-\alpha)H'.

当前异常限幅针对这一帧的极亮样本,历史限幅针对过时或不匹配的历史;它们可以同时存在,但输入对象不同。后者必须将历史向当前靠近,若反过来限制当前去适应历史,会延续旧颜色与拖影。

过紧范围会舍弃有效历史并重新引入噪声,过宽则放过旧阴影或反射。几何对应验证、限幅和时间权重是不同环节,限幅不能替代历史有效性检查。

方差指导

时空方差指导滤波 Spatiotemporal Variance-Guided Filtering,SVGF 结合时域累积、方差估计和保边 à-trous。要解决的问题是:颜色差异到底来自真实边界,还是来自采样不足?

若一个点的照明样本很不稳定,就应允许较大的亮度差参与混合;若样本已较稳定,则对差异更谨慎,保留细节。方差提供这份不确定性的近似,但它不是边缘真值:有真实信号变化的区域也可能方差很大。

课程以 7×77\times7 空间估计、沿 MV 进行历史累积、再做 3×33\times3 平滑来解释如何稳定方差。完整 SVGF 更明确地先累积颜色和亮度矩,再计算时域方差;历史太短时回退到带几何权重的 7×77\times7 空间估计。这样沿用了课堂“先获得可信噪声尺度,再指导颜色过滤”的逻辑。

为减少纹理被误平滑,原方案还将可见表面的反照率因子从照明中拆出,重建后乘回;直接与间接照明可以分开过滤。低反照率处需避免除零,多层或镜面信号的拆分也须符合材质定义,不能将所有 RGB 都随意除以漫反射颜色。

矩与历史

令亮度样本为 ℓt\ell_t,存储一阶、二阶原始矩 m1,m2m_1,m_2。通过同一重投影与几何验证,累积

m1,t=βℓt+(1−β)m1,t−1reproj,m2,t=βℓt2+(1−β)m2,t−1reproj.m_{1,t}=\beta\ell_t+(1-\beta)m_{1,t-1}^{\rm reproj}, \qquad m_{2,t}=\beta\ell_t^2+(1-\beta)m_{2,t-1}^{\rm reproj}.

方差估计为 vt=max⁡(0,m2,t−m1,t2)v_t=\max(0,m_{2,t}-m_{1,t}^2)。亮度平方的平均与平均亮度的平方不同;只有一份瞬时样本时,两者相等,无法从单像素自身估出噪声,所以需要历史或空间邻域。

原方案在遮挡解除后历史不足四帧时,使用空间估计作为过渡。矩历史与颜色历史同样要验证,错误地将前景矩带到背景,会让滤波幅度也出错。EMA 下这是一种有限历史的代理估计,不自动成为随样本无限收敛的无偏方差估计。

较小的 3×33\times3 高斯平滑将方差图稳定下来,避免某个点恰好没采到亮路径便被判为“完全无噪声”。随后使用其平方根作为标准差控制亮度权重,而非直接用方差充当亮度尺度。

指导权重

SVGF 的深度权重按局部倾斜程度调整容差:

wz(p,q)=exp⁡ ⁣[−∣z(p)−z(q)∣σz∣∇z(p)⋅(p−q)∣+ϵ].w_z(p,q)=\exp\!\left[-\frac{|z(p)-z(q)|} {\sigma_z|\nabla z(p)\cdot(p-q)|+\epsilon}\right].

同一斜平面的两个点可能有较大深度差,如果始终用固定的小阈值,会将它们误分开。∇z\nabla z 估计深度沿屏幕两个轴的变化,点积给出该间隔上的预期变化尺度,分母随之增大。

相邻区域的深度差需要结合局部表面倾斜判断

图中 A,BA,B 标在同一盒体的相邻区域。深度差不必代表对象断层;在同一倾斜平面的理想局部线性模型下,有 ∣z(p)−z(q)∣≈∣∇z(p)⋅(p−q)∣|z(p)-z(q)|\approx|\nabla z(p)\cdot(p-q)|,权重约为 e−1/σze^{-1/\sigma_z},不会仅因为点距增加而快速衰减。图上若还跨过折角,需要法线项继续限制混合。

这里分子仍是原始深度差,分母是预测变化尺度;它不是将预测深度从分子减掉的“平面残差”公式。原论文采用投影深度(文中称 Clip-Space Depth)及其屏幕梯度。深度与梯度必须使用相同坐标域和单位,屏幕距离也要一致;若改用线性视图深度,就应重算对应梯度与容差。局部线性假设在真正深度断层附近不成立,需要与其他 Guide 配合;ϵ\epsilon 防止平面近乎正对相机时除零。

法线权重为

wn(p,q)=max⁡(0,n(p)⋅n(q))σn.w_n(p,q)=\max(0,\mathbf n(p)\cdot\mathbf n(q))^{\sigma_n}.

单位法线相同时权重为一,差异增大则下降;σn\sigma_n 是幂指数,越大越严格。可以使用宏观几何法线,避免 Normal Map 把一个连续平面划成许多小区域。忽略纹理法线不代表忽略其着色差异,后者还由亮度项处理。

亮度权重为

wℓ(p,q)=exp⁡ ⁣[−∣ℓi(p)−ℓi(q)∣σℓg3×3(vi)(p)+ϵ].w_\ell(p,q)=\exp\!\left[-\frac{|\ell_i(p)-\ell_i(q)|} {\sigma_\ell\sqrt{g_{3\times3}(v_i)(p)}+\epsilon}\right].

g3×3g_{3\times3} 仅平滑供 Guide 使用的方差,ii 为当前空间滤波层级。方差大时放宽亮度差,允许噪声不同但真实信号可能相近的点互相贡献;方差小时收紧范围,减少对稳定边界的平滑。

几何折面与同一表面上的亮暗变化需要不同Guide

AA 在地面,B,CB,C 在盒面附近。AA 与盒面涉及几何朝向变化,B,CB,C 附近还存在阴影亮暗变化。颜色项要保护真实照明边界,同时避免将图中的随机噪点全部当成边缘;方差正是对亮度差可信程度的调节。

三项并非只有相同作用的三个阈值:深度与法线先约束几何,亮度按噪声尺度保护着色。最终权重还需乘空间核并归一化。

分级重建

一维基础核可以使用 h=(1,4,6,4,1)/16h=(1,4,6,4,1)/16,二维取两个轴的乘积。第 ii 层的间隔为 2i2^i,定义

Wpq=h[a]h[b]wz(p,q)wn(p,q)wℓ(p,q),apq=Wpq∑qWpq.W_{pq}=h[a]h[b]w_z(p,q)w_n(p,q)w_\ell(p,q), \qquad a_{pq}=\frac{W_{pq}}{\sum_qW_{pq}}.

颜色更新为 Ci+1(p)=∑qapqCi(q)C_{i+1}(p)=\sum_qa_{pq}C_i(q)。若暂将权重视为固定,并假设输入误差互不相关,方差可近似更新为

vi+1(p)=∑qapq2vi(q).v_{i+1}(p)=\sum_qa_{pq}^2v_i(q).

权重需平方,因为随机量乘 aa 后方差乘 a2a^2。输入相关、权重依赖噪声时,这份传播并不精确,但可为下一层提供噪声尺度。方差减小时,下一层的亮度权重也会更严格,限制稳定结构继续被模糊。

供亮度权重使用的 3×33\times3 平滑方差,与传到下一层的方差是不同用途,不应在传播公式中无条件再累加一份平滑。原 SVGF 选择第一轮 à-trous 的颜色反馈到历史,最终多轮结果用于显示,以平衡历史稳定和反复空间过滤的偏差。SVGF 原论文

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 概括 SVGF 的顺序;不是将最终大范围模糊每帧反复反馈。
for each pixel:
reproject and validate color / moment history
temporally accumulate current color, luminance, luminanceSquared
estimate variance from integrated moments
if history is too short:
estimate variance from a geometry-guided spatial neighborhood

for each atrous level:
smooth a guide copy of the current variance
compute depth, normal, variance-scaled luminance weights
filter color and propagate variance into separate output buffers
if this is the first level:
retain filtered color as the next temporal color history
swap input and output
remodulate albedo, then apply the required display / antialiasing stages

SVGF在复杂走廊场景中的重建结果

大面积墙面较稳定,门框、柱子和植物边界需要几何 Guide 保留。单张平滑结果不足以证明无细节损失或无时间伪影。

移动光源使SVGF保留过时阴影的失败例

白箭头指出花瓶旁的阴影区域,几何静止时 MV 不追踪移动阴影,旧照明便可能滞留。还可能出现暗区有效样本过少、镜面反射被抹糊、运动重采样增加模糊等问题。随机主可见性或极细几何使 G-buffer 不稳定时,几何向导本身也需要重新评估。

后续 A-SVGF 使用着色变化梯度调节时间权重,变化快时少用历史,稳定时加强累积。它能减轻部分拖影,但仍是有限样本估计,不能恢复所有缺失路径或消除所有遮挡解除问题。

循环重建

Recurrent AutoEncoder,RAE 使用网络从带噪帧序列学习重建。卷积层将局部像素或特征加权组合,再经非线性函数;训练阶段学习组合权重,推理阶段使用已经训练好的参数。

编码器 Encoder 逐级降低空间分辨率,得到覆盖更大范围的特征;解码器 Decoder 逐级恢复原输入分辨率。Skip Connections 将编码阶段的细节送到相应解码层,避免所有局部结构都必须穿过最小的中间表示。这是多尺度重建,不自动表示输出比输入分辨率更高。

RAE的多尺度编码解码、跳跃连接和循环状态

左侧多张输入图是颜色与辅助属性,右侧输出三个 RGB 通道。斜边上的 128,64,…,4128,64,\ldots,4 表示示例中的空间尺度,顶端数字表示特征通道数。横跨两侧的虚线是 Skip Connections,下方回环是循环卷积块;图中 RCNN 在这里指 Recurrent CNN,不是目标检测的 R-CNN。

隐状态 Hidden State 保存上一帧的特征,在下一帧与当前特征共同参与计算,可概括为

ht=Φ(xt,ht−1;Θ).\mathbf h_t=\Phi(\mathbf x_t,\mathbf h_{t-1};\Theta).

Θ\Theta 是固定的已训练参数,随帧更新的是 ht\mathbf h_t。在多个编码尺度保存状态,可以同时结合局部细节和较宽的照明结构,逐步保留或遗忘旧信息。它不等于每帧在线训练模型。

原始 2017 RAE 的核心网络输入是七通道:带噪 HDR RGB、视图法线 XY、深度与粗糙度。渲染器虽然生成 MV,核心循环网络没有显式用 MV 重投影,而是通过隐状态和当前空间特征学习序列关系;原管线另有 TAA 后处理。不能把回环箭头解释成精确几何对应,也不能将原方案与后来显式 Warp 特征的网络混为一谈。RAE 原论文

训练用带噪序列与高样本参考序列建立映射,网络可学习如何使用几何属性。运行时换场景仍需处理状态初始化;训练未覆盖的动态、反射与噪声分布,也可能导致模糊或拖影。

方法边界

RAE在San Miguel序列中的重建结果

可以观察门框与植物细节、强阴影和亮处是否被过度平滑。它与上面的 SVGF 图取自不同帧、不同照明条件,不能直接用两张图的亮度或清晰度给算法排名。

SVGF 的统计与权重可明确分析,RAE 的组合规则从数据学习,调试和解释方式不同;两者都可能 Ghosting 或 Overblur。原 RAE 报告在 720p720p、Pascal Titan X 上约 54.9 ms54.9\,\mathrm{ms} 的推理耗时,SVGF 原实现也有其特定分辨率与硬件测试条件。课程的快慢比较属于当时实现,不代表现代全部神经降噪器与所有统计滤波的普遍关系。

低 SPP 下很多位置只获得极少有效贡献,与高 SPP 图像中残余噪声的单帧降噪任务不同。增大样本、改进采样分布、保留可信历史与控制空间偏差,都影响最终结果。选择或评估方法时,应同时检查细节误差、帧间稳定、动态响应和时间预算,不能只看一张静帧是否平滑。