Yan's Studio.

Cook-Torrance的BRDF

Word count: 2.2kReading time: 7 min
2021/04/02

Cook-Torrance BRDF的定义:

首先让我们先看看如何计算出

3.1 漫反射项推导

在很久之前谈光栅化的时候就提及过,漫反射会均匀的向每个方向反射

因此,漫反射的BRDF一定是一个常数。假设入射光是均匀且遍布整个半球方向,可以得到如下方程:

(根据定义, 积分过程省略) 由于假设入射光是均匀且遍布整个半球方向,所以与方向无关,且等于,最终约去两边,得到结果:

但有一点要注意的是,这里并没有考虑能量被吸收,将反射率考虑进来之后,得到最终的漫反射BRDF:

这里的可以类比光栅化当中的漫反射系数去理解,本质就是一个3维向量,含有物体表面的颜色信息。

3.2 镜面反射项推导

漫反射项的形式简单且比较容易理解,但是对于镜面反射项,其形式则要更加高级一点:

看起来确实有些唬人,但是不要急,让我们先简单的解释一下式子当中各项参数,之和再一步步的进行详细阐述: 其中为反射方向(观察方向),为入射方向,宏观表面法向微平面法向
分子上的为3个不同的函数:
函数D:法线分布函数(Normal Distribution Function),其代表了所有微观角度下微小镜面法线的分布情况,粗糙表面法线分布相对均匀,光滑表面法线分布相对集中 (这种解释可能会有些抽象,后面会给出更加直观的物理上的解释)
函数G:几何函数(Geometry Function),描述了微平面自遮挡的属性。当一个平面相对比较粗糙的时候,平面表面上的微平面有可能挡住其他的微平面从而减少表面所反射的光线。
函数F:菲涅尔方程(Fresnel Rquation),描述了物体表面在不同入射光角度下反射光线所占的比率
可以看出无论是几何函数G,还是菲涅尔方程F,都是由于观察方向,入射方向的不同所导致的只有部分光线能够被反射

因此先假设没有光线会为上述两个函数产生损失(即二者都=1),方便我们进行BRDF推导。
在上文中,函数被解释为微观角度下微小镜面法线的分布函数,其函数接受一个参数为,即微平面的法线向量,更直观的来说,D(h)的物理含义为所有法向为的微平面的面积,没错就是面积,你没有看错,只不过我们要说明的是什么条件下的,法线方向为的微平面面积,需要加上限制:
(1) 第一,我们所关注的区域仅仅是一个着色点,或者说一个微分面积元,因此所指的应该是单位面积下,所有法向为的微平面的面积。
(2) 第二, 微平面的法线是一个离散数值,而微平面法线分布是连续的,因此是几乎不可能精确的找到法线为某个固定值的微平面的,因此为完善第二个限制,即加上每单位立体角,使其变成一个范围,此时则变成了每单位立体角所有法向为的微平面的面积。
(关于第二点限制可能有些不太好理解,其实这可以类比连续型随机变量取一点概率为0,道理是一样的)
好了,加上这两点限制之后,便得到了的真正的物理含义,即每单位面积,每单位立体角所有法向为的微平面的面积。接下来当确定了观察方向和入射方向之后,我们所真正在乎的能对镜面反射做出贡献的只有法线为的微平面,如下图所示:

只有图中红色的微平面才能对镜面反射做出贡献,利用刚刚得到的关于的物理含义,不难计算得到,所有红色微平面面积
(本文以下用代替入射方向代替观察方向代替微平面法向)
那么根据该面积可以计算出入射的辐射通量

(在入射光线方向的投影垂直面积,为入射光线与微平面法线的夹角)
因为此时不考虑菲涅尔项以及几何函数所带来的光线损失,所以

进一步,根据辐出度radiance定义,计算得

最后由BRDF定易得

其中,是入射光线与宏观法线方向的夹角,是出射光线与宏观法线方向的夹角,是入射光线与微平面法线方向的夹角。
最后一步,只需要找到的比值,就可以成功推导出镜面反射的BRDF了。那么的从直观角度去看到底是指什么呢?很简单,如下图所示:

首先固定入射方向,微分立体角是一个很小的范围,那么这样一个很小的范围所对应的反射角自然也是一个很小的范围,形象的来看,就是转动平面得到所有微观法线在范围之内的平面,通过这些微平面,所得到的反射范围。那么如何求得这样一个比值呢,以入射方向轴负方向,建立球面坐标系如下:

(嗨呀,画的真丑,凑合看看吧)
根据图中的单位球面坐标系以及标注的角度,不难得出的球面坐标为(1,),则不难计算出微分立体角

同时的球面坐标为(1,2),因为角变为两倍,那么对于来说角度的微分变化应该也为两倍,因此计算得到

此时已经知道了,那么

将此关系代入上面的镜面BRDF得到:

最后将我们一开始忽略掉的菲涅尔项与几何函数重新加入

至此就已经完成了Cook-Torrance BRDF的所有推导了。
**tips:**还有一点有关可以注意的是,对于法线分布函数的设计应该满足

为微平面法向与宏观法向的夹角) 从几何角度很容易解释,因为是着色点(微分面积元)内所有法向为的微平面的面积,乘上则代表将其投影至宏观平面上,将所有的法线方向的投影面积都加起来,自然还是原来的微分面积元保持不变,同时将上式子进一步化简可得:

可以验证一下广泛使用的GGX (Trowbridge-Reitz)法线分布函数:

验证如下:

3.3 菲涅尔方程与几何函数的补充

最后再简略的讲一下菲尼尔方程和几何函数对光线损失的影响吧。

3.3.1 菲涅尔方程

菲涅尔方程是为了描述物理世界当中,观察角度与法线夹角越大反射程度一般越大的一种情形,但是精确计算计算消耗较大,一般用Fresnel-Schlick近似法求得近似解

表示平面的基础反射率,它是利用所谓折射系数(Indices of Refraction)计算得出的。越是朝球面掠角的方向上看(此时视线和表面法线的夹角接近90度)菲涅尔现象就越明显,反光就越强。但是根据折射系数只能算出电介质(非导体)的为了兼容导体,一般会将提前计算出来,再代入方程:

关于菲涅尔方程的详细介绍,我在光线追踪笔记中的4.2,4.3节中由详细提及,这里就不再重复了。
https://zhuanlan.zhihu.com/p/144403005zhuanlan.zhihu.com

3.3.2几何函数

几何函数G是为了表示微平面的自遮挡从而引起的光线损失,一般会出现如下两种的遮挡情况

左边一幅图中是入射光线无法照射到一些微平面,这种情况称为Shadowing,右边图中是反射光线无法正常到达人眼,称为Masking,而几何函数正是为了模拟出这两种情况所导致的光线所示,在UE4中采用了Schlick-GGX来进行建模:

(一般来说表面粗糙程度Roughness越大,遮挡程度越大)

CATALOG
  1. 1. 3.1 漫反射项推导
  2. 2. 3.2 镜面反射项推导
  3. 3. 3.3 菲涅尔方程与几何函数的补充
    1. 3.1. 3.3.1 菲涅尔方程
    2. 3.2. 3.3.2几何函数