7.2 降噪:从方差到画面的排错实录


7.2 降噪:从方差到画面的排错实录

上一节的账本里,每像素只剩一条射线——它带回来的画面等效于一台每像素只采样一次的路径追踪器,噪声浓度远超"能看"的边界。降噪器就是来还这笔债的。本节按三步走:先讲清噪声的结构(不是均匀颗粒,而是有空间结构的方差场),再拆主流降噪器的三个核心部件,最后用一份排错实录把鬼影、糊边、闪烁三大症状逐一修好。看完你会认同这句话:降噪器不是美颜滤镜,它是实时管线里离线蒙特卡洛数学的代理人。

噪声不是颗粒,是结构

把 7.1 的单样本画面放大看,噪声的分布极不均匀:平面墙面几乎干净,光源边界、高光区域、间接光转折处噪点沸腾——因为蒙特卡洛的方差正比于被积函数的局部变化率,被积函数在哪里尖锐,噪声就在哪里聚集。这个观察直接否定了"拿一个高斯模糊糊全屏"的做法:墙面被白糊了,边缘还是脏的。好的降噪必须是导引的:滤波强度由几何与材质信息决定——深度差大(边缘)就别跨过去平均,法线差大(转折)就别混着算,反照率差大(不同物体)就当两个世界。导引信息哪里来?光栅化 G-buffer 里现成放着全分辨率深度、法线、物体 ID——光追虽然只跑了四分之一分辨率,导引却是全分辨率的,这正是混合管线的精妙分工。

降噪器三件套:累计、估计、滤波

主流实时降噪器(以 SVGF 一脉为代表)可以拆成三个部件,顺序执行、逐级接力。

1. 时序累计:历史颜色按运动矢量重投影,与当前帧加权平均 权重由历史长度与有效性决定——有效历史越长,有效样本越多 2. 方差估计:对颜色和平方同步做时序累计,在线算出每个像素的方差 方差大的区域滤波要重,方差小的区域滤波要轻——滤波强度有了依据 3. 导引双边滤波:小孔径迭代多轮 每轮的滤波核权重由 深度差 × 法线夹角 × 反照率差 调制 几何不连续处权重趋零,噪声跨不过边缘

三件套的精妙在"方差导引"这个闭环:6.1 说过噪声该滤多少取决于它的方差,而方差本身也是随机量需要估计——时序累计恰好把方差的历史也攒了下来。于是滤波强度不再是全局常数,而是逐像素自适应:阴影边缘重拳出击,平滑墙面轻轻带过。机器学习降噪器(离线界的 OIDN、实时界的各种神经降噪模块)并没有推翻这套结构,而是把"导引权重怎么定"和"方差到滤波半径的映射"交给网络从数据里学——输入仍是彩色加 G-buffer,学习的仍是同样的物理量。

图:降噪流水线与导引信息的来源

图:降噪流水线与导引信息的来源

排错实录:三种症状的定位链

下面是实战里最常见的三种降噪事故,各给完整诊断过程。症状一:鬼影——角色身后拖着半透明的残像。背景:相机不动、角色匀速走动,角色背后的墙面反射里跟着一个虚影。操作:逐层排查——先关时序累计,虚影消失,锁定时序环节;再查运动矢量,发现透明物体的运动矢量没写入(半透明不做光栅化写入),重投影拿到的是墙面的历史而非角色的历史。结果:给透明物体补写运动矢量代理,虚影消失。解读:鬼影的公式化表达是"历史值被错误地信任",九成源自运动矢量或有效性验证的失守,而不是滤波本身。变式:粒子系统没有稳定的前帧对应,常规做法是把它标记为"无历史"对象,只走空域滤波,接受它略噪。

症状二:糊边——反射里的物体轮廓晕开一圈,像隔着毛玻璃。诊断链:糊边说明滤波跨过了几何边界,查导引权重——深度差被编码为相对量,远处的反射(深度绝对值大)相对深度差被低估,权重该归零没归零。修法:深度差改用法线投影平面距离(即"两点在几何上隔了多远")代替简单差值,远距离小夹角的场景立刻锐利。症状三:闪烁——阴影边缘在相邻帧间高频跳动。诊断:闪烁是时序权重的跳变——暴露区域的历史突然失效,边缘像素在"有历史"与"无历史"两种画质间反复横跳。修法:对时序权重做时间平滑、暴露切换处加过渡带;再不够就把当前帧在暴露区域的样本临时加倍(把 7.1 省下的预算花回来)。三种症状指向同一句话:降噪的 bug 都在"信任的边界"上——该信的不信(闪烁),不该信的信(鬼影),信的方式不对(糊边)。

