1. Shading from Envionment Lighting -- Split Sum
- 使用IBL(image based lighting)做光照积分,不考虑visibility。
- 可以使用蒙特卡洛积分,但是需要做sampling,所以很慢。一般使用sampling的手段尽量避免在RTR中使用。
- 如果BRDF是glossy则support小,如果diffuse则smooth,则BRDF可以近似
- 则黄色框中被拆出的部分是对环境光的滤波Prefiltering。BRDF积分区域越大则滤波范围越大。可以采取MIPMAP来实现。在有计算需求的时候只做查询不做计算,不需要对光照做采样。
- 可见,只需要在镜面反射的方向查询MIPMAP的prefiltering后的某个值。对于漫反射而言,则是normal方向。
- 但是第二部分的采样积分尚未解决。
- 对于微表面,其BRDF如下,主要关注菲涅尔项与法线分布。
- 菲涅尔项可以近似为一种指数分布,与基础反射率R0和入射角度theta(在RTR中入射角、出射角、半角可以看做相同)两个变量参数有关。而在NDF项中,法线分布可以看作一种类似高斯的分布,同样的与alpha(标准差,即材质的diffuse或glossy程度)与thetah(halfvector与法线夹角,可以从入射角得到,可看作一个变量)。因此有三个变量,如果采取预计算就是一个三维预计算,还是比较复杂。
- 将R0从菲涅尔项中拆出来,那么BRDF积分就消除了对基础反射率的依赖。
- 因此,只考虑alpha与theta两个参数的二维分布,就可以得到两张二维纹理。可以将其保存在一张纹理的两个通道中。在计算时直接查询就可以了,那么消除了采样。
2. Shadow from Environment Lighting
3. Spherical Harmonics 球面谐波
- 定义在球面上的二维基函数,具有不同的频率,每种频率下具有不同的基函数。l越大,频率越高,对于不同的l,基函数有\(2\times l+1\)个,在不同的l上定义了编号-l~l,相应的前n阶有\(n^2\)个基函数。
- 通过product integral得到基函数的系数,即projection投影。相应的,得到系数之后可以反向恢复;一般的采取前几阶的基函数来做恢复,相当于丢弃了更高频的部分。一般的选中阶的基函数都会使用。
- 将diffuse的BRDF投影到球面谐波上只在低频部分(三阶)有明显的值。因此无论环境光多么复杂,其与diffuse物体的BRDF作用时,只有低频部分有明显的价值。
- 那么,只考虑使用球面谐波的低频部分来描述环境光照。对于diffuse材质,只需要使用前三阶来表示就可以了。
4. Precomputed Radiance Transfer(PRT)
- 将三个部分都做成问纹理,但是每一个shading point都需要做计算。
- 先拆成两部分,即光照与其他。再然后将lighting表示成基函数的表示。认为每个light transport的部分是不变的,即每个shading point的属性,可以预计算,作为一个球面函数。
- dffuse情况下,BRDF是一个常值,可以提取出来。然后将light表示成球面基函数形式。相应的积分结果就是lighttransport的基坐标,这些基座标是常数,可以被预计算。因此,对于diffuse,只需要预计算出lighting的基系数,然后提取出预计算的参数,并作点乘。但是问题在于,light transport固定意味着visibility固定,即场景中的物体是固定的。此外,如果光源变化,预计算值也会变动,即光源也不可以变化。
- 基函数的性质。SH支持旋转,即旋转原始函数只需要通过旋转基函数来实现,而SH基函数在旋转之后不再是基函数,但是可以被同阶的基函数线性组合来描述,因此,基函数旋转只是在修改同阶基函数的系数。
- 将球面函数变换成基函数系数,只需要保存一个张量。
- 到目前为止,环境光照与shadow都实现了,但是全局光照还没有考虑进去。
- 预计算过程可以通过随机光线实现,可以花费大量时间。