ReSTIR支持域与归一化
全库目录221
本文目录11
来源蓄水池可能照不到当前像素能接收的光。本文说明这种支持差异怎样影响合并,以及两遍归一化如何维护贡献乘数。源池j保存代表Yj、乘数Wj、计数Mj及源表面;当前目标为非负函数targetCurrent,当前完整贡献为f,所有量采用同一光样本测度。单像素RIS、面积到参数测度转换和A/B/C/H帧调度见ReSTIR。
支持域修正与归一化
支持失配的能量损失
几何相容不等于采样支持相同。一个表面的法线把光源b放在背面,它生成的池就可能永远没有b;另一个表面却能受到b照明。用光域a、b在当前像素各贡献1作反例:当前池均匀提议两点,K=1;源池只支持a。两池按总计数2合并,期望相当于把积分2和积分1平均,得到1.5。多加邻居只会增加这类不完整估计的份数,不能自动补回b。
下面先给支持分区形式,再给用连续目标值分配的MIS形式。两者都保留“在当前表面选择代表,再到源表面重新评价这个代表”的两遍结构;区别在最后如何分配各源的归一化份额。
支持分区归一化
设源池j的有效支持为Sj,已保存的Wj满足:对任意函数g,E[g(Yj)*Wj]=积分_Sj g(y)dy。它表达Wj是该源支持上的贡献乘数,不要求我们知道蓄水池最终选样的精确密度。ReSTIR证明初始RIS满足这条关系;后续池要通过同样正确的归一化继续维护它。
在当前像素用aj=Mj*Wj*目标当前(Yj)选择代表Y,累加S。定义选中位置被多少源覆盖:
最后把总M换成D(Y),得到:
条件在输入源池上,对选择过程取期望,选中源j的概率为aj/S,故估计期望先变成sum_j f(Yj)*Mj*Wj/D(Yj)。再对各源池取期望,就得到:
这要求当前贡献非零的位置至少由一个源覆盖。每像素的新鲜池采用覆盖全部有效光源的提议,因此即使历史漏掉某盏光,当前池仍为它提供支持。若当前提议本身没有这盏光,归一化无法凭空产生候选。支持修正还要求保留所有已接受源的M和支持评价信息;某源这次所有候选都为零、没有代表,也不等于它的支持处处为空。
上述两光反例中,当前支持为{a,b}、源支持为{a},两池M均为1。于是D(a)=2、D(b)=1。假设这次当前池保留b、W=2,源池保留a、W=2,流式权重为2和2:选b时最终W=4,选a时W=2,条件均值为3。这个条件均值不要求等于真实积分,因为只固定了其中一种候选组合。把两个均匀初始候选的四种组合全部列出,条件均值依次为2、1、3、2,总期望才是2。朴素总M归一化对应2、1、2、1,期望为1.5。
支持不能从保留下来的光样本倒推。评价Y属于Sj时,要取得源表面位置、几何/着色法线、材质参数和当时采用的光源集合,按源的目标函数重新评价Y。如果源在重采样前把遮挡样本清零,还要在该源表面检查可见性;只看BRDF为正会把实际被删除的候选误当成可生成,D便偏大,图像变暗。
连续目标权重与来源身份
支持只判断零与非零。源目标非常接近零但仍为正时,它偶尔产生的样本可能携带很大W,二值支持仍允许它与主要来源获得相同份额,方差可能很大。可以给每个源选取非负函数hj(y),在Sj内为正、域外为零,再让各源份额相加为1。
一个实际选择是hj(y)取该源表面的重采样目标;若源阶段删除遮挡样本,就采用目标乘相同规则的可见性。记最终代表由源s贡献,连续权重归一化为:
分子必须使用真正被选中的来源s;每次池替换代表时,同时保存来源索引。流式选择仍用Mj*Wj*目标当前,连续权重只在最终选择后计算。对选择过程取期望再应用源池关系,各源积分的系数为Mj*hj(y)/sum_k Mk*hk(y),求和为1,因此同样恢复积分。取hj为支持指示函数就退化成上一节公式。
具体地,若a处当前h0=1、邻居h1=4,两池M均为1,分母为5:同一个光a由当前池选出时分子是1,由邻居选出时分子是4,二者得到不同贡献乘数。把分子写死为当前目标,就会丢掉来源身份,前述相加为1的关系也随之失效。这种按候选来源分摊的权重是归一化用的函数,不等于蓄水池的精确选样密度。
原论文补充材料的Algorithm 1展开了第二遍源表面评价;RTXDI的RTXDI_DISpatialResampling保存选中邻居索引,再累加源目标乘源M,最后以选中源目标作为分子调用归一化。源码提供不同偏差修正模式,不能把所有模式笼统叫作同一个无偏实现。有限域参考按上述公式枚举选择过程。
两遍合并实现
本页采用连续目标权重作为时空复用的计算路线,二值支持形式用于解释和诊断。以下伪代码把两者用同一函数h表达。accepted由表面对应、版本和邻域规则先确定,两遍使用完全相同的源集合;每项保留池、源表面和源目标评价上下文。targetCurrent与h均采用同一光样本测度。
S = 0; selected = invalid; selectedSource = invalid
for j in accepted:
if reservoir[j].hasSample:
a = targetCurrent(Yj) * Wj * Mj
S += a
if a > 0 and random01() * S < a:
selected = Yj
selectedSource = j
if selected is valid:
denominator = 0
for j in accepted:
denominator += Mj * h(sourceSurface[j], selected)
numerator = h(sourceSurface[selectedSource], selected)
W = S * numerator / (targetCurrent(selected) * denominator)
M = sum(Mj for j in accepted)
else:
W = 0; M = sum(Mj for j in accepted)源目标和支持约定正确时,选中源自身应贡献正分母。若分母为零、数值非有限或选中来源无法复原,本次复用发生契约错误:记录诊断,使用仍完整保留的当前新鲜池;分母检查失败时保留当前池的有效估计,并修复来源目标与支持记录。
递归合并的成立条件
合并结果下一帧还会被当作输入,所以证明不能只停在最后一次选样。需要维护的量是:对输出表面的支持域Sx和任意可积函数g,E[g(Y)*W]=积分_Sx g。这里的期望包括此前所有候选生成和池替换的随机性;它不是条件在已经实现的历史样本上的期望。下一帧即使改了光照,仍能把新的贡献函数放进g。
本页用B表示时域输出、C表示空间输出,K为当前像素的候选预算。采用以下可实现的调度规则。场景、材质、光源版本和表面对应关系由本帧几何确定;邻居地址采用固定模板,或由独立于所有候选与替换随机数的地址随机流产生。历史是否接受只读取这些几何与版本数据。每个池的M即使没有代表也照常累计,历史权重采用m=min(M,20K),K由预先设置的预算确定。M、接受集合和源目标h均不读取选中光源、亮度、W或随机阴影结果。渲染采样结果若反过来控制后续候选预算或来源选择,就需要另作条件分析。
把这些场景和调度数据合称G,并先固定G。池本身仍是随机的:一个源可能选a,也可能选b,两个源甚至可能来自同一个祖先。对固定G,每一项来源及m已确定,函数c_j(y)=m_j*h_j(y)/sum_k(m_k*h_k(y))也确定。由源池关系,对任意g有:
等号先消去本次替换的选择概率,再逐项使用源池的条件估计关系;求和的线性性不要求各源独立。每帧的当前新鲜池覆盖Sx,保证Sx上各来源份额之和为1。初始池满足这个关系,因此时域输出、空间输出和下一帧历史可以依次归纳。再次平均独立的调度随机性G,结论仍成立。这里固定的是外生调度,而不是某次随机采样得到的历史内容;后者不能被当作已知常量后继续套用原来的无偏关系。
这也说明中间池应如何登记支持。B或C的支持是它所属表面的当前目标为正的区域,因为本地新鲜候选提供完整覆盖,合并又只选择当前目标为正的样本。它保存当前表面和当前目标版本作为下一阶段的h上下文;不需要把所有祖先的表面递归存下去。若删除本地新鲜候选,输出支持可能只是来源支持的并集与当前目标的交集,此时仅登记当前表面就可能高估支持,下一轮归一化会变暗。
例如两个像素的空间池都沿用同一个历史代表,这两个输入显然相关。只要各自的贡献乘数仍满足上述关系,把它们一起合并仍保持期望;但它们没有提供两份独立信息,M增长也不能保证噪声按独立样本数下降。GRIS区分无偏贡献乘数与渐近收敛条件,本页的有限次递归证明不推导无限帧收敛速度。GRIS原论文第4.2—4.3节给出贡献乘数和分区条件,第4.4—5节另行讨论方差与收敛。
自适应取舍的偏差
来源集合与计数一旦依据代表样本改变,上面的固定分区函数就可能失效。取两个光a、b,贡献分别为1和3,当前池和历史池各有一个均匀候选,乘数均为2、目标处处为1。若历史选a就令m=1,选b就令m=3,当前池始终m=1。给定历史选a,本次估计对当前候选和替换取期望为(4+2)/2=3;历史选b时为(4+3*6)/4=5.5。两种历史各占一半,最终均值4.25,超过真实积分4。
将同一个m同时用于选择和归一化,仍不能消除这项偏差,因为m已经由被重用的随机样本决定。若只接受选中b的历史,选中a时直接使用当前池,均值又会成为(4+5)/2=4.5。亮度驱动的邻居挑选、基于随机阴影命中的历史拒绝,具有同样需要重新分析的接口。
一条便宜的工程变体可以继续采用总M归一化、历史可见性缓存或亮度截断,但各项误差要能单独解释:总M会把不支持当前光源的来源也算入分母;过时可见性改变最终被积函数;亮度截断删去尾部贡献;样本驱动的接受改变来源分布。最终重新追踪一条阴影射线只能修正当前可见性,无法补回其他三种偏差。需要保持本文递归关系时,使用前述外生调度、完整当前支持和两遍归一化;需要自适应调度时,要为实际选择分布重新构造贡献分配,而不是仅调整M。
历史支持与场景版本
历史池还要能评价历史支持。工程保存前帧GBuffer、材质/光源采样版本和所需变换;源目标在前帧定义,当前目标在本帧定义,两者分别求值。可见性若参与源h,需要前帧可查询的几何状态或与之匹配的可见性证据,拿当前墙体代替旧墙体不是同一个支持。只在最终着色查询可见性、重采样阶段不删除遮挡样本,可以避免这份可见性支持的历史依赖,但背面和材质目标的零值仍要修正。
动态面光源按ReSTIR统一的“稳定光ID、平方参数u/v”测度表示样本,当前贡献含当前面积雅可比,历史乘数已在初始写池时转换为W_param,源支持按当时的光几何和面积评价。若接口输入仍是世界面积域的W_area,先按源面积转换再合并;整份光ID版本重新分配或参数化整体改变时,旧样本已无法唯一映射,按版本规则重建该段历史;单个光删除仍采用ReSTIR中的目标置零与保留来源规则。新增光源由当前新鲜池覆盖,旧池在新增光域上的h为零;保留旧池参与其余光域,并不要求把整个动态场景限制成共同支持。
实现与验证
运行python -B 知识库/examples/mechanism_chain/restir/test_reference.py,10项有限域检查覆盖支持失配、零候选来源、不同计数、来源分子和面积到参数测度转换。共同支持基线另见ReSTIR;本页递归条件通过符号推导与反例核对,完整图像级GPU实现、方差收敛和性能尚未运行。
相关主题
参考资料
完整来源与本机实验入口见ReSTIR。