Skip to main content

Chapter 137: Denoising Networks

本章讨论实时和离线路径追踪中的去噪网络。读完本章后,读者应能追踪一帧低采样 ray tracing 图像从 noisy radiance 到 denoised output 的数据路径,判断噪声来自采样数量、光路类型、时间累积失配还是辅助特征错误,并能把去噪网络放入 post-process graph 或 frame graph 中检查。

贯穿材料是一帧 1 spp path tracing 画面:画面中有粗糙墙面、镜面地板、细栅栏、运动中的相机、小面积高亮灯牌和玻璃反射。渲染器输出 noisyColor,同时输出 albedonormaldepthroughnessmotionVector 和上一帧 historyColor。去噪网络的任务是用这些输入重建更接近高采样参考图的 radiance,同时维持边缘、纹理、反射和运动稳定性。

去噪网络处在渲染管线的敏感位置。它接收的是物理采样结果和 G-buffer guide,输出却会被 tone mapping、upscaling、TAA、bloom 和 UI 合成继续处理。一个错误的去噪输出会把局部噪声放大成拖影、油画感、反射延迟或细节丢失;一个设计良好的去噪输出会把有限 ray budget 转换成稳定画面,并把质量风险限制在可观察的 buffer 与 pass 之内。

本章按五个问题推进:先定位噪声从哪里进入画面,再比较网络结构如何读取空间和时间信息,然后说明训练集与运行时集成,接着把网络接入渲染管线,最后建立效果对比和排查顺序。这里的“网络”泛指 CNN、U-Net、recurrent denoiser、feature-guided denoiser、Ray Reconstruction 类神经模型,以及与它们配套的 temporal accumulation 输入设计。

137.1 图像/光线追踪噪声来源与去噪需求

路径追踪噪声来自 Monte Carlo 积分的有限样本。像素颜色是多个随机光路贡献的估计值,样本数越低,估计值方差越高。1 spp 画面中的每个像素只观察到一条或极少几条路径,某些路径命中灯光、某些路径只看到暗表面,结果会形成颗粒、亮点和帧间闪烁。这个噪声和普通相机传感器噪声不同,它和几何、材质、光源大小、BRDF lobe、采样策略、路径深度直接相关。

本章贯穿帧中,粗糙墙面的漫反射区域主要受到间接光采样影响。每个像素看到的 bounce path 不稳定,低频照度呈现斑块。镜面地板的 glossy reflection 则把噪声集中到高亮反射区域,因为反射方向窄,少数命中的路径会贡献很高亮度。细栅栏边缘同时包含几何高频和采样噪声,网络需要保留真实边缘,同时平滑随机亮暗变化。小面积灯牌会制造 firefly,它来自稀有高能量样本,对 HDR radiance 的影响远大于普通暗部噪点。

实时 ray tracing 的噪声还具有时间维度。相机运动时,当前像素和上一帧像素通过 motion vector 对齐。若运动向量、深度、法线或 disocclusion 判断存在误差,历史颜色会被投影到错误位置。结果表现为 ghosting、light lag、反射拖尾和透明边缘污染。这里的去噪需求已经超出单帧平滑,网络需要判断哪些历史信息可信,哪些区域应更多依赖当前帧。

去噪网络的输入可以写成 C^=fθ(Cn,G,H)\hat{C}=f_\theta(C_n, G, H)。其中 C_n 是 noisy color,G 是 guide buffers,例如 albedo、normal、depth、roughness,H 是 temporal history,例如上一帧颜色、variance、history length、motion vector 或 recurrent state。网络参数 theta 来自训练过程。这个表达式的工程含义是:网络输出受当前 noisy radiance、几何材质提示和历史信息共同约束。

单帧去噪主要解决空间方差。网络通过邻域像素、下采样上下文和辅助特征判断哪些颜色差异属于噪声,哪些差异属于真实材质或几何边界。时间去噪主要解决帧间稳定性。网络或累积模块通过 motion vector 把历史样本带回当前帧,并根据 depth、normal、roughness、disocclusion 和 confidence 调整历史权重。两者结合后,质量瓶颈从“有没有噪声”转成“细节、稳定性和延迟之间如何取舍”。

