Chapter 9 – Physically Based Shading 基于物理的着色

9.5 Fresnel Reflectance(菲涅尔反射率)

在本章的第一小节中,我们学习了光与各种介质的交互。在第三小节中,我们学习了如何通过数学等式来表示这些交互:BRDF以及反射率等式。现在我们将具体到某一特定的现象,并对其进行量化,这样我们就能在着色模型中使用我们所学习的知识。首先还是学习平面的反射。

一个物体的表面指的就是物体本身与周围介质(特别是空气)的交接处。光线与两种物质交接处的交互满足Fresnel equation(菲涅尔等式),其由Augustin-Jean Fresnel(1788-1827)提出。菲涅尔等式的前提是平面满足几何光学的假设。换句话说,换句话说,物体表面在1个光波波长到100个光波波长的范围内不会有任何不规则性。小于一个光波波长的不规则性则不会影响光线,而大于100个光波波长的不规则性则被认为倾斜了物体表面且不会影响局部的平整性。

平面上的入射光线将被分为两个部分,反射以及折射。反射光的方向(由向量ri表示)与物体表面法线n所形成的夹角(θi)等于入射方向ln形成的夹角,如下图所示。

反射光的数量(作为入射光的一部分)由Fresnel reflectance F(菲涅尔反射率)表示,其取决于入射角度θi

正如我们在第一小节学习的,折射以及反射会被平面两边的物体的折射率所影响。在本小节中,我们仍然会使用这一概念。n1代表物体表面上方的介质的折射率,也就是光线入射与传播的空间,而n2表示物体本身的折射率,也就是折射光线传播的空间。菲涅尔等式描述了F与θin1n2之间的关系。

9.5.1 外部反射

所谓的外部反射就是External reflection,其表示n1n2。换句话说,光源所在的空间内的折射率较低。最常见的情况是,其空间内充满了空气,而空气的折射率大约为1.003。为了便于计算,我们假设n1=1。另一种相对的情况,就是光线从物体传播到空气,其被称为internal reflection(内部反射)。我们将在之后的小节中学习。

对于一种介质,菲涅尔等式可以转换为一个反射率函数F(θi),只有入射光的角度才会影响反射率。原则上,F(θi)的结果表示可见光谱。对于渲染来说,该函数的结果是一个RGB向量。函数F(θi)有下列特性:

  • θi=0时,光线垂直于物体表面(l=n),F(θi)的值表示介质的一种属性。该值,F0,可以认为是这种介质的镜面反射的颜色。θi=0的这种情况被称为normal incidence(垂直入射)
  • 随着θi的增加,光线将以更大的倾斜角撞击到物体的表面,F(θi)的值也会增加,直到θi=90返回的RGB向量的三个通道都为1(也就是白色)。

下图基于不同的介质以不同的方法展示了F(θi)函数。我们可以看到其曲线并不是线性的——其返回的结果直到θi=75时才会有一定的变化并且迅速变为1。

上图展示了三种材质的external reflection的菲涅尔反射率F,从左至右分别为玻璃,铜和铝。顶部以三维图标表示了F的函数,分别是波长和入射角。第二行则展示了随着入射角而变化的F,同时我们将光谱值转换为RGB向量并以不同颜色的曲线代表一种颜色通道。第三行则展示了RGB三个通道的值随着入射角的正弦而改变,同时我们使用x轴来表示菲涅尔反射的颜色。

在形成镜面反射时,射出的光线或者说视野角度与入射角度相同。这意味着物体表面位于入射光线的倾斜角也位于进入camera的光线的倾斜角。因此即使反射率增加,我们主要看到的也是物体的边缘。此外,物体表面反射率最高的部分经过camera的透视转换之后其占有的像素将会非常少。为了展示菲涅尔曲线与我们所能看到的物体表面的关系,请参上图中的底部部分。我们使用sin(θi)作为坐标轴而不是直接使用θi其原因如下所示。

物体表面越是倾斜于camera,那么根据camera的透视原理,其看上去越小。而缩小的程度与向量v和向量n的夹角的正弦值成比例(对于镜面反射,入射角等于射出角)。因此,我们在展示菲涅尔反射率的图表中,会使用入射角的正弦值作为坐标轴。

从现在开始,对于菲涅尔等式,我们将使用F(n,l)而不是F(θi)以强调菲涅尔等式中的向量。我们之前提到θi就是向量n与向量l的夹角。当菲涅尔函数被作为BRDF的一部分时,我们通常会使用另一个向量来替代向量n。我们将在第八小节中学习这一方面的知识。

由于倾斜角导致的反射率的增加,这一现象通常被称为Fresnel Effect(菲涅尔效应,一般在计算机渲染领域才这么称呼)。对于菲涅尔效应,我们通过手头的设备就能验证,只要你拥有一个手机与一台显示器即可。我们将手机屏幕作为镜面,反射显示器中的图像,不断翻转手机屏幕,我们可以看到,当我们的视野几乎与手机屏幕平行且手机屏幕几乎垂直与显示器时,手机屏幕所反射的画面最为清晰。

