7.1 实时预算下的采样优化


7.1 实时预算下的采样优化

离线渲染器的哲学是"样本不够就等",实时管线的哲学必须是"样本不够就借"——借上一帧、借邻居像素、借分辨率。本节先解剖一帧的完整时间账本,让"穷"有具体的数字,再依次介绍三件借力武器:半分辨率追踪、全屏导引重建、时序复用。读完本节,你应当能对自己项目的帧预算做一次有依据的排兵布阵,而不是凭感觉砍效果。

先算账:16.67 毫秒都去哪了

以 60 帧每秒为目标,一帧总预算 16.67 毫秒,而这笔钱要在光栅化主场景、阴影贴图、后处理、游戏逻辑、界面渲染之间先分一轮——实时光追通常只能分到 2 到 5 毫秒。这笔小钱内部再分:射线生成与包围盒遍历(求交)通常吃掉光追预算的一半上下,着色与降噪分食剩余。账本读出三个设计推论。其一,求交是主粮:一切优化先问"省了多少次遍历",而不是"省了多少算术"。其二,样本极度稀缺:光追预算只够每像素每效果一条射线,第 6 章动辄数百样本的收敛 luxury 不复存在——这就是降噪器成为标配的原因,7.2 整节都在接这笔债。其三,分辨率是最大的合法杠杆:射线数正比于像素数,分辨率减半射线省四分之三,比任何算法微优化都狠。

图:一帧 16.67 毫秒的预算解剖

图:一帧 16.67 毫秒的预算解剖

半分辨率追踪:最划算的一刀

第一件武器最朴素:把光追效果(尤其反射与 GI)在四分之一分辨率上计算,再用深度导引的上采样放大回全屏——深度相近的邻居像素共享同一份光追结果,边缘由 G-buffer 的深度与法线导引防串色。省下的预算可以买"每像素两条射线"或"再算一个效果"。它不是无脑降质:光照信号本身低频(间接光尤甚),四分之一分辨率承载它绰绰有余;真正高频的是几何边缘,而边缘信息 G-buffer 里本来就有全分辨率版本——让光追只管"光",几何细节交还给光栅化,各取所长。

时序复用:上一帧是免费的多余样本

第三件武器是实时管线最重要的发明:时序复用。思路直译自蒙特卡洛——6.1 的收敛定律说样本越多噪声越低,而游戏有连续帧,上一帧的场景与当前帧九成相同,凭什么都丢?把上一帧的颜色沿运动矢量重投影到当前像素,当作额外的历史样本与当前帧样本加权融合,有效样本数瞬间从 1 变成 8、16 甚至更多,噪声大幅退场。完整协议有四步,缺一不可:

1. 运动矢量:每个像素记录"它在上一帧的位置" (相机运动 + 物体运动,缺一会有拖尾) 2. 重投影:读取上一帧历史缓存时按运动矢量取值 3. 有效性验证:历史值的深度、法线、物体ID 与当前帧比对 不一致(被遮挡暴露 / 物体移动)则弃用历史或降低其权重 4. 应急策略:暴露区域历史全弃,回退到当前帧样本加空域滤波 权重上限防"无限历史"导致的拖尾

这套协议解释了实时光追画面的多数诡异现象:拖尾来自运动矢量缺失或权重无限累积,重影来自有效性验证失守,边缘闪烁来自暴露区域的应急切换。协议的另一面是精度红利——时序复用不仅降噪,配合方差的历史估计还能反过来指导 7.2 的滤波强度:历史方差大的区域多滤,稳定区域少滤。

实验台:给一面镜子排预算

完整案例。需求:赛博朋克街景,雨后地面要长距离反射,霓虹灯牌密集,目标 60 帧。第一步列效果与成本:地面反射(大头)、霓虹阴影质量、角色 GI 增益。第二步按账本排兵:反射走半分辨率追踪加时序复用(有效样本从 1 抬到约 12,噪声入不了眼),预算 1.8 毫秒;阴影射线只对主光源发射且加距离截断,0.6 毫秒;GI 放弃全屏追踪,改用 7.3 的探针网格提供间接光,光追只负责探针的辐照度采样,0.5 毫秒;合计约 3 毫秒,留出降噪的 1.5 毫秒。第三步验收与调参:转角快速平移镜头时地面反射出现半透明拖尾——判定为时序复用暴露权重过高,把历史权重上限从 0.9 降到 0.8 并收紧深度验证阈值,拖尾消失、静态画面噪声增幅可接受。解读:预算案不是一次写死的,验收回路的"症状到参数"翻译能力才是实时光追工程师的核心手艺——下一节就是这门手艺的专修课。变式:若目标平台砍掉硬件光追,反射降级为屏幕空间方案,阴影回退阴影贴图,账本整个重排——这正是 7.3 方案货架存在的意义。

