0%

《全局光照》读书笔记(二)

《全局光照》第一章采样部分总结

采样与反走样数学基础

傅里叶变换与级数

对于任意的非周期函数有傅里叶变换

正变换:
$$
F(\mu) = \int_{-\infty}^\infty f(t)e^{-j2\pi \mu t}dt
$$
逆变换:
$$
f(t) = \int_{-\infty}^\infty F(\mu)e^{j2\pi \mu t}du
$$
利用欧拉公式可将正变换变为:
$$
F(\mu) = \int_{-\infty}^\infty f(t)cos(2\pi \mu t) - jsin(2\pi \mu t)dt
$$
对于任意的周期函数有傅里叶级数:
$$
f(t) = \sum_{n = {-\infty}}^\infty c_ne^{j\frac{2\pi n}{T}t}
$$
其中:
$$
c_n = \frac{1}{T}\int_{-T/2}^{T/2} f(t)e^{-j\frac{2\pi n}{T}t}dt, n=0,n=\pm1, n=\pm2,…
$$
傅里叶变换的实质是将空间域(spatial domain)或时间域(time domain)变换到频率域(frequency domain)。当一个函数被变换到频率域后,可以检测该函数是否具有最大频率。如果存在则该函数被称为带限函数(bandlimited function),这意味着可以检测函数的频率带宽(bandwidth)。

卷积

$$
f(t)*g(t) = \int_{-\infty}^\infty f(\tau)g(t-\tau)d\tau
$$

傅里叶变换的卷积性质:
$$
f(t)*g(t)\Longleftrightarrow F(\mu)G(\mu)
$$

$$
F(\mu)*G(\mu) \Longleftrightarrow f(t)g(t)
$$

采样定理

冲激函数(dirac function):
$$
\delta(t) = \begin{cases}
\infty\quad t=0 \\
0\quad t\neq 0
\end{cases}
$$

$$
\int_{-\infty}^\infty \delta(t)dt = 1
$$

冲激函数具有以下采样特性:
$$
\int_{-\infty}^\infty f(t)\delta(t-t_0)dt = f(t_0)
$$
由此,一个具有均匀间隔$\Delta T$的冲激串函数可以定义为:
$$
s_{\Delta T}(t) = \sum_{n=-\infty}^{\infty}\delta(t-n\Delta T)
$$
将此冲激串作用于连续函数f(t)则得到采样后的函数:
$$
\widetilde{f}(t)=\sum_{n=-\infty}^\infty f(t)\delta(t-n\Delta T)
$$
每个采样值由加权后的冲激“强度”给出,可以通过积分得到,即任意采样值$f_k$为:
$$
f_k=\int_{-\infty}^\infty f(t)\delta(t-k\Delta T)dt = f(k\Delta T)
$$
冲激函数傅里叶变换为:
$$
S(\mu)=\frac{1}{\Delta T}\sum_{-\infty}^{\infty}\delta(\mu-\frac{n}{\Delta T})
$$

频域结果为:
$$
\widetilde{F}(\mu) = F(\mu)*S(\mu) = \int_{-\infty}^{\infty}F(\tau)S(\mu-\tau)d\tau \
=\frac{1}{\Delta T}\int_{-\infty}^{\infty}F(\tau)\sum_{-\infty}^{\infty}\delta(\mu-\tau-\frac{n}{\Delta T})d\tau
\=\frac{1}{\Delta T}\sum_{-\infty}^{\infty}F(\mu-\frac{n}{\Delta T})
$$
由此可见,采样后函数的频率其实为原函数频率的周期重复,重复周期为$\frac{1}{\Delta T}$.

$\frac{1}{\Delta T}$被称为采样率(sample rate),为了保持对原始信号的重建能力,需要足够的采样率来保证$F(\mu)$的完整性。根据采样理论(the sampling theorem),对于一个带限函数$f(t)$其最大频率为$\mu _{max}$,它能够完全被一系列以$\frac{1}{(2\mu _{max})}$间隔采样的离散函数表示。也就是采样率必须大于或等于$2\mu _{max}$。

