跳过正文

Metatron Dev. IX: 辐射度缓存

·1146 字·3 分钟
目录

辐射度缓存在探针中存储辐射度, 命中后直接查询缓存, 因此有偏.

ORCA
#

根据BSDF抽样概率和粗糙度决定舍弃概率, 根据预算归一化以避免光滑场景光线超支:

si=bsii=1Nsi \begin{equation} s'_i=\frac{b s_i}{\sum_{i=1}^N s_i} \end{equation}

稀疏光线完整追踪, 根据第二次弹射顶点信息计算hash, 更新最细LOD体素的累积辐亮度, LOD与相机距离相关. 下采样以更新LOD体素, 其余光线单次弹射并查询缓存, 模拟重连接. 只用本帧数据, 不做时域累积.

SHARC
#

依据世界空间顶点和LOD计算hash, 因此跨帧hash一致, 体素辐亮度逐帧累积.

NRC
#

单个MLP缓存散射辐亮度Ls(x,ω)L_s(\mathbf{x}, \omega), 路径足迹足够大时误差被模糊, 令pp为BSDF抽样概率, θ1\theta_1为主顶点处视线与法线夹角, c=0.01c = 0.01, 路径足迹定义如下:

a(x1xn)=(i=2nxi1xi2p(ωixi1,ω)cosθi)2a0=x0x124πcosθ1,a>ca0 \begin{equation} \begin{aligned} &a(\mathbf{x}_1 \cdots \mathbf{x}_n) = \left(\sum_{i=2}^n\sqrt{\frac{\|\mathbf{x}_{i-1} - \mathbf{x}_i\|^2}{p(\omega_i\mid\mathbf{x}_{i-1}, \omega)|\cos\theta_i|}}\right)^2\\ &a_0 = \frac{\|\mathbf{x}_0 - \mathbf{x}_1\|^2}{4\pi\cos\theta_1}, \quad a > ca_0 \end{aligned} \end{equation}

屏幕分块后每块抽样一条路径更新缓存, 高学习率与每帧多步导致闪烁, 因此推理时使用权重的指数移动平均, α=0.99\alpha = 0.99, ηt\eta_t修正初期偏差, 不反馈到训练:

Wˉt=1αηtWt+αηt1Wˉt1,ηt=1αt \begin{equation} \bar{W}_t = \frac{1 - \alpha}{\eta_t}W_t + \alpha\eta_{t-1}\bar{W}_{t-1}, \quad \eta_t = 1 - \alpha^t \end{equation}

MLP为7层64宽无偏置, 输出RGB. ω\omega, n\mathbf{n}转球坐标, 与1er1 - e^{-r}一同做4区间one-blob编码, 漫反射与镜面反射率α\alpha, β\beta直接输入. 位置微小变化引起辐亮度剧变, 改用频率编码:

freq(x)=(sin(20πx),sin(21πx),,sin(211πx)) \begin{equation} \text{freq}(x) = \left(\sin(2^0\pi x), \sin(2^1\pi x), \dots, \sin(2^{11}\pi x)\right) \end{equation}

MLP输出乘α+β\alpha + \beta得到近似出射辐射度. 由于LsL_s为无偏估计量, 使用相对L2损失保证梯度无偏, sg\text{sg}为停止梯度, 损失函数如下:

L2(Ls,L^s)=(LsL^s)2sg(L^s)2+ϵ \begin{equation} \mathcal{L}_2(L_s, \hat{L}_s) = \frac{(L_s - \hat{L}_s)^2}{\text{sg}(\hat{L}_s)^2 + \epsilon} \end{equation}