这里将纯方向光源定义为来自无限远处、面积无限大、且发出的光线方向只有唯一方向的光源。例如日光。

常见的路径追踪算法中,为了避免随机采样导致小光源难以被射线击中的问题,可以使用直接光源采样(Direct/explicit light sampling)方法。

这种方法将一个点的Radiance分类讨论为两种:

  1. 直接光照,对光源表面进行积分,直接计算出光源对Radiance的贡献
  2. 间接光照,对立体角进行积分,递归的计算出非光源对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来定义。其中,前者使用本文最后变换得到的渲染方程进行计算,后者通过原始的渲染方程进行计算。

参考文献:

  1. An Introduction to the Dirac Delta Function and Applications in Physics
  2. Dealing with point lights and exact reflections in path tracing
  3. How are point and pure directional lights sampled in an unbiased path tracer?
  4. brdf为什么要定义为一个单位是sr-1的量?

留下评论