辅助特征的意义在于给网络提供物理结构。albedo 表示与光照分离的表面颜色,能帮助网络保留贴图边界;normal 表示可见表面的方向,能帮助网络维持几何边缘;depthviewZ 提供遮挡与前后关系;roughness 提示 specular lobe 宽度;motionVector 连接当前帧和历史帧。Intel 的 Open Image Denoise 文档coloralbedonormal 作为 ray tracing denoise 的典型输入,并明确指出辅助特征通常能显著提升细节保留能力。

去噪需求可以按 signal 拆分。Diffuse indirect lighting 需要大范围平滑,因为它通常低频;specular reflection 需要保留方向性和高频变化;shadow 需要保留硬边或半影宽度;ambient occlusion 需要维持接触阴影;transmission 和 transparency 需要处理第一命中点与后续命中点之间的 guide 对齐。把所有 signal 混到同一个 color 后再去噪,网络需要同时处理多种统计特性,训练难度和副作用都会上升。

NVIDIA 的 NRD README虽然主打非 AI 实时去噪库,但它对输入 guide 的组织很有工程参考价值:文档中列出 per-pixel G-buffer guide,包括 normal、roughness、viewZ 和 motion vector,并把 REBLUR、RELAX、SIGMA 分别用于 diffuse/specular radiance 与 shadow 类信号。这说明实时去噪的核心问题在网络之外也成立:先把信号和 guide 对齐,再决定每类信号的空间与时间处理策略。

本节建立的判断顺序是:先看 noisy signal 的来源,再看该 signal 是否有匹配的 guide,然后看历史重投影是否可靠,最后看网络输出的副作用。若画面只在静态暗部有颗粒,主要问题通常是低采样间接光;若相机运动后出现拖尾,主要检查 motion vector、history rejection 和 disocclusion;若贴图被抹平,主要检查 albedo、normal 和训练损失对高频细节的约束;若反射区域发糊,主要检查 reflection guide、roughness 和 specular signal 的单独处理。

137.2 去噪网络的基本架构

去噪网络的核心输入是一组同分辨率图像张量。最基础的形式把 noisy color 和 guide buffers 在 channel 维度拼接,再送入卷积网络。网络输出可以是 denoised color,也可以是 residual,即对 noisy color 的修正量。直接输出颜色的模型表达简单,训练稳定;输出 residual 的模型更倾向于保留输入结构,因为它学习的是“该改多少”。在 HDR 渲染中,常见做法还会对颜色做 log、exposure normalization 或 luminance scaling,使高亮 firefly 和暗部噪声进入更稳定的数值范围。

U-Net 是图像去噪中常见的 encoder-decoder 架构。Encoder 通过多层卷积和降采样扩大感受野,能看到更大范围的低频照度结构;decoder 通过上采样恢复分辨率;skip connection 把高分辨率边缘信息从浅层直接传到输出侧。用于渲染去噪时,U-Net 的优势在于同时处理大面积间接光斑块和局部几何边缘。风险在于 decoder 若过度依赖低分辨率上下文,纹理会产生油画感;若过度依赖 skip connection,噪声会残留。

Feature-guided denoiser 的重点在 guide 注入方式。最直接的方式是把 albedonormaldepthroughness 作为输入 channel。更精细的方式会在网络内部用 guide 计算边缘权重、attention mask 或 confidence map,让颜色平滑受几何边界约束。对于贯穿帧中的细栅栏,normal 和 depth 的边缘应限制跨边界混合;对于墙面上的贴图,albedo 应提示网络保留真实纹理;对于镜面地板,roughness 和 reflection hit 特征能提示网络区分真实反射纹理与随机高亮样本。

Kernel prediction network 采用另一种输出语义。网络不直接输出颜色,而是为每个像素预测一个空间滤波核,再用这个核加权邻域 noisy color 或 guide-aware features。它的工程价值在于输出仍由输入样本加权得到,颜色来源更容易解释。代价是每个像素需要预测多组权重,带宽和 ALU 开销会上升。实时场景会压缩 kernel 表示、限制 kernel 半径,或把 kernel prediction 与轻量 decoder 结合。

