Quality Improvement in RTR

有关 RTR 的话题, Based on GAMES202

这篇博客用中文写好了,以锻炼一下自己的中文语言表达能力。

Real-Time Environmental Mapping

既然有 Environmental Mapping,就一定需要一个 Environment Map,用来表示环境里光照的情况。 我们确实有多种储存 Environment Map 的方法:Spherical map, cube map. 不过这都不重要,最终实现的时候再去关心这些东西,我们只需要提供接口: $E(\theta, \omega)$ 表示某一个方向的 radiance.

在这种已知条件下,我们需要 Solve Rendering Equation. 因为考虑遮挡太难了,先删除遮挡项好了。

于是,就有

\[L_o(\textbf{p}, \omega_o) = \int_{\Omega^+}{L_i(\textbf{p}, \omega_i) f_r(\textbf{p}, \omega_i, \omega_o)} V(\textbf{p}, \omega_i) \ \mathrm{d} \omega_i \quad \text{(ignore } V \text{ for this time)}\]

如果在 RTR 中解这个方程.. 至少现在不可能。这时候就需要 RTR 的偷懒神功,

  1. Ignore sampling
  2. Numerical approximation

在较低频的 BRDF 中,我们可以考虑使用积分的近似:

\[∫ f(x)g(x) \ \mathrm{d} x \approx ∫ f(x) \ \mathrm{d}x \cdot ∫ g(x) \ \mathrm{d}x \cdot \left( ∫ {\ \mathrm{d}x} \right)^{-1}\]

这个近似法比较神秘.. 可能在 $f(x)$ 是常数的情况下它确实能逼近吧(x

于是,在 BRDF 中,我们将我们希望能预处理的 $L_i(\textbf{p}, \omega_i)$ 提出来。

分母是已知的,我们可以稍微 filter 一下 Environment Map,然后就… 课程的这部分其实没有讲清楚。

这里比较麻烦的是,还需要解决后面的 BRDF 的积分。我们考虑 Microfacet BRDF. 但是我们必须简化这个 BRDF,我们考虑 Fresnel 项和 NDF 项。

很可惜的是,Fresnel 项和 NDF 都有比较好的 Approximation.

比如 Fresnel Term 可以用 Schlick’s Approximation 来进行近似,而 NDF 可以用 Beckmann Distribution 的相近的函数来近似(比如找一个 cos^k)。

总之,我们能搞出来两张图,他们能彻底简化 Rendering Equation. 它叫做 Split Sum Approximation.

Precomputed Radiance Transfer

这也是 GAMES202 的作业,这份作业的 report 我就丢在这里了。

Precomputed Radiance Transfer 基于这么一种思路,将 Path Tracing 过程中的光路计算储存到球谐函数中来保存。 而 Precomputed Radiance Transfer 就要求,动态下不能重新进行 Path Tracing——不能修改与光路相关的参数。 限制也不少,但是这就是 RTR.

球谐函数长这个样:

球谐函数

是不是有点眼熟.. 对啊,这玩意儿和电子云长一个样。

球谐函数是拉普拉斯方程的球坐标系形式解的角度部分

至于 Legendre Polynomial,由于我不是数学系学生不用太去了解。只需要知道 Laplacian Equation 的求解结果是 SH 即可。

按照我极其微薄的量子力学经验,$∇^2 f = 0$ 的求解,在球坐标系的表示下,分为径向部分和角向部分。SH 就是 Laplacian Equation 角向部分的解。 即,对于满足 Laplacian Equation 的函数 $f(r, \theta, \varphi) = R(r) Y(\theta, \varphi) $.

我们只需要在大化中某张表里查一下,就能查出球谐函数对应的值。由 $l, m$ 进行索引,它们分别叫做能层和能级(好神奇..)

我们这里不做复杂的计算,我们验证一下 SH 前三阶的正交性。正交性的定义为 $\langle f, g \rangle = 0$.

在这里就是一个二重积分了,

\[\langle Y_{1, 0}, Y_{1, 1} \rangle = \iint_{\Omega} \dfrac{3 \pi}{4} \sin \theta \cos \theta \cos \varphi \ \mathrm{d} \theta \mathrm{d} \varphi = 0\]

容易以类似的方式验证,所有的这样的 SH 都是正交的。作为计算机学生,暂时了解到这里就好。 等等,我再补充一点,

勒让德多项式的一个重要性质是其在区间 $−1 ≤ x ≤ 1$ 关于 $L^2$ 内积满足正交性 http://games-cn.org/wp-content/uploads/2021/04/GAMES202_Assignment2.zip 所以说这里用的,其实就是勒让德多项式(的一些变形)。

我们已经说了,球谐函数产生的基是相互正交的,我们有一对应函数 $F$,只用求出 $⟨F, Y_n⟩$,即 projection,求出了 SH 对应的系数。

即 $\displaystyle \iint_{\Omega}{F(\theta, \varphi)Y_n \ \mathrm{d} \theta \mathrm{d} \varphi}$,我们走 Riemann 积分的路,可以求出每一项,这就是我们预处理的结果。

Kulla Conty Approximation

我知道为什么闫老师这么讨厌最基本的 $\mathrm{albedo} + L_o$ 的方法,那个方法确实是在玷污人类的智慧。

而 Kulla Conty Approximation 确实~是非常的妙。

首先是,Kulla Conty 是对 Microfacet BRDF 的 Approximation,用于消除在 Roughness 极高时候的能量损失。

因为 Roughness 会导致发现分布变得更加不均匀,这样就会导致不同微表面之间的遮挡。但是我们并不会考虑遮挡后的弹射,所以我们需要一个“补偿”来消除这个遮挡带来的能量损失。 尽管这补偿有一些其他的办法,我们还是选择使用 Kulla Conty.

首先,我们考虑入射的 radiance 是 $1$. 那么我们写下来该处的出射的 radiance。

Kulla Conty 算法的那个 pre 的写法是比较神秘的,因为他的 $E$ 是指 Energy,在某个方向的大小。 所以它的 $E$ 其实就是我们所指的 $L$,我差点被这个忽悠瘸了。

这样吧,既然入射的是 $1$,那我们任意一个出射方向上都应该保留吧?所以我们考虑在白色的条件下,未经过 Kulla Conty 补偿的颜色就应该是 $E(\omega_o)$.

所以我们需要通过 Kulla Conty 补偿的部分就是 $1 - E(\omega_o)$。我们期待这么一个积分,

\[\int_{\Omega} \text{Kulla\_Conty}(f_r) \cdot 1 \cdot \cos \theta \, \mathrm{d} \omega_i = 1\]