学习型降噪器与一张调参速查表

排错之外,还有两个横向话题决定降噪方案的长期成败:学习型路线怎么取舍,参数经验怎么沉淀。先说路线。学习型降噪器用数十万对"噪声图加干净参考图"训练网络,让它自己学出导引权重。优点是单帧强——历史不足一帧也能出干净图,透明与粒子这类历史残缺场景收益最大。代价与边界同样清楚:训练分布之外的极端材质可能整块出错且错得自信;推理耗时高于传统三件套,4K 下往往要配半分辨率渲染,换硬件世代后预算表要重测;出错不可解释,排错从"查参数"变成"查数据"。选择判据一句话:历史可靠用传统三件套,历史残缺用学习型,预算与平台够就按层混用——主画面走三件套,粒子透明层走学习型,各自开关。

调参侧给一张速查表,症状到参数的映射先记住再理解:

症状 首查旋钮 方向
静止画面仍有颗粒 时序权重 提高,或延长历史
运动画面拖尾 时序权重上限 降低,收紧有效性验证
高光区域糊成一片 粗糙度导引 高光通道单独降强度
深色区域噪点扎眼 亮度自适应 暗部提强度、按感知亮度加权
法线边缘出彩边 法线导引权重 提高法线项、查法线解压格式

表的最后一行藏着一个容易忽略的工程点:法线缓冲的格式(八位八面体编码还是浮点全量)决定导引的精度上限,降噪疑难杂症里有一成最后查出来是导引缓冲被压缩坏了。降噪不是滤波器的独角戏,是整条管线的数据质量在滤波器上的投影。

这张表的生命周期比算法长:降噪器换了三代,表骨架没变过。把它挂在团队维基,每次新症状先查表再动参数;顺带立好复跑纪律——任何降噪参数改动,都要过三个标准镜头(静止特写、高速平移、粒子密集)再入库,三个全过才算调过。

把两条路线放到同一条时间轴上,还有一层演化逻辑值得记:三件套的每一步(累计、方差估计、导引滤波)都是可解释的独立环节,学习型把它们融进一个不可分的映射——换来单帧质量,付出可诊断性。工业界的处理不是二选一,而是分层布防:传统环节在前端把输入分布压回训练集覆盖的范围(钳制萤火虫、规整法线缓冲),学习型在末端兜底输出。给网络喂"它见过的世界",是学习类管线集成的通用守则,降噪只是它在图形学里的分身。方法论再升华一句:三种症状加速查表五行,合起来是一张二维矩阵——症状为行、环节(历史、导引、切换、缓冲)为列;新症状先定位列再定位行,排查顺序自动生成。方法论的复用性比任何单个修法值钱:下一章的方案货架、再下一章的硬件适配,用的都是同一张矩阵思维的骨架。把这张矩阵贴在工位上,新人也能在三分钟内提出有意义的第一个假设——排障知识的传承效率,比任何长文档都直观;矩阵还会生长,每添一行症状、每添一列环节,它的覆盖面就宽一分。

本节要点回顾

  • 噪声有结构:方差聚集在被积函数尖锐处,全局模糊注定两头失败——导引是唯一的路。
  • G-buffer 是降噪的路标:光追稀疏、导引全分辨率,混合管线的分工红利在降噪环节兑现。
  • 三件套接力:时序累计攒样本、在线方差定强度、导引双边保边缘;学习型降噪器换的只是权重映射。
  • 排错口诀:鬼影查历史信任,糊边查导引权重,闪烁查暴露切换——事故都出在信任的边界。
  • 降噪器消耗的预算(约一毫秒半)是实时光追账单里最便宜的救命钱。

画面终于"能看"了。最后一战是实时光追的圣杯——全局光照:下一节盘点哪些方案能挤进实时预算。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U