一张射线配方表:每像素预算怎么拆

前半节的三大武器——降分辨率、降射线数、时序复用——要拧成统一的预算案才算工具箱成型。落地形态是一张"每效果配方表",先给 60 帧旗舰档的参考值:

效果 每像素射线数 分辨率策略 需要的历史
长距离反射 1 半分辨率 时序累计 8 帧上下
接触硬阴影 1 全分辨率为主 可不累计
漫反射全局光照 0.25 到 0.5 四分之一分辨率 必须时序累计
环境光遮蔽 0.5 到 1 半分辨率 可选
无序透明 按层数计 全分辨率 不需要

配方的读法比数值重要。反射宁要半分辨率全样本、不要全分辨率半样本——同样射线总数,摊到四分之一像素面积后时序累计补得回来;漫反射全局光照天生低频,四分之一分辨率是行业默认;接触硬阴影贴着几何边缘,降分辨率会让阴影线抖动,通常保全分辨率。透明一行值得展开:光追处理无序透明是强项,成本随透明层数线性涨,配方给它单列预算并做厚度截断(超过三层改近似合成),防止粒子密集帧把预算炸穿。表是起点不是终点:真正的调法是开着每效果射线计数器跑主城、室内、最终决战三个极端场景,把最差场景压进预算,再回头把省下的额度还给画质。

再算一笔有效样本的账,说明时序复用为什么是杠杆之王。每像素每帧一条射线、历史权重 0.9 时,稳态有效样本约 10;把射线数翻倍,有效样本约 20,代价是实打实的求交毫秒;把历史权重从 0.9 提到 0.95,有效样本同样逼近 20,代价是拖尾风险与零毫秒成本。先拧免费旋钮、再花真钱——预算案的总原则与性能优化"先算法后微调"的次序完全同构。

配方表还有一层进阶玩法:按镜头内容动态改配方。水面特写帧临时把反射提到全分辨率,洞穴场景把预算让给漫反射全局光照;射线预算从静态配置变成随内容流动的资源。这是第 9 章任务图调度思想的预告——预算分配本身也该是一个动态系统。

配方表落地还差最后一块:验收指标。射线数与分辨率是投入侧,产出侧要看"有效样本数"与"噪声可见度"两条曲线——把每档配方的两条曲线画出来,预算会在哪崩一目了然。常见误区是只盯帧时间不看产出:帧时间达标但有效样本数塌方,等于省了钱买了假货。投入产出对着看,预算案才算闭环。一条留白提醒:配方表是团队资产不是个人记忆,把它连同硬件平台、驱动版本、场景名一起存档,硬件换代时旧表还能告诉你哪一档变了、变了多少——没有基线的调优,每次都从零吵架。文档化的另一面是可回滚:每个配方存成独立预设,线上出问题一键退回上一档。

本节要点回顾

  • 16.67 毫秒是全管线的钱,光追通常只有 2 到 5 毫秒,其中求交吃掉一半上下——优化先省遍历。
  • 半分辨率是最大合法杠杆:光追管低频光照,几何边缘交还 G-buffer,四分之一分辨率常是净赚。
  • 时序复用四步协议:运动矢量、重投影、有效性验证、暴露应急——缺一步就是一种画面疾病。
  • 有效样本数是实时管线的核心指标:从 1 借到 12,降噪负担立减;借不来就得靠 7.2 的滤波。
  • 预算案必须配验收回路:画面症状翻译回参数修正,是实时工程师的日常。

账算清了、样本借来了,剩下的问题是如何把每像素一条射线的糙结果修饰成能看的画面——下一节进入降噪器的内部。


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