Recurrent denoiser 面向时间序列。它把上一帧的隐状态、denoised history 或 feature history 作为输入,并在当前帧更新状态。与普通 temporal accumulation 相比,recurrent 结构能把历史信息压缩进网络状态,学习哪些模式值得保留。它适合 1 spp 实时路径追踪,因为每帧信息极少,单帧网络很难稳定推断间接光。风险在于错误历史会被状态持续携带,所以 recurrent denoiser 必须配合 motion vector、disocclusion mask、history confidence 和 reset 策略。

Temporal accumulation 输入把网络从单帧估计器变成时空重建器。典型输入包括 reprojected history color、history length、variance、motion vector、depth delta、normal delta 和 disocclusion mask。网络看到这些输入后,可以在静态区域提高历史权重,在新暴露区域依赖当前帧,在运动边缘降低历史贡献。在贯穿帧中,相机扫过栅栏时,新露出的背景没有可靠历史,网络应降低 historyColor 的影响;镜面地板上的反射随视角改变,历史权重也应受到 roughness 和 motion 的共同约束。

DLSS Ray Reconstruction 属于集成在神经渲染链条中的去噪与重建方案。NVIDIA 的 DLSS 开发者页面描述了 Ray Reconstruction 使用 AI 在 sampled rays 之间生成更高质量像素,并替换多组手工调参 denoiser。这个信息对本章的抽象模型有直接意义:去噪网络可以从“某个 pass 后面的滤波器”上升为“与 upscaling、temporal feedback 和 ray-traced effect 共同设计的重建模块”。

不同架构的判断维度应保持一致:输入是否覆盖信号来源,感受野是否覆盖噪声尺度,时间路径是否可信,输出是否可解释,运行预算是否适配目标平台。U-Net 适合离线或中等预算的高质量去噪;轻量 CNN 适合固定信号的快速 pass;kernel prediction 适合需要解释邻域贡献的场景;recurrent denoiser 适合极低 spp 的连续帧;与 upscaler 合并的神经重建适合完整平台生态,但会引入 SDK、硬件和集成边界。

本节可以用一张简化数据流图归纳网络结构的共同路径。图中只表达输入与输出关系,不绑定某个具体产品或 API。

这条路径说明,去噪网络同时是当前帧的图像恢复模块和下一帧的历史生产者。输出质量会影响 tone mapping 之后的可见画面,也会影响下一帧 history 的可信度。因此评估网络时,应同时观察当前帧噪声、运动稳定性和历史污染,而非只比较单张截图的清晰度。

137.3 训练与集成去噪模型

训练去噪模型的基本样本是一对 noisy/clean 图像。noisy 通常来自低 spp 渲染,例如 1、2、4 或 8 spp;clean 通常来自高 spp reference,例如 1024 spp 或更多。训练目标是让网络在低采样输入下预测接近 reference 的输出。为了让模型适配真实渲染器,训练集还应包含相同管线生成的 albedo、normal、depth、roughness、motion vector、sample count、exposure 或其他 guide。数据分布越接近运行时画面,模型越容易把噪声和真实细节区分开。

数据集设计首先要覆盖噪声来源。训练集中应包含大面积 diffuse indirect、窄 glossy reflection、小灯、强 HDR、细纹理、法线贴图、透明材质、运动相机和动态物体。若训练集缺少小面积高亮,模型在运行时会把 firefly 当成真实高光保留下来,或者把真实灯牌抹掉。若训练集缺少反射区域,模型会把 reflection detail 当成随机噪声。若训练集只包含静态图,recurrent 或 temporal 模型在运动镜头中更容易产生历史拖尾。

Noisy/clean pair 的生成要保持物理一致。低 spp 和高 spp 应来自同一相机、同一几何、同一材质和同一光照,只改变采样数量或随机种子。Guide buffers 也应与 color 使用同一 pixel reconstruction filter。Intel 的 Open Image Denoise 文档强调辅助图像应和 beauty image 采用一致的重建滤波,并指出 aliased albedo 或 normal 可能在边缘引入 artifact。这个要求放到神经训练里同样成立:训练时的 guide 若和 color 对不齐,网络会学习错误边界。

HDR 训练需要处理动态范围。路径追踪输出可能包含极高亮度样本,直接用 L2 loss 会让高亮区域主导梯度,暗部结构学习不足。常见处理包括对 radiance 做 log 压缩、按 exposure 归一化、使用 relative loss、对 firefly 做合理裁剪,或同时约束 linear HDR 与 tone-mapped LDR 结果。工程上要明确训练目标:模型服务 final-frame offline denoise 时可以保守保留高光;模型服务实时预览时可以更强地抑制离群亮点。

