(论文)[2010-WSCG] A Hierarchical Automatic Stopping Condition for Monte Carlo Global Illumination
HASC
intro
- 和之前的 adaptive sampling 不一样,本文考虑的是保守的提前终止或者分裂,而不是分配样本
- framebuffer-based(和渲染算法无关)
A Hierarchical Criterion
- 在做决定之前,先绘制大量样本(不然可能会忽视一些复杂的现象)
- per-block 相较于 pure per-pixel 的好处,能避免过早停止
- 分裂 block:per-block error 降到 \(\epsilon_s\) 之下
- 主要流程
- block 的维护
- 每一个 block 是一个图片空间的 AABB 包围盒
- 所有的 block 放到一个线性表里面
- 当有 block 分裂的时候,从表中移除这个 block,然后把生成的子 block 放进线性表中,这样就不需要显式维护层次结构
- draw samples:对于还需要渲染的 block,里面的每一个像素分配一条光线
- 如果是 PT 是 ok 的,light tracing 的话,可以 sample adaptively from the lights
- 如果所有的 block error 都小于 \(\epsilon_{t}\),则图片收敛
Error Metric
- 误差计算方式
- 通过两张同 spp 结果之间的差异计算得到
- 在实现上,一张正常渲染的图片 \(I\),一张额外的 buffer \(A\),\(A\) 只包含偶数 spp 的结果
- 根据上面的误差计算方式,我们计算的误差实际上是奇数 spp 和偶数 spp
的结果之差
- 不妨设奇数 spp 的结果为 \(B\)
- \(I=\dfrac{A+B}{2}\)
\[ \vert{B-A}\vert=\vert{(2I-A)-A}\vert=2\vert{I-A}\vert \]
- 于是可以通过 \(\vert{I-A}\vert\) 来表示 \(\vert{B-A}\vert\),只相差一个常数倍数 \(2\)
- pixel 的 error
- RGB buffer
\[ e_{p}= \left(\sum_{i\in\{r,g,b\}}\vert{I_p^i-A_p^i}\vert\right) \Big/ \left(\sqrt{\sum_{i\in\{r,g,b\}}{I_p^i}}\right) \]
- 分母的根号来源:人眼对亮度的 log 响应
- 快速计算,能取得一点效果
- block 的 error
- \(N\):像素内的样本数
- \(r\):面积因子
- \(\sqrt{\dfrac{A_b}{A_i}}\):block 占据像素除以图片总的像素,开根号
\[ e_b=\dfrac{r}{N}\sum_{p}e_p \]
Block S/T
- 用户指定的 error(\(v\))
- 论文:\(v=0.0002\)
- termination error:\(\epsilon_{t}=v\)
- splitting error:\(\epsilon_{s}=256\cdot\epsilon_{t}\)
- 分裂规则:Axis-Aligned,选择长轴,位置恰好让两边 error 差不多
结果
Image Space
- PT+NEE
场景示例
- 场景及其需要收敛所要的 spp 数目
- 热力图:白色最多,黑色最少
- RMSE<0.01:\(400\text{M}=57\%\times700\text{M}\)
- 是线上,error metric 的计算占据了 10% 的渲染时间
其他场景
- 在整个图片计算都很复杂的时候,论文方法作用不大,但是仍然能够找到计算复杂的区域
Light Space
- 每一个光源维护一个 importance map
- importance map 就是对于出射方向的一个划分(bins)
- 忽略 mesh 的具体发射点、以及后续的弹射点
- 基于光源三角形相较于被照亮的区域来说,很小
- 较大的话,可以通过细分光源三角形实现
- 忽略 mesh 的具体发射点、以及后续的弹射点
- importance map 的更新
- 这一轮的光线到达胶卷的时候,计算 error,然后累积到对应发射的 importance map 的 bin 中
- 下一轮用于重要性采样/adaptive sampling
场景
- 对应热力图
- 第一行:importance map
- 第二行:image error
- RMSE<0.01:\(160\text{M}=28\%\times570\text{M}\)
future
- 扩展到 BDPT
- 扩展到高维空间:不依赖于 framebuffer