← ALL ARTICLES

时域历史校验

全库目录221
本文目录17

上一帧颜色只有在历史表面、着色与覆盖仍相容时才适合复用。本文沿几何拒绝、颜色校验、裁剪和混合推进,再分析头发等高频内容的模糊、鬼影与闪烁。本文记alpha为当前样本权重,运动向量v=uv_current−uv_previous,历史坐标为uv_current−v;完整采样与坐标约定见 时域采样与重投影。

历史校验

重投影得到的历史不能无条件使用:它可能因遮挡变化而无效,也可能因光照或着色变化而陈旧。校验手段分两类。

拒绝

历史越界、非有限或缺少有效对应时,直接输出当前重建样本并重置累积状态,拒绝分支跳过无效采样与混合;仅把 α\alpha 置1仍可能让0*NaN污染结果。历史有限且对应仍可信、只是着色陈旧时,可提高 α\alpha 做软刷新。

判据来自两类数据:

几何数据(深度、法线、对象标识、运动向量)适合识别遮挡变化。将当前表面重投影到上一帧后,比较其预测的上一帧深度与历史深度纹理,差异超过容差则拒绝。两者要处于同一坐标与深度约定,不能直接比较当前帧和上一帧的原始设备深度。

几何判据只能反映一部分着色输入:表面深度与法线不变时,光照、阴影和反射仍可能变化。对象标识不能做算术平均,深度跨表面插值也会生成不存在的中间表面;法线等连续量则需要与其含义匹配的过滤和归一化。判据在边缘的不连续还可能重新引入锯齿,因此通常需要结合颜色校验。

颜色数据更直接地反映历史是否仍然一致,既能发现着色变化,也能发现重采样误差与错误运动向量。但当前帧样本本身带锯齿(否则也不需要抗锯齿),直接比较会得到有偏且不稳定的误差估计,通常需要先做空间滤波。

矫正

拒绝历史等于重置该像素的积分过程,会加剧时域伪影。矫正的思路是把历史拉回到与当前帧一致的范围内,而非直接丢弃。

核心假设是:当前帧邻域的样本涵盖了该像素应有的颜色范围。取 3×3 或更大邻域的颜色,它们在颜色空间中的凸包代表合理范围。历史落在凸包内则可信;落在外面,则把“历史到当前样本”的连线与凸包求交,交点就是最接近历史且仍然合理的估计。

逐像素求凸包太昂贵,实践中用轴对齐包围盒近似,并有两种处理方式:

Clamp 直接把历史各分量钳制到包围盒内。结果可能落在盒面、边或角上;各轴独立移动,通常不保持原来的颜色变化方向。

Clip 沿盒心到历史的方向缩短向量,使结果落在盒边。它保留相对于盒心的方向;对最终画质的影响还取决于邻域是否代表真实颜色:

hlsl
float3 center = (AABBMin + AABBMax) * 0.5;
float3 extent = (AABBMax - AABBMin) * 0.5;
float3 delta = History - center;
float3 ratio = abs(delta) / max(extent, 1e-6);
float scale = max(1.0, max(ratio.x, max(ratio.y, ratio.z)));
float3 Result = clamp(center + delta / scale, AABBMin, AABBMax);

每轴偏离量除以该轴半宽得到超出比例。最大比例小于等于1时历史在盒内;大于1时统一缩短三个分量。零宽轴用数值下界防止除零,最终clamp保证落在原盒内,因此退化盒可能轻微改变方向。输入颜色和包围盒均须有限,每轴Min不大于Max;非有限历史先走拒绝分支。

颜色空间与离群值

包围盒可以在 YCoCg 空间中计算。它把色度与亮度解耦,而局部对比通常由亮度主导,这种轴向往往更贴近局部颜色分布,包围盒的约束效果需要按内容比较;它并不保证所有颜色分布都比RGB盒更紧。

极暗或极亮的离群样本会撑大包围盒,让本应被矫正的历史通过检测。方差裁剪用邻域的均值与标准差确定范围,而非最值:

Cmin=μ−γσ,Cmax=μ+γσC_{min}=\mu-\gamma\sigma,\qquad C_{max}=\mu+\gamma\sigma