Loss 设计决定网络的视觉倾向。L1 loss 通常比 L2 更能保留边缘,perceptual loss 可以提升视觉细节但可能引入物理偏差,temporal loss 可以约束连续帧稳定性,gradient loss 能保护边缘和纹理。用于渲染去噪时,loss 还应按 signal 做权重。例如 diffuse indirect 可以容忍更强平滑,specular reflection 对高频纹理和运动稳定更敏感,shadow 对边界位置更敏感。统一 loss 会把多种信号的目标混合,输出风格更难控制。

训练 temporal denoiser 时,需要提供连续帧序列。输入同时包含一张 noisy image、上一帧输出、motion vector、history length、camera matrices、depth 和 disocclusion 标记。训练过程中要模拟运行时 feedback:当前输出会成为下一帧输入的一部分。若训练时使用 clean history,运行时使用 denoised history,模型会遇到分布偏移,错误会逐帧累积。更稳定的做法是在训练或验证中使用自回归 rollout,让模型看到自己的历史输出。

模型导出是训练和引擎集成之间的分界。训练框架可能使用 PyTorch 或 TensorFlow,运行时却需要 ONNX、TensorRT、DirectML、Metal Performance Shaders、Core ML、WebGPU compute 或自研 inference backend。导出时要固定输入 channel 顺序、颜色空间、归一化参数、tensor layout、精度格式、动态分辨率策略和 fallback path。模型文件版本也要绑定 feature schema;一旦引擎修改 normal 编码、motion vector 单位或 roughness 范围,旧模型输出就会失真。

集成去噪模型时,首先把它视为一个 pass。这个 pass 读取 noisy radiance、guide buffers 和 history,写入 denoised radiance 与新的 history。它需要明确 resource state transition、descriptor binding、UAV/SRV 读写、async compute 是否可用、半精度或全精度选择、tile size、临时 buffer 生命周期和显存预算。若模型运行在 compute queue,还要明确和 ray tracing pass、post-process pass、upscaler pass 之间的同步。

运行预算来自目标帧率和分辨率。4K 60 FPS 的整帧预算约 16.7 ms,去噪模型若消耗 3 ms,就会挤压 ray tracing、shadow、lighting、post-process 和 UI 合成预算。实时引擎通常会降低输入分辨率、按 signal 分辨率执行、使用 half precision、采用 tiling、限制 channel 数量、复用 history buffer,或者在低端设备上切到传统滤波器。离线渲染可以接受更高预算,但仍要关心显存占用、tile seam 和批处理吞吐。

集成后的验证顺序应固定:先用静态相机比较 noisy、denoised 和 high spp reference;再开启相机运动观察 history;再测试动态物体、镜面、透明、细栅栏和高亮小灯;最后在目标平台测量 GPU 时间、显存、带宽和同步等待。每一步都要保存中间 buffer。只看最终 tone-mapped 图会掩盖很多问题,例如 HDR firefly 在 tone mapping 前已经污染 history,或 normal guide 在边缘发生编码错误。

137.4 与渲染管线耦合的方式

去噪网络和渲染管线耦合的第一层是 signal 分离。实时 ray tracing 常把 diffuse indirect、specular reflection、shadow、ambient occlusion 等信号分别生成,再用不同去噪策略处理。这样做的原因是每类 signal 的统计特性不同。Diffuse 间接光低频且噪声大,适合更强 spatial smoothing;specular 反射高频且视角相关,依赖 roughness、normal 和 motion;shadow 关注边界和半影,过度平滑会改变光源大小感。网络方案也应继承这种分离思想,至少在输入 channel、loss 权重或输出头上保留 signal 差异。

第二层耦合是 guide buffer 的生产位置。albedo 通常来自 material system,应该代表去除光照后的表面颜色;normal 来自 G-buffer 或 ray hit,需要明确是 world space 还是 view space;depthviewZ 来自主相机;motionVector 来自当前帧和上一帧的位置映射;roughness 来自材质参数。每个 guide 都有生命周期和编码约定。若 normal 被编码到 0 到 1,却按负一到一解码,网络会把几何边界读错。若 motion vector 单位从像素变成 UV,但模型仍按旧单位使用,history 会错位。

