这里将纯方向光源定义为来自无限远处、面积无限大、且发出的光线方向只有唯一方向的光源。例如日光。
常见的路径追踪算法中,为了避免随机采样导致小光源难以被射线击中的问题,可以使用直接光源采样(Direct/explicit light sampling)方法。
这种方法将一个点的Radiance分类讨论为两种:
- 直接光照,对光源表面进行积分,直接计算出光源对Radiance的贡献
- 间接光照,对立体角进行积分,递归的计算出非光源对Radiance的贡献
通过这种方式,即可避免小光源难以被命中的问题。
但是这种方式只适用于面积有限的非方向光源,而对于纯方向光源来说,无法通过对光源表面进行积分来进行计算(因为正如上文所说,纯方向光源是无限大且方向唯一的)。
为了求解纯方向光源的直接光照,我们先来看一下渲染方程的定义:
\[L_r(x, \omega_o)=\int_{\Omega}f_r(x, \omega_i, \omega_o)L_i(x, \omega_i)(\omega_i\cdot n)d\omega_i\]公式中各项的定义与Wiki一致(本文省略了波长、时间等无关变量)。
其中,BRDF项的定义为:
\[f_r(x, \omega_i, \omega_o) = \frac {dL_r(x, \omega_o)} {dE_i(\omega_i)} = \frac {dL_r(x, \omega_o)} {L_i(x, \omega_i)(\omega_i\cdot n)d\omega_i}\]需要注意,$dL_r(x, \omega_o)$的定义为$x$点在$\omega_o$方向的Radiance在$\omega_i$上的微分,因此其微元同样为$d\omega_i$。
由于纯方向光只具有唯一方向,因此只在该方向上能够给$x$点带来Radiance,因此$L_i$函数满足:
\[\begin{equation} L_i(x, \omega_i)= \begin{cases} 0& \omega_i \neq \vec d\\ k& \omega_i = \vec d \end{cases} \end{equation}\]其中,$\vec d$代表纯方向光源的方向,$k$为常数,代表该纯方向光源带来的Radiance。
然后根据$L_i$的定义,可以将这种情况下的渲染方程进行如下变换(主要原理为:由于$L_i$仅在$\vec d$处不为0,因此可以将积分中其他函数的$\omega_i$带入为$\vec d$):
\[\begin{eqnarray} L_r(x, \omega_o)&=&\int_{\Omega}f_r(x, \omega_i, \omega_o)L_i(x, \omega_i)(\omega_i\cdot n)d\omega_i \\ ~&=&\int_{\Omega}f_r(x, \vec d, \omega_o)L_i(x, \omega_i)(\vec d\cdot n)d\omega_i \\ ~&=&f_r(x, \vec d, \omega_o)(\vec d\cdot n)\int_{\Omega}L_i(x, \omega_i)d\omega_i \\ ~&=&f_r(x, \vec d, \omega_o)(\vec d\cdot n)\int_{\Omega}L_i(x, \omega_i)d\omega_i \end{eqnarray}\]同时由于光源必定对Radiance有贡献(不考虑遮挡),因此必有:
\[L_r(x, \omega_o)\neq 0\]进一步有:
\[\int_{\Omega}L_i(x, \omega_i)d\omega_i \neq 0\]而由于$L_i$仅在单点非0,因此$L_i$在该点为无穷大,即$k=\infty$,综上可以看到,$L_i$实际上是一个形式如下的狄拉克δ函数:
\[L_i=m\delta(\omega_i - \vec d)\]根据狄拉克δ函数的性质有:
\[\int_{\Omega}L_i(x, \omega_i)d\omega_i = m\int_{\Omega}\delta(\omega_i - \vec d)d\omega_i = m\]又由于Radiance的单位为$\frac W {m^2 sr}$,立体角的单位为$\frac 1 {sr}$,因此$m$的单位为$\frac W {m^2}$,与Irradiance相同。
最终得到的纯方向光渲染方程为:
\[L_r(x, \omega_o)=f_r(x, \vec d, \omega_o)(\vec d\cdot n)m\]这里$m$即代表了光源对$x$点的Irradiance。需要注意,由于Irradiance与距离有关,因此在实际定义光源的Irradiance时,还需要考虑光源到$x$的距离$l$,例如将$m$定义为光源在单位距离上的Irradiance,那么应该将公式修改为:
\[L_r(x, \omega_o)=f_r(x, \vec d, \omega_o)(\vec d\cdot n)\frac m {l^2}\]综上,为了处理纯方向光源,这里需要引入另一种光源的定义方式:即通过Irradiance定义纯方向光源。而体积光源则通过Radiance来定义。其中,前者使用本文最后变换得到的渲染方程进行计算,后者通过原始的渲染方程进行计算。
参考文献:
留下评论