γ\gamma 通常取 0.75 到 1.25。均值和方差仍受离群值影响,这是一种可调的范围估计。可再与邻域最值盒相交,避免统计盒扩张过大。

混合系数自适应

静态场景可以用较小的固定系数。按运动幅度提高系数是一种加快刷新的启发式,并不意味着匀速平移的历史必然失效。下列HLSL片段假定motion是每帧UV位移,0.05与100为需要按分辨率和内容调整的参数:

hlsl
float blendFactor = saturate(0.05 + length(motion) * 100.0);
return lerp(historyColor, currentColor, blendFactor);

另一个有用的启发式是:历史接近被裁剪时适度降低 α\alpha,让裁剪发生后的变化更平缓,减少突兀跳变。

一个像素的历史决策

本例前后帧抖动均为零。设当前UV=(0.6,0.5)、运动向量按本文约定为(0.1,0),历史读取位置为(0.5,0.5)。预测上一帧表面正线性深度为5米,历史记录为2米,容差0.1米时应拒绝:当前表面之前被前景遮住,历史颜色来自另一个表面。此时令alpha=1,输出当前样本,累积计数重置。

若历史深度也为5米、几何验证通过,当前邻域亮度范围[0.2,0.8],历史为1.2,标量裁剪后为0.8。当前样本0.4、alpha=0.1时,结果为0.1*0.4+0.9*0.8=0.76。如果邻域欠采样而完全漏掉真实亮线,范围可能缩到[0.2,0.4],同样裁剪会删除正确历史。一次深度验证和一次颜色限制各自回答不同问题;提高刷新率可以缩短残影,也会减少历史降噪收益。

伪影的成因

欠采样让历史判据缺少充分信息,错误的运动向量和过期着色又会引入不匹配历史。判断的两类错误导向两组相反的伪影。

判断错误后果
误拒绝有效历史模糊、闪烁
误接纳无效历史鬼影、时域滞后

因此抑制鬼影与抑制闪烁是一对矛盾目标,任何校验算法都在这两者间取舍。理解这一点,就不会期待某个参数能同时解决两者。

模糊

两个来源。其一是时域采样与重投影中的误差累积。其二是历史矫正本身:

矫正假设当前帧邻域涵盖了该像素的颜色范围,但内容高度精细时这个假设会失效。一条亚像素宽的细线可能在某些帧的采样中完全缺失,此时包围盒不包含线的颜色,历史中累积的细节被裁掉。表现为茂密树枝、细密栏杆在收敛后反而丢失。

限制历史有助于抑制鬼影,也可能删除真实细节。后续锐化可提高剩余细节的局部对比,却不能恢复已经丢失的样本。锐化还可能产生过冲,需要限幅并检查色域和振铃。

鬼影

常见于运动物体造成的遮挡揭露区域:失效历史未被完全清除,表现为运动物体拖出一个副本。

一种常见成因是矫正在高对比边界处失效:当前帧样本包含密集的高对比边缘时,颜色包围盒被撑得很大,不再能代表该像素真实的颜色范围,失效历史因此顺利通过检测。角色跑过草地时在草上拖出残影是典型案例。

错误的运动向量同样致病,常见于透明、粒子与反射。

对策是给容易出问题的材质打上响应标记,写入模板,TAA 阶段据此提高该区域的 α\alpha 加快刷新。平滑边缘处可按覆盖约定膨胀模板,因为部分覆盖的边缘像素可能没有得到该材质标记。

闪烁

TAA 本应减少闪烁,但历史矫正可能反而制造它。

当输入存在低频摩尔纹时,某些像素的邻域色域每帧完全改变。历史每帧都被裁剪或钳制到当前样本值,累积过程实际上被停用——TAA 退化成了逐帧直通。关闭或放宽矫正可能减轻由反复裁剪产生的闪烁,但也可能暴露鬼影与滞后。

欠采样

累积样本数低的区域仍有可见锯齿,典型位置是相机切换后的前几帧、遮挡刚揭露的区域、着色剧变的区域。表现是过锐且带锯齿,与收敛后的画面观感不一致。