除了菲涅尔效应自身的复杂性,菲涅尔等式自身也有一些难于在渲染中应用的缺陷。因为其需要可见光谱的折射率作为因子,而这些值可能是复数。上图中的曲线则展示了一种更简单的基于特定反射颜色F0的方法。Schlick进一步使用下列函数对菲涅尔反射率进行模拟:

上述等式实际上是在白色与F0之间进行插值。虽然其运算较为简单,但是其模拟的效果非常准确。

下图我们展示了几种材质,其与Schlick曲线有着较为明显的偏差,在返回的颜色变为白色之前有着明显的“下沉”。而我们之所以选择这些材质作为例子,正是因为其实际的反射率与Schlick模拟的结果有着很大的偏差。一个解决办法是使用Gullbrandsen的模拟等式。其模拟结果更接近金属材质的菲涅尔等式,虽然该模拟等式的开销大于Schlick。更简单的解决办法是直接修正Schlick的模拟等式,对于等式最后的幂运算,我们不使用5而使用一个更大的值,这样就能改变曲线的斜率以接近原本的菲涅尔等式。

上图表示,在外部反射的情况下,菲涅尔反射率与Schlick模拟的比较。上半部分的三种材质,分别为我们之前使用的玻璃,铜和铝。下半部分的三种材质分别为铬,铁以及锌。图标中的实线表示完整的菲涅尔等式所形成的曲线,而虚线则表示Schlick的模拟等式。每一张图标下方的两个色块也分别表示完整的菲涅尔等式的反射率和Schlick模拟的反射率。

当我们使用Schlick的模拟等式时,F0是唯一控制菲涅尔反射率的参数。由于F0是一个范围[0,1]的实数,因此其适用于颜色值与贴图。此外,我们还可以通过现实世界中的材质作为设置F0的参考。折射率也能用于计算F0。一般我们会假设n1=1,以表示空气的折射率,同时我们会使用n(并不是n2)来表示物体的折射率。而F0的计算等式可以转换为:

即使对那些折射率为复数的材质(例如,金属材质),我们仍然可以使用上述等式来计算F0的值。如果某一材质的反射率在可见光谱范围内的变动非常大,那么我们首先需要在一定的波长范围内对折射率进行采样以此求出更准确的F0,之后再将光谱向量转换为RGB的值(具体的转换方法,请参考第八章第一小节中提到的Colorimetry,色度)。

在某些应用中,我们会使用一个更为泛用的Schlick模拟等式:

上述等式能够控制菲涅尔曲线在90°处的颜色(原始的Schlick模拟等式,我们默认F90=1)以及该区域内曲线的斜率。该等式使得美术能够更好的控制菲涅尔效应的外观表现,同样其也能帮助我们使Schlick模拟等式更符合物理规律。同样,将F90设置为某一种特定的颜色而不是白色能够更好地使菲涅尔效应与材质本身相匹配。

9.5.2 菲涅尔反射率

根据材质本身的光学属性,我们将它们分为三类,dielectrics(绝缘体);金属(导电体);半导体(其介于绝缘体与金属之间)。

绝缘体的菲涅尔反射率

现实生活中大多数材质都是绝缘体——玻璃,皮肤,木头,毛发,皮革,塑料,石头,混凝土等等。水也是绝缘体。而现实生活中的水,其导电性是因为水中含有杂质。绝缘体的F0(法线与光线向量的夹角为0)非常低——通常为0.06或者更低。由于在垂直入射时的反射率非常低,所以菲涅尔效应在绝缘体上非常容易发现。在可见光谱范围内,绝缘体的光学属性并不会有有较大的变化。生活中几种常见的绝缘体的F0如下表所示。这些值都是标量而不是RGB颜色值,在可见光谱范围内,F0并不会有太大的变化。为了便与理解,下表包含了F0的线性值以及通过sRGB转换后的编码值(8位,一般来说这一类变量会用于贴图软件)。

对于其他绝缘体的F0,我们可以参考上表中相类似的材质。对于那些未知的绝缘体,我们可以使用0.04作为默认值。

一旦光传入绝缘体,其将会被进一步散射或者吸收。我们在第九小节将学习这一过程。如果材质是透明的,那么光将继续向前知道其从物体内部撞击到物体的“表面”,这就是所谓的内部反射。

金属的菲涅尔反射率

金属拥有较高的F0——几乎都是0.5或者更高。有些金属的光学属性在可见光谱的范围内有着较大的变化,这也导致了其反射率是一个颜色值。下表展示了某些金属的F0

与绝缘体的反射率表相同,上表也同时拥有线性值以及8位sRGB编码值。但是,上表中我们的F0都是颜色值,这是因为许多金属材质的菲涅尔反射都带有颜色。而这些线性值,或者说这些RGB值都使用了sRGB(Rec.709)标准下的基准色。从上图中,我们可以看到,金子(Gold)拥有非常特别的F0值。它的反射率拥有非常强的颜色行,其红色通道略微大于1(其略微超过sRGB标准,所以我们将其记作1),同时其蓝色通道的值非常低(其是上表中唯一小于0.5的一种材质)。