第三层耦合是 reflection 和 transparency 的 guide 对齐。常规 G-buffer 存的是第一可见表面。镜面地板上的反射内容却来自第二条路径或后续 hit。若去噪 specular reflection 时仍使用第一命中点 normal 和 albedo,网络会用地板材质去解释反射中的灯牌和墙面纹理,输出容易发糊。Open Image Denoise 文档也提到,对于镜面或透明路径,辅助特征有时需要跟随 perfect specular path 存储后续 diffuse 或 glossy hit 的特征。工程上可以为 reflection signal 提供单独 guide,也可以把 specular 分离成更可控的输入。

第四层耦合是 history buffer。去噪网络输出往往会回写 history,并在下一帧作为输入。history 通常包含 denoised radiance、moments、variance、sample count、confidence、previous depth、previous normal 或 recurrent state。每个 history buffer 都需要清晰的失效规则:分辨率变化、FOV 变化、camera cut、material streaming、TLAS/BLAS 重建、mesh deformation、light teleport 和 dynamic resolution 都可能改变历史可用性。缺少 reset 规则时,网络会把旧画面带入新画面。

第五层耦合是 post-process graph。去噪应位于 tone mapping 之前,因为网络通常处理 linear HDR radiance;它应位于 bloom 之前,因为 bloom 应基于去噪后的亮度,且 firefly 若提前进入 bloom 会扩散;它和 TAA、upscaler 的顺序要根据产品方案决定。若去噪输出直接进入 upscaler,motion vector、jitter、exposure 和 reactive mask 需要共享一致约定。若采用 Ray Reconstruction 类方案,去噪和 upscaling 的边界会合并,开发者需要遵守 SDK 对输入 buffers 的要求。

下面的流程图描述一个典型 frame graph 接入点。它强调资源路径和同步位置,而非某个 API 的具体命令。

这个 graph 中有三个检查点。第一个检查点在 Ray Tracing Pass 后,确认 noisy signal 的分辨率、HDR 范围、sample count 和 signal 类型。第二个检查点在 Reprojection 后,确认 history 是否对齐当前帧,disocclusion mask 是否覆盖新暴露区域。第三个检查点在 Denoise Network Pass 后,比较输出和 guide 边界,确认是否出现 edge bleeding、history smear、firefly retention 或 texture washout。

API 集成时要把网络 pass 当成普通 compute workload 管理。Vulkan 和 Direct3D 12 中需要明确 image layout 或 resource state,Metal 中需要明确 texture usage 和 command encoder 顺序。若使用 external SDK,开发者仍要准备正确输入资源、生命周期、同步和降级路径。若自研 inference,需要处理模型权重上传、descriptor table、constant buffer、dispatch grid、threadgroup memory、precision mode 和动态分辨率。

多平台差异应写入能力表。桌面高端 GPU 可以使用 tensor core 或矩阵加速路径;主机平台可能提供固定 SDK 或特定 shader model;移动 GPU 更受带宽和功耗限制;WebGPU 环境对模型大小、存储纹理、16 位精度和浏览器实现存在额外约束。相同模型跨平台使用时,要重新验证精度、tile seam、性能、内存和输出一致性。模型本身不会消除平台差异,它只把差异转移到 inference backend 和 buffer 约定上。

降级路径是集成设计的一部分。去噪网络可能因硬件、驱动、SDK 授权、模型加载失败或显存不足而不可用。稳定工程应提供 fallback filter,例如 SVGF、A-trous、bilateral、NRD 类实时去噪,或提高 sample count 后降低网络依赖。fallback 需要共用同一组 signal 和 guide,尽量保持输出格式一致,这样 post-process graph 和 history 管理无需重写。

137.5 去噪效果对比

去噪效果对比的目标是把视觉差异映射回输入、网络和管线。静态截图可以评估残余噪声、过度平滑、边缘保护和 firefly 处理;连续帧可以评估 ghosting、boiling、lag 和 history reset;buffer 对比可以定位 guide 错误;性能 capture 可以判断模型成本是否符合预算。对比时至少保存 noisy color、denoised output、reference、albedo、normal、depth、motion vector、history confidence 和 final image。

