1. 符号定义
对于着色点 P,如下图所示,T 表示表面切向量,N表示法线,V表示出射方向,V‘表示入射方向,H 表示半程向量, 表示半程向量的投影:
各个角度及其对应的余弦的表示方式如下(之后会用到):
2. 反射模型简介
Schlick在文章中介绍了3种反射模型,在这里简单了解一下即可。
2.1 Cook-Torrance 模型
关于基于微表面的Cook-Torrance模型,其BRDF如下:
其中d + s = 1,分别表示表面diffuse反射率和specular反射率。 表示光线的波长中被diffuse反射的比率,可以定义表面颜色,即折射进入此表面并经过散射,未被吸收而重新出表面的部分波长。BSDF部分分母在Cook-Torrance的原文中使用 ,之后简化为4,此处使用4 ,应该是要和G项部分进行一个归一化处理。
由于要满足BRDF的能量守恒原则,则微表面D项在平面上的投影应该等于单位圆面积(此处临时使用一些目前通用的符号方便理解,不排除以后把前面的符号都改了!),
假设BRDF各向异性,则 ,上式可以化简为:
我们再令 D,F,G 三项使用其余弦项表示,即 ,再通过余弦项换元可以将上式简化为:
将角度符号变换为其余弦符号(参考第一节)之后,最后得到BRDF可以表示为:
2.2 He-Torrance-Sillion-Greenberg 模型
He等人提出了一个更加复杂且完全物理的BRDF模型,它考虑了光线的偏振(polarization)、衍射、干涉、表面电导率以及掠射角更小的粗糙度。如果不考虑偏振则其模型为:
这个表达式隐藏了很多模型复杂的细节,如D项细节就很劝退,但其与Cook-Torrance模型相比主要区别在于显式加入了宏观平面的Coherent reflection相关项, 表示表面粗糙度衰减系数。
2.3 Ward 模型
对于各向异性材质的模型比较少,Ward提出了一个简单的各向异性BRDF,其对于偏心角(excentricity)改变带有一个椭圆形的区别:
这个模型考虑了各向异性条件,通过 m 和 n 项定义不同的粗糙度控制表面划痕的水平和垂直程度,其 m 和 n 差别越大,各向异性表现越明显。
3. Unsatisfactory Points 不足
3.1 Constant weight
对于当时的BRDF,Schlick提出了三点不足,首先是关于BRDF不应该是diffuse和specular的常量权重的线性组合(d 和 s 项),由于入射角度的改变通常会改变BRDF的diffuse和specular的权重量,而不是一个常量,如下图中菲涅尔现象带来的权重改变(光线粗细表示能量比率):
涂过清漆的木地板在不同角度入射光的反射表现
对于同质的材质,也会因为粗糙度不同而带来权重改变,如下图展示的不同粗糙度表面:
diffuse和specular的连续变化
3.2 reemission of self-obstructed light
其次对于G项的运用由于忽略了间接反射,存在一个明显的能量损失,当时没有一个模型正确考虑了这些自遮挡带来的 1 - G 的间接反射的影响。
3.3 accuracy/cost ratio
最后也可能是最重要的,即精确度和开销的比例关系,通常来说经验模型缺失了物理性质但拥有一个较低的开销,而基于物理的模型能够做到物理精确但是开销巨大,但是在渲染管线其他部分所带来的误差通常会无视BRDf精确性带来的表现,例如如果使用低精度的光谱采样或方向采样,就没有使用高精度BRDF的意义。所以使用一个低开销而结果近似的算法来替换一些基于物理的算法是一个不错的解决方案。
4. Optimization by Rational Fraction Approximation 有理分式近似方法
4.1 一些思考
经典的优化算法有打表与插值方法,但这会带来存储开销,有计算表达式的泰勒展开式,但这仅在原点附近有效,使用截断泰勒级数则不能保证其大量分段的连续性。还有一种方法,是根据表达式的泰勒展开式,生成其有理分式并使用帕德近似。相比于单纯的多项式近似,帕德近似在远离原点的时候也能有一个较好的精度。但这种方法有两个限制,首先是必须要有函数的泰勒展开式,其次是不能满足函数的一些特性,例如对于在a到b上的分布函数f,定义函数满足 ,而这种近似方法几乎不能满足这个条件,造成数学上的不正确。
4.2 主要方法
Schlick提出了一种叫做有理分式近似(rational fraction approximation)的方法,不同于帕德近似方法,Schlick的方法使用泰勒展开式来获取分子和分母多项式,其想法是通过学习我们想要近似的函数并获得其 kernel 条件。
kernel 条件可以是函数的任何内在特征,包括其函数、导数、积分或其他相关函数,找 kernel 条件的通用方法是回答这个问题呢:对我而言每一个近似值都应该满足函数的那些特征?
当 kernel 条件找到以后,通过确定函数及其每一个 kernel 条件的近似值来简单获得有理分式的系数,对于n个条件,这给出了n个未知量与n个方程的方程组。
举例,用该方法去近似 函数,范围为 ,我们可以利用已知函数得到以下四个特征,这些特征会是每一个近似函数的关键:
这四个特征就是 kernel 条件,我们找一个包含四个独立参数(a,b,c,d)的有理分式,例如:
注意,此处不能使用(ax + b)/(cx + d)作为有理分式,因为这个表达式可以消去一项而变成三个独立参数,我们需要四个独立参数的有理分式。代入4个特征,从而得到一个方程组:
最终得到了一个关于 的近似表达式:
如下为原函数和近似函数的分布图,即周期为 的正弦函数,Schlick使用他们的误差计算方法(对一百万个随机点计算其准确值和近似值),得到的的相对误差 ,加速因子 。
左图:原函数 右图:近似函数
接下来我们将使用这种方法来近似F,G,D项。
5. Fresnel Factor 菲涅尔项
菲涅尔项表示表面specular反射率随着入射角度的变大而变大,在掠射角附近将会完全specular反射。对于一个非极化(无偏振)电磁波,菲涅尔公式为:
其中是出射光与半程向量的夹角的余弦项,可以得知 越大specular反射率越大, 表示折射率, 表示吸收系数。
菲涅尔项的一个特征是,任何波长的光线在掠射角入射都将会完全specular反射,此时出射光和半程向量夹角为90度,其余弦 ,得到 。
由于各种材质的 n 和 k项很少被测量出,所以很难在所有渲染环境中有一个通用的 F 形式,一些实验数据仅测算出可见光谱中单独某个波长的 和 值。但是许多材质在法线方向( )入射得到的菲涅尔项的光谱分布 (F0)已经被测量出来了,对于仅有的 数据,Cook和Torrance提出了一下的近似方法:
对于已测算出 和 的材质 ,和法线入射的情况 ,使用上述公式计算菲涅尔项。否则对于任意波长 ,使用公式 计算,这是一种插值计算的近似方法。
这种近似方法并不能解决数据缺失的问题,但加速了计算,因为完整的菲涅尔公式只会用平均n 和 k 项计算一次,但这依然制造了巨大的开销,需要做进一步优化。如下图表示测量得到的菲涅尔项分布(横坐标是入射角的余弦项 u),我们得知各种物质的分布曲线并没有太大的差别,曲线仅依赖于其在法线入射方向的菲涅尔项值。
从下到上:钻石、玻璃、铜、金的菲涅尔项
因此,可以使用kernel条件来获得一个仅依赖于 (即 )的近似表达式,条件如下:
从而推导出:
最终得到如下的分布,其相对误差 ,加速因子 。
左图:真实分布 右图:近似分布
6. Geometrical Attenuation Coefficient 几何衰减系数
使用Smith得到的G项公式可以表示为 ,经过推倒后得到:
其中 表示微表面斜率的RMS(cook-torrance中的符号表示方法,能用来表示粗糙度,可以看作Roughness),虽然 公式形式很复杂,但它的曲线很简单,所以我们可以使用如下的 kernel 条件来表示其特征:
从而推导出一个很简单的表达式(与UE4的 项仅在 k 的定义上不同):
如下图(横坐标是一个余弦项,这篇文章中的符号很容易弄错),除了 v = 1 附近有一些误差,其他地方都很接近,其相对误差 ,加速因子 。下图为m = 0.01,0.05,0.1,0.25,0.5的G(v)曲线:
左图:真实函数 右图:有理分式近似
7. Slope Distribution Function 斜率分布函数(法线分布函数)
对于当时的D项,仅Beckmann模型满足了能量守恒,且只依赖于 m 和 t :
其能量守恒条件显然是它的一个 kernel 条件,另一个被Beckmann发现的重要特征是对于 , 几乎为空。再加上 t = 1 时可以得到值,其 kernel 条件如下:
带有积分的条件会比较复杂,一个比较通用的方法是找一个带有 形式的有理分式,这样就能分析积分。因此推导出近似式:
关于m = 0.01,0.05,0.1,0.25,0.5的分布如下图,相对误差为 ,加速因子为 。
左图:Beckmann函数 右图:有理近似函数