重建

平滑

卷积计算最本质也是最直观的特征是平滑,它通过对f的每个点考虑该点周围一定范围内的值对该点的影响来消除该点与周围环境的频率的快速变化。

重建

图中$H(\mu)$的定义为:
$$
H(\mu)=\begin{cases}\Delta T \quad -\mu _{max}\le\mu\le\mu {max}\
0 \quad\quad 其他\end{cases}
$$
当该函数乘以采样后的频域函数时,该函数将隔离以原点为中心的一个周期,即
$$
F(\mu) = \widetilde{F}(\mu)H(\mu)
$$
一旦得到$F(\mu)$就可以通过傅里叶逆变换得到原函数$f(t)$。此$H(\mu)$被称为一个低通滤波(low-pass filter),其傅里叶逆变换为辛克函数:
$$
sinc(x) = \frac{sin(\pi x)}{\pi x}
$$
所以重建后的函数$f(t)$可以表示为:
$$
f(t)=\sum
{n=-\infty}^{\infty}f(n\Delta T)sinc[(t-n\Delta T)/\Delta T]
$$
由于辛克函数在无限空间连续的,所以当它划过$\widetilde{f}(t)$上的每一点时会在辛克函数的整个定义域上求积分,这个积分值是考虑$\widetilde{f}(t)$所有点的平滑效果得来的,因此能够完美还原$f(t)$。

重采样

程序中预先采样数据(图像或场景的某些离散的表示空间结构数据等)都是具有一定分辨率,当程序需要在不同分辨率下使用这些数据时就需要对它们进行重采样(resampling)。

最近邻插值(nearest-neighbor interpolation)

直接选择离重建点最近的样本值作为内插值。

双线性插值(billinear interpolation)

基于采样点的位置在x轴和y轴上线性地插值。双线性插值只考虑采样点周围4个2X2像素点。

双三次内插法(bicubic interpolation)

考虑周围16个4X4像素点,滤波函数为:
$$
W(x)=\begin{cases}(a+2){|x|}^3-(a+3){|x|}^2+1 \quad, |x|\le 1\
a{|x|}^3-5a{|x|}^2+8a|x|-4a \quad,1<|x|<2\
0\end{cases}
$$

反走样

渲染中通常使用过采样(oversampling)的反走样技术,它通过使用比输出分辨率略高的采样率对原始函数进行采样并对高分辨率的样本函数使用滤波器进行平滑然后重采样得到输出分辨率的图像。

全屏反走样(full-scene antialiasing,FSAA)

FSAA对场景以一个更高的分辨率进行渲染,然后对相邻的采样点取平均值得到最终图像。FSAA可以对每个像素范围内的子采样点采用不同的分布。

多重采样反走样(multisample antialiasing,MSAA)

MSAA的思路为:超采样技术对每个子采样点的着色,深度及位置等都需要单独计算;对于由几何图形光栅导致的走样,实际上我们只对其可见性函数进行采样即可,所以将可见性函数从着色当中分离出来,这样对于每个像素点只需要计算一次着色。

在图形渲染管线的光栅化阶段,光栅化器对每个像素生成多个子采样点,并计算每个子采样点的深度和模板值,而对于颜色值光栅化器对每个像素只调用一次像素着色器。

质心采样反走样(centroid-sample antialiasing,CSAA)

CSAA进一步将像素点的覆盖率从颜色/深度/模板值当中分离出来,使其内存占用和数据传输的宽度占用都得到降低。CSAA用一个二进制结构的数组蒙版(bit mask)表示覆盖率,这个覆盖率比子采样点具有更高的分辨率,在光栅化阶段,光栅化其首先投影几何图形到该蒙版以计算覆盖率,然后对子采样点进行采样计算深度,模板及颜色值,其中计算颜色值的时候其覆盖率直接由蒙版提供。