静态图像中的第一类问题是 residual noise。若墙面间接光仍有颗粒,说明网络感受野不足、训练数据缺少对应噪声、sample count 低于模型覆盖范围,或 guide 没有提供有效边界。第二类问题是 overblur。若墙面贴图、栅栏边缘和小字灯牌被抹平,说明模型把真实高频当成随机噪声,可能来自 loss 过度偏向均方误差、albedo 缺失、normal 错位或输出分辨率过低。第三类问题是 firefly retention。若少数高亮点仍保留,说明 HDR 归一化、离群值处理或训练样本覆盖不足。

动态镜头中的主要问题是 temporal instability。Boiling 表示同一表面在连续帧中亮度随机跳动,通常来自样本不足、history weight 太低或网络单帧输出方差高。Ghosting 表示旧画面残留,通常来自 motion vector 错误、history rejection 太弱或 recurrent state reset 不足。Lag 表示灯光或反射变化响应慢,通常来自时间累积过重。相机切换后若残留上一镜头,说明 history reset 没有覆盖 camera cut。

细节纹理需要和噪声分开评估。正确的贴图细节应在 albedo 中可见,并在 denoised output 中保留;随机采样噪声在 albedo 中没有对应结构,应被平滑。若 denoised output 的纹理比 albedo 更平滑,检查模型是否充分使用 albedo。若 denoised output 出现 albedo 中不存在的纹理,检查网络是否产生 hallucination 或 history 污染。若 normal map 细节丢失,检查 normal guide 是否包含法线贴图,而非只使用几何法线。

边缘区域的副作用最容易被最终 tone mapping 掩盖。Edge bleeding 表示前景颜色渗入背景,常见于 depth 边界或 normal 边界处理不足。Halo 表示边缘周围出现亮暗圈,可能来自 guide mismatch、kernel 权重不连续或 upscaler 与 denoiser 的 jitter 约定不一致。Disocclusion noise 表示新暴露区域颗粒明显,说明该区域缺少历史,网络需要更依赖当前空间上下文和 guide。对边缘问题,正确做法是同时查看 depth、motion vector、history confidence 和 output difference。

反射区域需要单独比较。镜面反射中的纹理、灯牌和高光可能来自可见表面之外的 scene point,第一命中点 guide 对它们支持有限。若镜面地板反射发糊,检查 specular signal 是否被单独输出,reflection hit guide 是否存在,roughness 是否正确,motion vector 是否描述反射内容的运动。若反射区域出现拖尾,检查历史重投影是否按反射信号处理。若粗糙反射太锐利,检查模型是否把低 roughness 和高 roughness 混在同一训练分布中。

效果对比可以使用统一表格记录。表格中的“观察对象”应对应具体 buffer 或画面区域,“可能原因”应指向输入、训练、网络或管线环节,“复查动作”应能在工具中执行。

观察对象可能原因复查动作
静态墙面仍有颗粒低 spp 超出模型覆盖范围;history 权重不足比较 noisy、output、reference 和 variance
栅栏边缘发糊depth 或 normal guide 错位;loss 过度平滑叠加 depth edge、normal edge 和 output difference
镜面反射拖尾reflection history 重投影错误;motion vector 不适配反射内容单独显示 specular signal、motion vector、history confidence
小灯牌亮点扩散firefly 处理不足;HDR normalization 不稳定查看 tone mapping 前 HDR output 和 bloom 输入
运动物体有残影disocclusion mask 或 history rejection 太弱冻结网络输出,逐帧检查 reprojected history
贴图变成油画感albedo guide 缺失;decoder 过度平滑对比 albedo、normal map、output 高频残差

质量指标应和视觉检查配合使用。PSNR 和 MSE 能衡量与 reference 的数值接近,但对高频纹理和时间稳定性的解释有限;SSIM 更关注结构相似,但仍可能忽略 ghosting;temporal error、warped-frame difference、history confidence heatmap 和区域化指标更适合动态序列。HDR 场景还需要在 linear radiance 和 tone-mapped display 空间分别比较,因为某些误差在 HDR 中很大,在 LDR 中只表现为轻微 halo。

