一、理论
1. 反射率方程
\[L_o(p,\omega_o)=\int_\Omega f_r(p,\omega_i,\omega_o)L_i(p,\omega_i)n\cdot \omega_i d\omega_i \]反射率方程应该这样理解:
- 辐射radiance某个着色点或者光源位置附近单位面积(法向)从某个方向的单位立体角接受或者发射的功率。可以看出,radiance约定了方向和源(或者说目标),实际上我们是使用辐射radiance来作为描述光的功率传播的概念,通常的,我们把它绑定到光线上作为光线传播的属性。我们的一切计算都是基础radiance的。
- 辐照度irradiance是指空间中在单位面积(无法向要求)上的功率。
- 实际上,我们在研究辐照度时并没有在定义中强调他的方向性,只是在说明了他的空间分布特征,然而研究方向性是有必要的,这在下面会体现出来。显然的是,辐射radiance便是存在着方向性的辐照度irradiance,由前面的定义式可得关系如下:
- 在将功率的空间分布概念,即辐照度irradiance,拆分成了不同方向的辐射radiance之后,这就方便我们将在空间中分布的功率概念使用提供功率的源来解释,这样一来我们就可以为空间中分布的功率以他们的来源方向不同赋予不同而属性,事实上这是有价值的,因为在光的可观性方面,出射角和入射角是有很重要影响的因素。
- 我们应当这样来看待着色点:着色点会从空间中所有可观的光源那里(一般是半球空间)获得一个辐照度irradiance属性,进一步的正如前面所述,这个辐照度是由半球面内所有方向的radiance贡献的综合,在这之后着色点会将其辐照度向着所有的可发射方向(一般是半球空间)发射能量,每一个方向都会分配到一个radiance分量。然而,吸收和反射这两个过程并不是解耦的,即来自所有方向的radiance并不是首先综合成一个irradiance属性然后再去分配的。这是因为反射面材质的问题,反射光线与入射光线的方向存在关系,尤其是对于镜面反射或者有着glossy属性的镜面反射、以及折射而言,反射光线的方向相对于入射光线的方向是一个分布。因此,有必要探究来自不同方向的入射功率radiance,并考虑到他们的方向之后再去综合对某一个特殊方向的出射功率radiance的综合影响。
- BRDF便是描述出射功率相对于入射功率的关系影响的因子,它是着色点某个出射方向\(\omega_o\)的radiance对来自某个入射方向\(\omega_i\)的irradiance的微元比值,即:
- 考虑到radiance与irradiance都是单位概念,取微元比值是指输出radiance相对于输入irradiance的微分结果,这样就方便得到输出radiance的积分公式:
- 参考radiance与irradiance的关系,我们可以得到:
- 显然,这便是反射率方程。自然而然地,我们可以得出结论:反射率方程是用于描述某一个着色点p的向着某一个出射方向\(\omega_o\)的功率radiance,在考虑到出射光与入射光的角度关系对分布的影响后,对所有方向的入射功率radiance转化得到的辐照度irradiance取贡献因子BRDF之后,做积分的结果。
2.Cook-Torrance BRDF
\[f_r=k_df_{lambert}+k_sf_{cook-torrance} \]我们的BRDF是分成两个部分的,应该这样理解:
- 光照射到表面后,一部分会被直接反射出去,即镜面反射speculr部分,我们令这一部分占到的功率比重是\(k_s\)。
- 相应的,另一部分的比重就是\(k_f=1-k_s\)。另一部分是会被吸收到物体内部的光线,他们在物体内部不断弹射,一部分会被完全吸收转化为热能等,另一部会从入射点附近重新发射到外部,可以看到从一个着色点入射并吸收的这一部分光如果没有被完全吸收会从多个位置出射,这便是次表面反射。一般来说,我们并不关心次表面反射,直接使用漫反射来描述这个成分。
- 使用两个因子,就可以保证反射的光功率符合能量守恒了。
2.1 Lambert漫反射
- 前面提到,有\(k_d\)比重的入射光会发生吸收,最终的解决要么是完全吸收,要么是漫反射,那么我们如何描述这个过程呢?
- 首先,我们使用材质表面的颜色属性来描述完全吸收与漫反射的比重,这个思路是很直观的,材质对不同波长的光有着不同的反照率,因而会呈现出不同的满反射颜色,当我们使用RGB编码颜色时,一个RGB三通道的三个反照率自然就是漫反射成分在吸收部分中的能量比重了。很熟悉的,我们把这一个属性叫做,颜色color或者反射率Albedo。
- 进一步的,我们假设漫反射光照对所有半球面方向的出射功率是各向一致性的,所以我们在BRDF中不强调光线的方向,相应的,所有出射方向的radiance是均分这一部分的漫反射功率的。考虑到半球面的面积是\(\pi\),这也就是平均的系数了。
- 那么,结合这两个部分,被吸收的光功率即会发生漫反射的光功率,它的BRDF是:
or
\[f_{lambert}=\frac{Albedo}{\pi} \]2.2 Cook-Torrance镜面反射
- 前面提到,会有\(k_s\)部分的光功率有发生镜面反射的可能。这一部分的光照,我们将会使用微表面模型来描述。
- 我们在做渲染的时候,一般是使用三角形面作为基本图元,使用更细致的图元划分或者是贴图来实现凹凸效果。这些方法都不错,但是只是在模拟肉眼可观的凹凸现象时可行。实际上,我们在生活中观察到表面,即便是平滑到不必使用这些方法来实现凹凸效果(我们在之前将他们看作Glossy材质),也是存在着肉眼不可见的不光滑的,从物理的角度来看,所谓的镜面反射的Glossy现象就是由这引起的。考虑到这些微观的不光滑,然后来描述镜面反射的模型,便是微表面模型。
- 针对平面的不光滑,微表面模型致力于描述2种由此引起的效果:
- 表面不光滑即法线分布不均匀,那么就会存在Glossy现象,即反射光线不是理想镜面反射的集束光,而是光瓣。用于描述这一现象的是法线分布NDF。
- 表面不光滑就会存在自遮挡,同于描述这一现象的是几何项G。
- 在上面两个不光滑效果之外,微表面模型显式地给出了\(k_s\)比重,这一项是菲涅尔项F。
- 考虑到能量守恒,添加了标准化项。可以看到,这一项是与入射和出射方向相关的,因为对每一个出射方向的求解需要对所有入射方向做积分,而考虑到能量守恒有需要对所有出射方向做积分,所以这个项很直观。
- 最后,为什么他们是乘在一起的呢?首先,一部分光照可能会发生镜面反射(菲涅尔项),然后这一部分功率有一部分会被遮挡而只有一部分会成功反射(几何项),进一步的,发生反射的功率是存在方向上的分布的,只有一部分会朝着观察方向反射(法线分布),最后这一部分就是被观察到的功率。
- 可以看到最终反射出来的能量是小于输入能量的,而在BRDF中能体现出来,只有漫反射中被吸收的部分和镜面反射中被遮挡的部分是不会被计算出来的,既没有莫名其妙的能量计算进来,也没有莫名其妙的能量被忽视。这便是PBR的魅力。
2.2.1 法线分布函数 GGXTR NDF
- 还记得我们之前是如何实现Glossy效果的吗?我们直接使用半程向量与法线的内积作为评判指标。在法线分布函数中,我们仍然使用内积,但是会使用更复杂的方法来描述,我们会将内积作为计算单元,放入类似高斯分布这种衰减函数中。
- 此外,我们需要一个因子来描述Glossy效果的强度,很显然的这个因子就是粗糙度\(\alpha\)。这个粗糙度会影响衰减的快慢,在高斯函数中就是影响方差。
- 最后,我们的NDF是参考了余弦值和粗糙度的衰减函数。下面便是其中一种NDF,即Trowbridge-Reitz GGX NDF。
text