我们之前提到金属材质会立刻吸收传入其内部的光,所以金属并不会展现出subsurface scattering(物体内部的散射)和透明特性。我们所看到的金属的颜色都来自于F0

半导体的菲涅尔反射率

半导体的F0介于最亮的绝缘体以及最暗的金属之间,如下图所示。实践中,我们很少会渲染这一类物质。所以在一般我们不会将现实世界中的物质的F0设置在范围0.2到0.45之间,除非我们故意去模拟一些非现实的材质。

水里的菲涅尔反射率

在我们学习外部反射时,假设了我们所绘制的物体表面被空气所覆盖。如果并不是这样,那么反射率将会改变,因为反射率取决于两种介质的折射率的比例。如果n1=1的假设条件不成立,那么我们需要将之前的反射率等式进行一定的修改:

一般来说,最为常见的n1≠1的情况是我们绘制水下的场景。由于水的折射率大约为空气的1.33倍,所以在水中时F0的值也将改变。其对于绝缘体的影响更大,如下表所示。

参数化的菲涅尔反射率

通常我们会使用参数将镜面反射的颜色F0和漫反射颜色ρss相结合(在第九小节中我们将学习漫反射)。之所以使用该参数是因为人们观察到,金属并不能生成漫反射的颜色而绝缘体只有几组有限的F0。该参数包括一个由RGB向量表示的物体表面颜色值csurf和一个标量参数m(m一般被称为金属度)。如果= 1,那么F0将被设置为csurf而ρss将被设置为黑色(也就是三个通道都为0)。如果m = 0,那么F0将被设置为绝缘变量(其是一个常量或者由一个额外的参数控制)而ρss将被设置为csurf

“metalness(金属度)”这一参数第一次出现在Brown University所使用的早期着色模型,而该参数第一次真正意义上的实际使用则出现在Pixar的电影Wall-E中。之后,Burley在着色模型中加入了额外的标量参数“specular(镜面反射)”,以此将绝缘体F0控制在一定的范围内。这一种参数化设置同样被虚幻引擎所采用,EA的寒霜引擎也使用了类似的参数化模式,但是略有不同,其绝缘体材质所使用的F0更多。

上述引擎之所以使用金属度这一参数而不是直接使用F0和ρss,其目的是为了更便于美术使用,同时也为了节省贴图。在使命召唤:无限战争中,开发者运用了另一种不同的方法来使用这个参数。美术直接为F0和ρss绘制贴图,这些贴图将以压缩的形式转换为金属度参数。

使用金属度参数也存在一定的瓶颈,其无法表现某一些材质,例如那些F0为RGB颜色值的绝缘体。此外,介于金属与绝缘体之间的物体也会有一定的问题。

参数化的金属度被广泛使用,另一个原因是现实世界中的材质的F0都大于0.02,除非使用特殊的图层处理。

9.5.3 内部反射

虽然在渲染中,我们更多地碰到的是外部反射,但是内部渲染有时也非常重要。当n1 > n2时,内部渲染就会产生。换句话说,当光在透明物体的内部运动时从“内部”碰到透明物体的表面之后发生的反射就是内部反射。如下图所示。

同时,根据我们之前学习的Snell’s law(斯涅尔定律),如上述等式所示,sinθt > sinθi。由于这两个角度都位于0°到90°之间,这也意味着θtθi,如上图所示。而外部反射则正好与此相反,也就是说θt < θi,因此我们永远能够找到一个有效的θt使sinθt位于范围0到1之内。但是在发生内部反射时,其不适用。因为根据Snell’s law,如果θi = 90°那么sinθi = 1,而sinθt 就应该大于1,这显然是不可能的。因此存在一个critical angle θc,如果θi大于该角度,那么θt也就不存在,也就是说所有的入射光线都被反射了。这一现象被称为total internal reflection(完全内部反射)

菲涅尔等式是对称的,也就是说,即使我们交换场景中的入射向量和穿越向量(折射光线所表示的向量),反射率仍然保持不变。结合Snell’s law,菲涅尔等式中的对称性意味着内部反射的F(θi)曲线类似于外部反射曲线的“压缩版本”。对于内部反射或者外部反射,F0的值仍旧相同,但是对于内部反射来说当θi等于θc时反射率达到最大而不是90°,如下图所示,同样我们可以看到内部反射的平均反射率高于外部反射。这就是为什么气泡在水面以下看上去非常明显。

内部反射只会发生在绝缘体中,因为金属与半导体将会快速吸收其介质内部传播的光线。同时,由于绝缘体的折射率都是实数,我们可以直接通过反射率或者F0来计算critical angle。

在之前的小节中我们使用了Schlick模拟等式运用于外部反射。其同样适用于内部反射,只需要将向量n与向量l的点乘替换为向量t与向量-n的点成即可。

留下评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据