NVIDIA 的 DLSS 3.5 Ray Reconstruction 介绍把传统 denoiser 的两个核心动作概括为 temporal accumulation 和 spatial interpolation,并指出手工去噪在保留高频信息、处理 ghosting 和多种 ray-traced effect 时存在取舍。这个判断可以迁移到自研去噪网络:网络质量也要同时看空间细节、时间稳定和 effect-specific 行为。单张截图更清晰,并不自动代表连续镜头更稳定。

最终评估顺序应固定为五步。第一步,确认输入 signal 和 guide 是否齐全且编码一致。第二步,在静态相机下比较 noisy、output 和 reference,定位空间去噪能力。第三步,在相机运动和动态物体下检查 temporal history。第四步,按 diffuse、specular、shadow、reflection 和 transparency 分区观察副作用。第五步,记录 GPU 时间、显存、带宽和同步等待,把质量收益放回 frame budget。完成这五步后,才能判断一个 denoising network 是否适合当前渲染管线。

最小自检任务

给定一帧低采样 path tracing 画面:noisyColor 中墙面有颗粒,镜面地板反射发糊,相机移动时灯牌出现拖尾。当前管线提供 albedonormaldepthroughnessmotionVectorhistoryColor,去噪网络输出 denoisedColor 后进入 upscaler 和 tone mapping。请按本章方法写出排查顺序,说明每一步要看哪个 buffer、判断哪个问题、对应的修正方向。

答案要点

先看 noisyColor 和 signal 类型,墙面颗粒通常对应 diffuse indirect 的低 spp 方差,镜面地板反射发糊对应 specular signal 的高频丢失,灯牌拖尾对应 temporal history 失配。接着检查 albedonormaldepthroughness 是否和 noisyColor 对齐,墙面贴图应在 albedo 中稳定存在,几何边缘应在 normaldepth 中清晰,反射区域还要判断第一命中点 guide 是否足以解释反射内容。

然后检查 motionVectorhistoryColor 和 history confidence。若相机移动后灯牌残留,重点复查 motion vector 单位、reprojection、disocclusion mask 和 camera cut reset。若静态区域仍有颗粒,复查 history length、variance 和 temporal accumulation 权重。若反射发糊,复查 specular signal 是否独立处理,roughness 是否进入网络,reflection hit guide 或 specular motion 是否可用。

最后比较 denoisedColor、reference 或高 spp 对照、upscaler 输入和 tone mapping 前 HDR。若 denoisedColor 已经抹平贴图,修正方向是补充 albedo/normal guide、调整 loss 或降低空间平滑;若 denoisedColor 正常但 final image 有 halo,修正方向是检查 upscaler jitter、motion vector 和 reactive mask;若 HDR firefly 进入 bloom,修正方向是检查网络前后的 HDR normalization、离群值处理和 bloom 输入位置。

本章知识点总结

  • 噪声来源:路径追踪噪声来自有限样本的 Monte Carlo 方差,并随光路类型、材质和光源分布变化。
  • 贯穿信号:去噪网络应同时读取 noisy radiance、G-buffer guide 和 temporal history。
  • 辅助特征:albedo、normal、depth、roughness 和 motion vector 给网络提供材质、几何和时间约束。
  • 信号分离:diffuse、specular、shadow 和 reflection 的统计特性不同,去噪策略应保留这种差异。
  • U-Net 路径:U-Net 通过大感受野和 skip connection 同时处理低频照度与高频边缘。
  • 时序输入:recurrent state 和 temporal accumulation 可以提高稳定性,也会把错误历史带入后续帧。
  • 训练配对:noisy/clean pair 应来自同一场景状态,并覆盖目标运行时的低采样分布。
  • HDR 约束:高动态范围训练需要处理 exposure、离群高亮和 tone-mapped 视觉目标。
  • 管线接入:去噪 pass 需要明确资源状态、history 更新、post-process 顺序和 fallback path。
  • 反射边界:镜面和透明路径可能需要后续 hit 的 guide,第一命中点 G-buffer 对反射内容支持有限。
  • 动态评估:单帧清晰度和连续帧稳定性要分开检查,ghosting、boiling 和 lag 对应不同时间路径问题。
  • 排查顺序:先查 signal 和 guide,再查 history,随后查网络输出,最后查 upscaler、tone mapping 和性能预算。