缓解办法是提高这些区域的空间复用:对新样本施加低通滤波,或叠加一层空间抗锯齿方法处理当前帧的原始样本。

高频细节的稳定性

TAA 变清晰的前提是:同一个表面点在连续多帧中被不同的亚像素位置采样,这些样本可以合并成一次超采样。前提成立时,静止画面会随帧数累积越来越清晰。

头发、细密织物、远处栅栏这类内容会打破这个前提,原因有三层,各自需要不同的应对。

一、亚像素几何的样本不指向同一表面。一根发丝宽度可能小于一个像素。抖动后的采样位置可能命中发丝、也可能命中背后的皮肤或背景。像素覆盖积分本来就可能包含前景与背景,平均不同表面的当前覆盖样本可以是正确的抗锯齿。TAA 的困难是历史重投影可能把不对应同一时刻覆盖的样本当成有效历史,再与当前结果混合。细发丝缺少稳定深度和运动信息时尤其明显。

二、高光随视角剧烈变化。头发的各向异性高光对视角与切线方向极其敏感,相机或角色轻微移动,同一位置的高光强度就大幅跳变。历史颜色与当前颜色差异巨大,邻域颜色钳制会频繁改变历史——要么保留历史导致拖影,要么拒绝历史导致闪烁。

三、Motion Vector 不可靠。发片薄、遮挡关系复杂,且常有 Alpha Test。被 Clip 掉的片元不写运动向量,导致该像素的历史查找位置错误。

理解这三层才能选对手段:第一层是采样问题,第二层是信号问题,第三层是数据问题。

应对方向

保证数据正确。先确认头发正确输出了运动向量,包括骨骼动画与物理模拟导致的位移。先用静止相机和运动角色对照向量,再观察历史查找是否跟随对应表面。

降低信号本身的高频程度。在着色阶段就让高光不那么跳:限制高光强度上限、对高光做适度的时域平滑、或在切线扰动上减少高频噪声。源头信号稳定了,时域累积自然稳定。

分区域调整 TAA 参数。用材质分类标记区分头发区域,对该区域采用更激进的历史拒绝(减少拖影,接受一些闪烁)或更保守的混合权重,而不是全屏统一参数。分类信息可来自GBuffer、模板或独立响应遮罩,按当前渲染路径选取。

几何层面减少亚像素细节。距离较远时采用保留覆盖的LOD或合并发束,减少当前分辨率难以解析的几何。预过滤或预积分高光降低的是着色信号频率;它与几何LOD分别处理覆盖和高光变化。

用锐化补偿。TAA 之后施加一道轻度锐化,提高剩余细节的局部对比。它不解决成因,只补偿观感,且过度锐化会放大闪烁与边缘振铃。

分辨率与着色率

提高输入分辨率可增加亚像素几何覆盖的观测,但仍需正确运动向量及历史校验。降低着色率会减少着色样本,适合信号平缓的区域;高频头发区域是否可用,应按覆盖、运动和高光分别评估。参数选择从缺失的是几何样本、着色信息还是可靠历史对应关系开始。

验证方法

显示历史权重、拒绝遮罩及遮挡揭露,分别测试移动遮挡、高亮粒子、头发和细线。关闭颜色矫正只能帮助区分误裁剪与无效历史,仍须对照运动向量和几何拒绝。颜色盒的盒内、盒外和退化输入见 raster_models.py与 test_raster.py,运行 python -B 知识库/examples/revision/test_raster.py。HLSL是机制片段,未构成完整TAA工程;CPU盒裁剪通过不能证明跨帧画质和GPU性能。

2026-10-24,正文片段验证器从当前文章抽取颜色盒裁剪与运动权重混合片段,补齐显式常量、入口与采样辅助函数后通过DXC离线编译。验证器合计覆盖五个入口;深度宿主采用普通Z与点采样钳制约定,完整管线、GPU执行和画质仍需目标工程验证。

相关主题

参考资料

颜色盒输入、裁剪及0.76数例见本页所链CPU实验;MSAA光栅化规则由抗锯齿与时域重建集中保存。