reference :《real-time rendering 4》
基于物理的渲染即计算沿着视线进入相机的光照辐射。如果不考虑吸收或散射的介质,则进入相机的辐射等于离开相机方向上最近物体表面的辐射:
上式中,p 是视线与最近物体的交点,v是视线向量(指向相机),c是相机方向, L代表辐射。
因此,我们只需计算。此处,我们仅关心局部反射,即将光线重新指向当前着色点的外部,而不考虑透射和全局此表面散射。局部反射包含了表面反射和局部次表面散射,取决于入射光方向l,和出射光方向v。
我们可以使用双向反射分布函数(BRDF)来量化这种局部反射,记作f(l,v)。
现实世界中,对象表面很少有统一的材质属性,即使具有单一材质,表面也不是完全光滑的,视觉特性会在表面发生变化。我们将其称为spatial BRDF。
如前面所提,BRDF取决于入射光和出射光,而入射光和出射光都包含两个自由度。常用的参数化描述包含了两个角度:相对于地面法向量n的仰角θ和方位角(水平旋转)φ。
在一般情况下,BRDF是四个标量变量的函数,返回一个RGB值。它的一个特例是各向同性BRDF,即入射光和反射光绕着法向量旋转,相对角度不变时,BRDF性质保持不变(如果我们将各向同性材料放在转盘上旋转,在给定固定光和相机的情况下,所有旋转角度材质显示的结果是一样的)。各向同性BRDF时三个标量变量的函数,因为光线和相机之间只有一个角度φ。
图1 BRDF模型。方位角φi和φo是相对于给定切线向量t给出的。而用于各向同性BRDF的相对方位角φ则不需要参考切线向量。
将BRDF代入反射方程来计算:
积分符号I∈Ω下标,表示我们在曲面上方的单位半球上的I向量进行积分(以曲面法向量n为中心),dl表l周围不同的立体角。上式中,I并不是一个特定的光源方向,而是连续扫过入射方向半球的光源方向,也就是任何入射方向都可以有相关的辐射。
反射方程显示,出射光的辐照度等于入射光的辐照度乘以BRDF,再乘以n和l之间点积的积分。
为了简洁起见,我们之后用 Li(), Lo()来表达反射方程,省略了表面点p:
在计算反射方程时,半球通常使用球坐标φ和θ进行参数化,此时,不同的立体角dl就等于。我们可以推导出上式的二重积分形式,它使用球面坐标(注意,n.l = )
上式中角度的含义在图1中有解释。
在某些情况下,使用稍微不同的参数更加方便,比如将仰角的余弦μi=cosθi和μo=cosθo作为变量,而不是角度θi和θo本身。使用这一参数化时,不同的立体角dl等于dµi dφi。使用(µ,φ)参数化将得到以下形式:
BRDF仅在光线和视线方向均在表面之上的情况下定义。光线方向在表面下的情况,可以通过将BRDF乘以0,或者首先不考虑BRDF的方向来避免。而对于在表面之下的观察方向(即n·v是负的),理论上这种情况不应该发生,表面会背对相机,因此是不可见的。然而,当我们在做插值顶点法向量和使用法线贴图时会导致这种情况。通过将n·v裁剪到0或者取绝对值,可以避免计算处在表面之下视线方向的BRDF,但这两种方式都会导致锯齿。寒霜引擎的做法是使用n·v的绝对值并加上一个小的偏移(0.00001),以避免除0现象。另外一种可能的方式是平滑的裁剪,随着n和v之间的角度增加到90度以上,结果逐渐变为0。
物理定律对BRDF有两个限制。
一是helmholtz交换性,这意味着可以交换输入和输出角度,结果将相同。一般用于渲染的BRDF通常会违反这一定律。:
二是能量守恒定律,即输出能量不能大于输入能量(不包括发光表面,这是特殊情况)。实时绘制时,有必要支持近似的能量守恒。而BRDF渲染表面则过亮了,我们可以引入一个方向半球反射R(l)(directional-hemispherical reflectance),它用于统计从一个给定方向发出的光的数量,它在任何情况下都会反射到围绕表面法向量的半球中的任何输出方向。本质上,它可用于测量给定输入方向的能量损失。它的输入是入射方向向量l,其定义如下:
注意,这里的v和反射方程中的l一样,是扫过整个半球的,而不是单一的观察方向。此外,还有一个相近的相反公式,半球方向反射R(v)(hemispherical-directional reflectance):
如果BRDF是可交换的,那么半球方向反射和方向半球反射是等价的,此时我们可将其总称为方向反照率。
由于能量守恒,方向半球反射R(l)必须在[0,1]内。反射值为0表示所有入射光被吸收或以其它方式衰减的情况;如果所有光线都被反射,反射值将为1。多数情况下,介于两个值之间。更进一步,BRDF能量守恒的要求是,对所有可能的l值,R(l)都不大于1。
最简单的BRDF是lambertian,在实时渲染中经常用lambertian BRDF来表示局部次表面散射(尽管有更正确的模型)。lambertian表面的定向半球反射是一个常数,将f(l,v)视为恒定值,可得出BRDF的定向半球反射为:
我们可将恒定反射值的R(l)称为此表面反照率pss。因此,可得:
1/π因子是在半球上积分余弦因子得到的。
图2 BRDF可视化示例。每个图的右边的绿色实线是入射光的方向,绿色和白色虚线是理想中的反射方向。最上面一行,左边的图显示了一个Lambertian BRDF(一个简单的半球),中间的图显示了加入Blinn-Phong高光后的Lambertian BRDF,右图显示了Cook-Torrance BRDF,此时反射方向的高光不是最强的。在下面一行,左边的图显示了Ward's各向异性模型,镜面反射效果被倾斜;中间的图显示了Hapke/Lommel-Seeliger的月球表面BRDF;右图显示了Lommel-Seeliger散射。
接下来我们将重点介绍局部照明,它使用反射方程来计算每个表面点的局部着色。此时,入射光是给定的,无需计算;而在实际中,包含了来自各个方向的非零辐射,包括直接从光源发射的或者从其它表面反射的。在本章中,我们讨论一般比较局限的,只包含方向光源和精确光源(punctual lights)。
我们取一个小的、远的区域光,并定义lc作为指向其中心的向量,将灯光的颜色定义为白色Lambertian表面朝向灯光的反射光(n=lc)。在这种情况下,反射方程中的积分简化为单个BRDF评估:
点积通常会裁剪到0,作为跳过表面之下灯光贡献的方法:
在多个光源的情况下,多次计算并将结果相加:
其中Lc(i)和Clight(i)分别是第i个光的方向和颜色。
物体表面是周围介质(通常是空气)和物体的边界,光和两种物质之间边界的相互作用遵循菲涅尔方程。入射到反射面的光分为折射和反射部分,反射光的方向(由矢量ri表示)与表面法向量n形成与入射方向l相同的角度。反射矢量ri可由n和l计算:
反射和折射的比例受到平面两侧的两种物质折射率的影响,由菲涅尔反射f来描述,它取决于入射角θi。作为我们之后描述的符号,值n1是入射光和反射光在平面上方传播的物质折射率,n2是折射光在平面下方传播的物质折射率。菲涅尔方程描述了f对θi,n1,n2的依赖性。
图3 平面上的反射。光矢量l绕着法线n反射以产生了ri。首先,将l投影到n上,得到法向量上的投影大小为(n·l)n;然后将l取反,和投影向量的两倍相加,得到反射向量。
外部反射是指n1 < n2的情况,也就是光储在折射率较低的介质处。最常见的情况是空气,折射率约为1.003。为了简单起见,我们假设n1 = 1,从物体到空气的相反过渡称为内部反射。
对于给定的物质,我们可以将菲涅尔方程解释为定义反射函数f(θi),它仅取决于入射光角度。
函数f(θi)具有以下特征:
• 当θi = 0时,光线垂直于表面(l = n),f(θi)显示的是物质本身的性质,此时的值f0可以被认为是物质的特征镜面颜色。
• 随着θi的增加,光线以越来越大的掠射角照射到表面,f(θi)的值越来越大,在θi = 90时,所有通道的值都达到1.
下图显示了几种物质的f(θi)函数,以不同的方式显示。这些曲线是高度非线性的,它们在θi=75左右才开始快速变化为1.从f0到f1的增加大部分是单调的。
图4 玻璃、铜、铝(从左到右)三种物质的外部反射的菲涅尔反射f。最上面一行显示了f的三维图,作为波长和入射角的函数。第二行显示了转换为RGB值后每个入射角对应的f光谱值,并为每个颜色通道绘制了单独的曲线。玻璃的三个通道曲线是一致的,因为它的菲涅尔反射是无色的。在第三行中,使用入射角的正弦作为变量。
在镜面反射的情况下,出射角于入射角相同,也就是说,与入射光掠射角度的表面(θi值接近90°)与眼睛有一个掠射角。反射率的增加主要体现在物体的边缘。
我们可以在现实生活中观察到菲涅尔现象——比如,你坐在电脑前,拿一部屏幕不亮的手机,首先将手机靠近胸部,然后稍微倾斜,使其屏幕反射到显示器上,此时屏幕的反射较弱。之后,将手机抬起,使处于眼睛和显示器之间,此时,手机的反射几乎和显示器亮度一样强。
图5 远离眼睛的表面将被缩短,缩短后的大小与v和n之间的角度的正弦投影一致(对于镜面反射,与入射角相同)。因此,菲涅尔反射率与图4和图6中的入射角正弦相对应。
Schlick给出了菲涅尔反射率的近似值:
此函数是在白色和F0之间的rgb插值,尽管非常简单,近似值却是相当准确的。
图6 Schlick对菲涅尔反射率的近似值与六种物质的外部反射的正确值的比较。前三种物质与图4相同:玻璃、铜、铝(从左到右),底部三种物质铬,铁和锌。每种物质都有一个RGB曲线图,实线显示的是完整的菲涅尔方程,虚线显示的是Schlick的近似值。每个曲线图下方的上部颜色条显示完整菲涅尔方程的结果,下部颜色条显示Schlick近似的结果。
通常假设n1 = 1,近似于空气的折射率,并使用n而不是n2来表示物体的折射率,经过简化后的等式为:
如果使用(复数)结果,该等式甚至对复数值的折射率也起作用(如金属的折射率)。
在一些应用中,使用了更一般的Schlick近似形式:
这样可以控制菲涅尔曲线在90度处转换的颜色,以及转换的“锐度"。
就光学性质而言,物质可以分为三个组,包括电介质,它们是绝缘体;金属,是导体;以及半导体,它们具有介于电介质和金属之间的特性。
电介质的菲涅尔反射率值
日常生活中遇到的大多数材料都是电介质——玻璃、皮肤、木头、头发、皮革、塑料、石头和混凝土等等。水也是电介质,虽然在日常生活中水会导电,但这种导电性是由于各种杂质造成的。电介质具有向当低的F0值,通常为0.06或者更低。在垂直入射时的这种低反射率使得菲涅尔效应对于电介质效果非常明显。
几种常见的电介质的F0值如下表所示,这些值是标量而非RGB,因为RGB通道对这些材料没有明显差异。对于未知的电介质,0.04是合理的默认值。
一旦光被传输到电介质中,它可以被进一步散射或吸收,如果材料是透明的,光将持续从它内部撞击物体表面。
金属的菲涅尔反射率值
金属具有高的f0值,几乎总是0.5或者更高的值。一些金属具有在可见光谱范围内变化的光学性质,导致反射率值存在RGB通道差异。
几种金属的f0值如下表所示:
此处我们给出了RGB值,因为许多金属都有菲涅尔反射率的颜色。回想一下,金属会立即吸收任何透射光,因此它们不会出现任何次表面散射或透明度。金属所有可见的颜色都来自f0。
半导体的菲涅尔反射率值
如我们所料,半导体的f0介于电介质和金属之间。实际中我们很少需要渲染这样的物质,我们应该避免f0在0.2和0.45之间的范围。
水的菲涅尔反射率值
我们讨论外部反射时,假设渲染表面被空气包围,否则反射率将改变,因为它取决于界面两侧的折射率的比率。如果我们不能再假设n1 = 1,那么我们需要将n替换为n1 / n2,得到更通用的等式:
n1 = 1是在渲染非水景时,由于水的折射率比空气的折射率高约1.33倍,因此f0的值在水下是不同的。这种效应对于电介质比金属更强。
参数化菲涅尔值
常用的参数化结合了镜面反射颜色f0和漫反射颜色ρss。这种参数化方式利用了金属没有漫反射颜色,且电介质对f0有一组有限的值,并且它包括RGB表面颜色csurf和标量参数m,称之为金属率(“metallic” 或 “metalness.”)。
如果m = 1,则f0设定为csurf,ρss设为黑色;如果m = 0,则将f0设置为介电值(dielectric value)(常数或由附加参数控制),并将ρss设置为csurf。
“金属率”参数首先作为布朗大学使用的早期着色模型的一部分出现,其参数首先由皮克斯用于电影Wall-E,迪士尼将其用于Wreck-It Ralph动画电影,作为迪士尼原则着色模型,Burley添加了额外的标量,即“镜面反射”参数,以在有限的范围内控制电介质的f0。这种形式的参数化在虚幻引擎中使用,寒霜引擎则使用稍微不同的形式,其中电介质的可能f0范围更大。游戏"使命召唤:无限战争”使用了一种变体,将金属率和镜面参数打包成单个值,来节省内存。
尽管在渲染中外部反射更常见,但内部反射有时也很重要。当n1>n2时发生内部反射。也就是说,当光在透明物体内部行进并从内部遇到物体表面时,就会发生内部反射。
图7 平面上的内部反射,其中n1 > n2。
Snell定律表明,对于内反射,sinθt>sinθi。由于这些值都在0°和90°之间,因此这种关系也意味着θt>θi。在外部反射下,情况正好相反。在外部反射中,sinθ的有效(较小)值存在于0和1之间的每个可能的sinθi值。对于内部反射也是如此。对于θi大于临界角θc的值,根据Snell定律意味着sinθt> 1,这是不可能的。实际上,当θi>θc时,不发生传输,并且所有入射光都被反射,这种情况被称作全内反射(total internal reflection)。
内部反射曲线在θc而不是90°时达到完美的反射率。这也表明,在内反射的情况下,平均反射率更高。例如,这就是为什么在水下看到的气泡具有高度反射的银色外观。
内部反射仅发生在电介质中,因为金属和半导体可以快速吸收在其内部传播的任何光。从折射率或f0来计算临界角的方式如下:
Schlick近似对于外部反射是正确的,通过将透射角θt代入θi,它可以用于内反射。如果已经计算了传输方向向量t,则可以使用它来得到θt ,否则将使用Snell定律从θi计算θt,但这非常昂贵。
图8 玻璃-空气边界处内部和外部反射曲线比较。内部反射曲线在临界角θc处变为1.0。
远小于像素级的表面不规则性无法明确地建模,因此BRDF会在统计上模拟它们的聚合效应。现在我们将继续研究几何光学领域,它假设这些不规则形要么小与光波长(因此对光的行为没有影响),要么大得多。
每个可见表面点都包含许多微表面法线,它们反射不同方向的反射光。由于单个微平面的方向比较随机,因此将它们建模为统计分布是有意义的。对于大多数表面,微观几何表面的法线分布是连续的。该分布的"紧密度“由表面粗糙度决定。表面越粗糙,微观几何法线就越“疏散"。
增加微尺度粗糙度的可见效果,会使反射的环境细节更加模糊。在小而明亮的光源下,这种模糊会产生更宽更暗的镜面高光。
图9 左边我们看到了两个表面的照片,右边为对应的微观结构。顶部表面略微粗糙,表面点的角度稍有不同,入射光以窄锥体方向反射,而底部表面则更加粗糙,入射光线在表面点不同的方向成角度,反射的光在宽锥体中展开,导致模糊的反射。
下图展示了单个微尺度表面细节的聚合反射如何产生可见光的反射。该系列图像由单个光照照射的曲面,其中凹凸的比例逐渐地减小,最后一个图像中凹凸比单个像素小得多。
图10 从可见细节逐渐过渡到微观尺度。表面形状和照明是固定的,只有表面细节发生变化。
对于大多数表面,微观表面法线的分布是各向同性的,这意味着它是旋转对称的,缺乏方向性。对于具有各向异性法线分布的表面,它们的反射和高光方向会模糊。
图11 左图是各向异性表面(拉丝金属),注意反射方向的模糊性。右图是相似表面的显微图片,注意细节的方向性。
一些表面具有高度结构化的微观几何,会导致各种各样的微尺度法线和表面外观。面料是一个常见的粒子,天鹅绒和绸缎的独特外观都是由它们微观几何结构决定的。
虽然多种表面法线是微观几何学对反射率的主要影响,其它影响也很重要,比如微尺度表面遮挡光源形成的遮蔽效果。
图12 微尺度结构的几何效应。在左侧,黑色虚线箭头表示通过其它微观几何被遮挡的区域(从光处遮挡);中间,红色箭头表示了通过其它微观几何被遮挡的区域(从眼睛处被遮挡);右侧,显示了微尺度结构之间光的互相反射。
如果微观几何高度和表面法线之间存在相关性,那么阴影和遮罩都会有效地改变法线分布。
图13 图中所示微观几何在高度和表面法线之间有很强的相关性,其中凸起部分是平滑的,下部是粗糙的。顶部图像中,从接近法线的角度照射,在这个角度,光线能够接近粗糙的凹坑,使光线在不同方向上散射。在底部图像,表面从掠射角照射,会阻挡大部分凹坑,因此很少有光线照射它们,大多数光线会从光滑表面反射。在这种情况下,表面观察到的粗糙度很大程度上取决于照射角度。
对于所有的表面类型,表面不规则的可见尺寸随着法线与入射角 θi的增加而减小,在非常掠射的角度下,我们观察到的不规则尺寸减小到比光波还短,看起来就像"消失"了,这两种效果和菲涅尔效应结合,使得观察和照明角度接近90度时,表面看起来具有高反射性和镜面效果。
我们可以在实际中确认一下以上效果。将一张不光亮的纸卷成长管,不透过洞,而是将眼睛稍微抬高一些观察,这样可以向下看到它的长度。将长管指向明亮的窗户或电脑屏幕,当视角几乎与纸张平行时,你将看到纸张中窗口或屏幕的锐利反射,角度必须非常接近90度才能看到效果。
微尺度表面遮挡的光线并不会消失,而是反映在其它微观几何上,在它到达眼睛之前,光可以以这种方式经过多次反弹。由于在每次反弹中,光都会被菲涅尔反射率衰减,因此在电介质中,相互反射往往是微妙的;而在金属中,多次反射得到了漫反射,因为金属表面缺乏次表面散射。
目前,我们已经讨论了微观几何对镜面反射的影响,也就是表面反射率;在有些情况下,微观表面细节也会影响表面下的反射率。如果微观几何不规则性大于次表面散射距离,则遮挡部分可以引起逆向反射效应,光优先被反射回入射方向。
图14 由于微观粗糙度引起的逆向反射。两幅图都是具有低菲涅尔反射和高散射反照率的粗糙表面。左侧,视线和照明方向相近,导致明亮的外观。右侧,视线和照明方向差别很大,明亮区域被遮挡,外观较暗。
图15 两个物体由于微观表面粗糙度表现出非-Lambertian,逆向反射行为。
BRDF模型基于微观几何对反射率影响的数学分析,称为微平面理论。
每个微平面都是平坦的,具有单个微平面法线m。微平面根据微观BRDF的单独反射光,并将所有微平面反射率加在一起得到整个表面的BRDF。通常每个微平面都是一个完美的菲涅尔镜,产生一个镜面微平面的BRDF。
微平面模型的一个重要特征是法线m具有统计上的分布。该分布由表面法线分布函数NDF定义。我们将使用D(m)指代NDF。
NDF-D(m)是微观几何表面区域上微平面表面法线的统计分布。将D(m)沿着微平面法线积分,得到微表面的面积。更有用的是的积分,将D(m)投影到宏观平面上,它是一个归一化的量:
积分范围在整个球体上,这里用 Θ表示,不像本章前面的半球积分(用Ω表示)。我们使用的大多数微结构模型都是高度场,也就是对于Ω以外的所有方向,D(m) = 0。但是,上式也适用于非高度场微观结构。
更一般的,微观表面和宏观表面在垂直于视线v的平面上的投影是相等的:
图16 微表面的侧视图。在左侧,为D(m)(n · m),投影到宏观表面平面上的微平面区域积分,可得宏观表面面积(1)。右侧为积分D(m)(v · m),投影到垂直于v平面上的微平面区域,产生宏观表面到该平面的投影,即cos θo 或 (v · n)。多个微平面投影重叠时,背面微平面的负投影区抵消了正面微平面。
NDF就像是微表面法线的直方图,它在微平面法线更可能指向的方向上具有高值。并且上式点积没有被0裁剪。
将投影的微平面区域与投影的宏观几何区域关联的另一种方式是,可见微平面的投影面积之和等于宏观表面的投影面积。我们可以通过定义遮蔽函数G1(m,v)来表达,它给出了微表面法线m沿着视线v的分量。G1(m,v)D(m)(v·m)+在球体上积分,并得到投影到垂直于v平面上宏观表面的面积。
此时,该点积被0裁剪,我们使用+来表示这一点,背面的微平面不可见,因此我们不去计算。乘积G1(m, v)D(m)代表了可见法线的分布。该式只是对G1(m,v)的一个约束,但不能唯一地确定它。满足微平面法线分布D(m)的函数有无数个,因为D(m)并没有指定特定的微表面,只是描述了有多少微平面具有指向某个方向的法线,而没有它们的排列关系。
图17 对可见微平面的投影区域(红色)进行积分,得到宏观表面在垂直于v的平面上的投影面积。
关于G1函数的具体表达形式,Heitz提出了Smith遮蔽函数。只有m不是背面(m · v ≥ 0),G1(m,v)的值就不依赖于m的方向。Smith G1函数如下:
其中:
每个NDF的Λ (lambda)函数不同。
Smith G1函数确实有一些去欸但。从理论上,它与实际表面结构不一致,甚至可能在物理上不可能视线。从实用上,虽然随机表面非常准确,但对法线方向和遮蔽之间具有较强依赖性的表面,其精度会降低(尤其是一些有重复结构的表面,如面料)。
给定微观几何描述,包括了微观BRDF的fµ(l, v, m),法线分布函数D(m)以及遮蔽函数G1(m,v),可以推导出宏观表面的BRDF:
该积分位于以n为中心的半球Ω上,避免计算表面下的光。公式使用G2(l,v,m)来代替G1(m,v),它是由G1推导出的。它给出了微平面法线m从两个方向可见的分量:视线向量v和光向量l。包含G2后,BRDF公式能够考虑到遮蔽和阴影,但没有考微平面之间的相互反射,这样的BRDF会比较暗。
Heitz讨论了G2函数的几个版本,最简单的是可分离的形式:
这相当于假设遮蔽和阴影是两个不相关的事件,但实际上它们是相关的,这种形式的g2导致BRDF的过渡变暗。
考虑一个极端的粒子,如果视线和光线方向相同,此时,g2应该等于g1,因为没有任何可见小平面被遮挡。但是,实际上G2等于。
如果微表面是高度场(渲染微表面模型的通常情况),那么当v和l之间的相对方位角φ为 0◦时,G2(l, v, m) 应该等于 min(G1(v, m), G1(l, m)) ,以下公式给出了一种通用的函数来描述屏蔽和阴影的相关性(φ是光与法线的夹角)
其中λ(φ)是随角度φ增加而从0增加到1的函数。Ashikhmin等人建议其为高斯函数偏差15度:
而van Ginneken等人提出了另一种λ函数:
不管光线和视线是否平齐,还有一个影响遮蔽和阴影的因素。两者都与点相对于表面其余部分的高度有关:对于较低的点,遮蔽和阴影的概率都会增加。如果使用Smith函数,则可以使用Smith高度相关的函数来描述:
Heitz还描述了一种结合方向和高度相关性的Smith G2形式:
其中 λ(v, l) 是经验函数。
所有方案中,Heitz推荐的是Smith函数的高度相关函数,也是在实践中最广泛使用的。
一般微平面的BRDF不直接用于u渲染,而是用于推导出其它解。
PBR中使用的BRDF属于来自微平面理论的推导,在镜面反射的情况下,每个微平面都是非常光滑的菲涅尔镜,在单个反射方向上反射每个入射光线,这意味着每个微平面的微观BRDF fµ(l, v, m) 等于0,除非v平行于l的反射。对于给定的l和v向量,这等同于微平面法线m位于l和v向量之间的情况。该向量我们称为半向量h,它是通过将v和l相加并归一化得到的:
图18 半向量h与光线和视线形成相等的角度(以红色表示)。
我们推导微平面模型时,需注意到对所有,菲涅尔镜面微观BRDF fµ(l, v, m) 系数等于0。此时可得到镜面反射的BRDF:
Heitz和Hammon等人还展示了一种通过计算n · h和l · h ,而不是计算h,来优化BRDF实现的方法。
我们使用符号fspec作为BRDF项,表示它只模拟表面的镜面反射。而在完整的BRDF中,还可能模拟次表面(漫反射)的着色。
图19 表面由微平面组成。只有其表面法线与半矢量h平齐的红色微平面才参数从入射光矢量l到视线v的光的反射。
因此,反射光的量取决于法线与h相等的比例,该值由D(h)给出。从光线和视线两个方向都可见的微平面分量,等于G2(l,v,h),每个微平面反射的光的部分,由f(h,l)给定。在评估菲涅尔函数时,用矢量h来代替表面法线。
在遮蔽-阴影函数中使用半矢量可以使用较小的简化,由于角度永远不会大于90度,我们可以去除公式中的χ +项。
法线分布函数对渲染表面外观有着很大的影响。在微平面法线球体上绘制的NDF形状决定了反射光锥的宽度和形状,反过来又决定了镜面高光的大小和形状。NDF影响整体的表面粗糙度,以及更细节的方面,比如高光是否具有明显边缘还是雾化的边缘。
NDF形状并不是简单的光锥状,根据表面曲率和视角,它会被或多或少地扭曲。对于观察的平坦表面,在掠射角度这种扭曲非常明显。
图20 左侧的图像使用非物理Phong反射模型渲染。该模型的镜面光锥绕反射向量旋转对称,这种BRDF经常在计算机图形学早期使用。中心的图像使用基于物理的微平面BRDF进行渲染。左上角和中间都显示了一个在掠射角点亮的平面,左上角显示的是一个不正确的圆形突出显示,而中心显示了微平面BRDF的特征突出显示。该中心视图与显示相符,如右图所示。高亮形状的差异在下面渲染图像中显示的球体上更加微妙,因为此时,表面曲率是高光形状的主要因素。
渲染中使用的大多数NDF是关于宏观表面法线n的各向同性-旋转对称的。在这种情况下,NDF只是一个变量(n与微平面法线m之间的角度θm)的函数。理想情况下,NDF可以写为cos θm的表达式,也可写作计算n和m的点积。
Beckmann NDF
Beckmann NDF是比较早提出的法线分布函数,目前仍在广泛使用。它的分布具有如下形式:
确保对于指向宏观表面下的所有微平面法线,NDF的值为0。NDF描述了高度场微表面,参数控制表面粗糙度,它与微观几何表面的均方根(RMS)斜率成比例,因此 = 0表示完全光滑的表面。
为了得到了Beckmann NDF的Smith G2函数,我们需要相应的Λ函数。Beckmann NDF是形状不变的,这简化了Λ的推导。如Heitz所定义的,如果其粗糙度参数的效果和缩小(拉伸)微表面,则各向同性NDF是形状不变的,可用如下形式编写:
其中,g代表任何单变量的函数。对于任意各向同性NDF,Λ函数取决于两个变量。第一个是粗糙度α,第二个是用于计算矢量Λ的入射角 (v或l)。然而,对于形状不变的NDF,函数Λ仅取决于变量α:
其中s是表示v或l的向量。单变量函数更容易拟合近似曲线,并便于存在一维数组中。
Beckmann NDF的Λ函数为:
上式的计算成本很高,因为包含了误差函数erf,因此我们通常使用近似值:
Blinn-Phong NDF
我们将讨论的下一个NDF是Blinn-Phong NDF,它在过去被广泛应用于图形学,最近已被取代。
Blinn-Phong NDF是由Blinn推导出来的,作为(非物理的)Phong着色模型的改进:
是Phong NDF的粗糙度参数。较高的值表示光滑表面,较低的值表示粗糙表面。对于非常光滑的表面,可以任意高。完美的镜面要求= ∞。
通过将设置为0,可以实现最大随机表面(均匀NDF)。
不便于直接操作,因为它的视觉表现不均匀。对于小的值,小的数值变化具有大的视觉效果,但是大的效果不明显。因此,会对做一个非线性映射。例如,,其中s是0到1之间的参数值,m是给定的的上限。多个游戏使用了这一映射,包括Call of Duty: Black Ops,其中m被设定为8192。
使用可以找到Beckmann和Blinn-Phong粗糙度参数的等效值。
Blinn-Phong NDF并非形状不变的,并且 Λ函数不存在解析式。建议将Beckmann的Λ函数和等价式 结合使用。
图21 在左上角,比较了Blinn-Phong(蓝色虚线)和Beckmann(绿色)的分布,的取值范围在0.025到0.2之间(使用参数关系);在右上角,比较了GGX(红色)和Beckmann(绿色)的分布。的值和左图相同,的值已经根据眼睛来调整以匹配高光尺寸。我们使用相同的值渲染了底部图像中的球体,顶行使用Beckmann NDF,底行使用GGX。
GGX
另一个至今仍广泛应用的法线分布函数,我们称为GGX分布,它的公式如下:
由参数提供的粗糙度控制类似于Beckmann参数提供的粗糙度控制。在迪士尼原则的着色模型中,Burley暴露给用户的粗糙度控制为,大多数使用GGX的应用都采用了这一映射来得到更线性的控制。
GGX分布是形状不变的,其Λ函数是相对简单的:
由于DDX分布和Smith遮蔽阴影函数的普及,人们一直致力于优化两者的组合。Legarde观察到高度相关Smith g2函数具有与微平面BRDF可抵消的项,两者的组合可简化为:
公式使用和来简化。
Karis提出了用于GGX的近似Smith G1函数:
其中s可以用l或者v替换。Hammon推导出了使用这种近似G1与高度相关Smith G2函数、镜面为平面BRDF结合后的结果:
它使用了线性插值算子:
比较GGX和Beckmann的法线分布图时,很明显两者有着不同的形状。GGX比Beckmann具有更窄的峰值,以及围绕这些峰值更长的拖尾。在底部的渲染图像中,我们可以看到GGX较长的尾部会使得在高光的周围产生雾或发光的外观。而许多现实世界里的材料也会显示出这样朦胧的亮点,拖尾通常比GGX分布更长。
图22 使用NDF来绘制chrome(铬?),在左边,我们显示了chrome(黑色)的镜面峰值,其中:GGX(红色,),Beckmann(绿色,),以及Blinn-Phong(蓝色虚线,)。右边显示了高光渲染图像,分别为chrome, GGX, Beckmann的高光效果。
GTR NDF
Burley提出了广义Trowbridge-Reitz(GTR) NDF,其目的是允许更自由地控制NDF的形状,特别是拖尾的分布:
γ参数控制尾部的形状。当γ = 2时,GTR与GGX相同。随着γ的值减小,尾部的分布变得更长,并随着其增加而变得更短。在γ值较高时,GTR分布类似于Beckmann。
k(α, γ) 是归一化后的因子,我们将在一个单独的方程中给出,因为它比其它NDF更复杂:
GTR分布并不是形状不变的,这使得找到其Smith G2遮蔽阴影函数变得比较复杂。GTR的G2解决方案非常复杂,还有一些针对某些γ值的解析表(对于中间值必须要插值)。GTR的另一个问题是参数γ和α以不太直观的方式影响我们感知到的粗糙度和“发光”。
其它
Student's t-distribution(STD)和exponential power distribution(EPD)包含了形状控制参数。与GTR相比,这些函数在粗糙度参数方面是形状不变的。撰写本文时,这些内容刚刚发布,尚不清楚是否可以实际应用。
更好的匹配更多材质的方法是使用多个镜面椎体,而不是增加NDF的复杂性,添加第二个椎体可以显著提升贴合度。
虽然大多数材料具有各向同性的表面统计数据,但有些材料的微观结构具有明显的各向异性,这对它们的外观有很大的影响。为了正确地渲染这些材料,我们需要BRDF,特别是各向异性的NDF。
与各向同性的NDF不同,不能仅用角度θm来评估各向异性NDF,还需要其它方向的信息。在一般情况下,需要将微平面法线m转换到tbn切线空间。该转换通常表示为三个单独的点积m · n, m · t,以及 m · b。
将法线贴图与各向异性BRDF组合时,重要的是要确保法线贴图扰动切线、次法线以及法线。此过程通常将修改Gram-Schmidt 过程应用于扰动法线n和切线t0,b0来完成(假设n已经归一化):
也可以在第一行之后,通过取n和t的叉积来创建正交b的向量。
对于诸如拉丝金属或卷发之类的效果,需要对切线方向进行逐像素修改,这通常由切线图提供。此贴图是存储每像素切线的纹理,类似于法线贴图存储每像素法线的方式。
切线图通常将切线矢量的二维投影存储在垂直于法线的平面上。此表示适用于纹理过滤,可以像普通的图一样进行压缩。某些应用程序存储旋转量标量,用于绕着n旋转切向量。虽然这种表示更紧凑,但它很容易出现纹理过滤伪影(在旋转角度从360到0处)
创建各向异性NDF的常用方法是概括提炼现有的各向同性NDF。所使用的一般方法可以应用于任何形状不变的各向同性NDF,这是我们优先选择形状不变NDF的另一个原因。
回想一下,各向同性形状不变的NDF可以写成如下形式:
g表示NDF形状的一维函数。各向异性的版本为:
参数αx和αy分别表示沿t和b方向的粗糙度。如果αx = αy,则公式则表达各向同性。
各向异性NDF的G2遮蔽阴影函数与各向同性NDF相同,除了变量α(传入函数Λ)的计算方式不同:
其中s代表v或l。
使用这种方法,可为Beckmann NDF推导出各向异性版本:
以及GGX NDF:
图23 使用各向异性NDF渲染的球体:顶行的为Beckmann和底行的GGX。在这两行中,αy 保持不变,αx 从左向右增加。
虽然参数化各向异性NDF的最直接方法是使用各向同性粗糙度参数化两次,一次用于αx,一次用于ay,有时也使用其它参数化方式。在迪士尼原理着色模型中,各向同性粗糙度参数r与第二标量参数kaniso结合,范围为[0,1]。因此,可由这些参数计算αx和αy的值:
因子0.9将纵横比限制为10:1。
Imageworks使用不同的参数化,允许任意程度的各向异性:
如前所述,微平面BRDF框架不考虑多次从微表面反射的光。这种简化会导致一些能量损失以及过度变暗,尤其是粗糙金属。Imageworks使用的一种技术结合了以前的工作,可以创建一个新的项,叠加到BRDF中来模拟多次表面反射:
其中是的方向反照率,即F0值设为1的镜面BRDF值。函数取决于粗糙度α 和仰角v角度θ。它相对平滑,因此可以在数值上预先计算并存储在较小的二维纹理中。Imageworks发现32x32分辨率就足够了。
函数是半球上的余弦加权平均。它仅取决于α,因此可以存储在一维纹理中,或者用比较简单的曲线拟合到数据中。由于关于n旋转对称,因此可以用一维积分计算。我们还是用了变量 µ = cos θ的变化。
最终,F是菲涅尔项的余弦加权平均值,以相同的方式计算。
在使用广义Schlick形式的情况下,Imageworks提供了封闭形式的解决方案:
如果使用原始Schlick近似,则解决方案简化为:
在各向异性的情况下,Imageworks使用 αx 和 αy之间的粗糙度来计算,这种近似避免了增加查找表维度的需要,并且引入错误较小。
图24 在所有行中,表面的粗糙度从左到右增加。前两行显示金色材质。第一行是在没有Image多次反射项的情况下渲染的,第二行是使用多次反射渲染的。对于较粗糙的球体,差异最为明显。接下来两行显示的是黑色介电质材料,第三行是在没有多次反射的情况下渲染的,第四行应用了多次反射项。这里的差异更微妙,因为镜面反射率要低得多。
在上一节中,我们讨论了表面或镜面反射。在本节,我们将讨论问题的另一面,即在表面下折射的光会发生什么。正如我们所讨论的,这种光经过散射和吸收的某种组合,其中一部分重新反射回原始表面。
我们将重点关注不透明电介质中的局部次表面散射或漫反射表面的BRDF模型。金属是无关紧要的,因为它们没有任何明显的表面下光的相互作用。
我们开始讨论漫反射模型,包括漫反射的颜色属性以及它在现实世界中的材质可能具有的颜色值。在下面的小节中,我们将解释表面粗糙度对漫反射着色的影响,以及选择对给定材料使用光滑表面或粗糙表面着色模型的标准。最后两个小姐,我们专门讨论光滑表面和粗糙表面模型本身。
不透明电介质的次表面反照率ρss是从表面逸出的光的能量与进入材料内部的光的能量的比率。ρss的值在0(所有光被吸收)和1(没有光被吸收)之间,并且可以取决于波长,因此ρss被建模为用于渲染的RGB矢量。
ρss通常被称为表面的漫反射颜色,正常入射的菲涅尔反射率f0通常被称为镜面反射颜色。次表面反照率与散射反照率密切相关。
由于电介质会传输大部分入射光,而不是在表面直接反射,因此次表面反照率ρss通常更亮,因此在视觉上比镜面颜色f0更重要。由于它和内部镜面颜色相比是不同的物理过程产生的——从内部吸收而不是表面的菲涅尔反射率,ρss通常具有与f0不同的光谱分布(RGB颜色也是如此)。例如,有色塑料由透明的材料构成,它的内部有颜色粒子。镜面反射的光是无颜色的,而漫反射的光将因为颜色粒子的吸收而着色;例如,红色塑料球有白色的突出显示。
次表面反照率可以被认为是吸收和散射之间竞争的结果,我们需要考虑光会在它有机会被散射回物体之前被吸收吗?这就是液体上的泡沫比液体本身更亮的原因。泡沫化的过程本身不会改变液体的吸收率,但添加许多气液边界会大大增加散射量。
这导致大部分入射光在吸收之前被散射,也就得到了次表面反照率下明亮的外观。刚落的雪是具有高反照率的物质的另一个例子。雪粒和空气之间的边界存在相当大的散射,但吸收很少,导致可见光谱的次表面反照率为0.8或更高。而白色涂料略少,约为0.7。日常生活中遇到的许多物质,如混凝土、石头和土壤,平均在0.15到0.4之间。煤是具有极低次表面反照率的材料的一个例子,接近0.0。
许多材料在湿润时变暗的过程与液体泡沫正好相反。如果材料是多孔的,水会渗透到以前充满空气的空间中。介电质材料的折射率更接近水而不是空气。相对折射率的降低减少了材料内部的散射,并且光在逃逸材料之前的行进距离更长(平均)。这种变化导致更多的光被吸收,次表面反照率变得更暗。
有很多备受推崇的资料中提到,对于真实材料,ρss的值绝不应低于约0.015-0.03(8位非线性sRGB编码中的30~50),但这是一种常见的误解。该下限考虑了包括表面(镜面)以及次表面(漫反射)反射率的颜色,因此太高。实际材料可以具有较低的值。例如"OSHA Black"标准规定Y值可以为0.35(总值100),给定测量条件和表面光泽度,该Y值对应约0.0035的ρss值(8位非线性sRGB编码中为11)。
当从真实世界的表面获取ρss的值或纹理时,重要的是分离出镜面反射。并非所有RGB三元值都对应一个ρss的合理值。反射光谱比发射光谱的分布受到更多限制:对于任何波长,它们永远不会超过1,并且它们通常非常光滑。这些限制定义了颜色空间中的体积,其中包含了ρss所有合理的RGB值,即使是相对较小的sRGB色域也包含此体积以外的颜色,因此在设置ρss的值时必须小心,以避免指定不自然饱和和过亮的颜色。除了降低真实感之外,在预先计算全局照明时,这些颜色会导致过亮的二次反射。
用于局部次表面散射的一些BRDF模型考虑了表面的粗糙度——通常通过使用具有漫反射微平面BRDF fµ,而有些则没有。
使用哪种模型的决定因素不仅仅是表面的粗糙度,实际上决定因素涉及到了表面的不规则形和次表面散射距离的相对大小。
如果微观几何不规则性大于次表面散射的距离,那么次表面散射将表现出于微观几何相关的效果,例如逆向反射。对于这样的表面,应该使用粗糙表面的漫反射模型。如上所述,此类模型通常基于微平面理论,其中次表面散射被处理为局部的微平面,因此仅影响微观BRDF fµ。
如果散射距离大于不规则性,则次表面散射建模时,表面应该被认为是平坦的,并且不会发生诸如逆向反射的影响。次表面散射不是微平面的局部,并且不能通过微平面理论建模。在这种情况下,应该使用光滑表面漫反射模型。
在表面具有比散射距离更大以及更小的尺度的粗糙度的中间情况下,应该使用粗糙表面漫反射模型,但是仅具有包含大于散射距离的不规则形的有效表面。漫反射和镜面反射都可以用微平面理论建模,但每个都具有不同的粗糙度值。镜面项应使用基于表面实际粗糙度的值,而漫反射项将使用基于有效表面粗糙度较低的值。
观察的尺度也与此有关,因为它决定了微观几何学的定义。例如,月球经常被引用为应该使用粗糙表面漫反射模型的情况,因为它表现出明显的逆向反射。当我们从地球上看月球时,观测的尺度就是这样,即使是一个五英尺的巨石也是围观集合学,因此我们观察到诸如逆向反射之类的粗糙表面的漫反射效应也就不足为奇了。
图25 三个表面具有相似的NDF,但微观几何尺度与次表面散射距离之间的关系不同。在左上方,次表面散射距离小与表面不规则性。在右上方,散射距离大于表面不规则性。下图显示了具有多个尺度粗糙度的微表面,红色虚线表示仅包含大于次表面散射距离的微观结构的有效表面。
在这里,我们将讨论光滑的次表面模型。这些适用于为表面不规则性小与次表面散射距离的材料建模。漫反射着色不直接受这些材料中粗糙度的影响。如果漫反射和镜面反射项是耦合的,那么表面粗糙度可能会间接影响漫反射着色。实时渲染应用程序通常使用Lambertian来模拟局部次表面散射。在这种情况下,BRDF扩散项是π上的ρss:
Lambertian模型没有考虑到在表面反射的光不能用于次表面散射的事实。为了改进该模型,应该在表面(镜面)和次表面(漫反射)反射项之间进行能量权衡。菲涅尔效应意味着这种表面-次表面能量权衡会随着入射光角度θi 变化。随着入射角越来越大,漫反射率随着镜面反射率的增加而降低。解释这种平衡一种基本方法是将漫反射项乘以镜面项的菲涅尔部分。如果镜面项是平面镜,则得到的漫反射项为:
如果镜面项是微平面BRDF项,那么得到的漫反射项是:
以上公式会导致出射光的均匀分布,因为BRDF值不依赖于输出方向v。这种行为有一定意义,因为光在重新发射之前通常会经历多次散射事件,它的输出方向将是随机的。但是,有两个因素会使出射光的分布不均匀。首先,由于BRDF项会随着输入方向而变化,因此由Helmholtz准则这意味着它的输出方向必须改变。其次,光线必须在离开的时候经历折射,这会对出射光方向做一些限制。
Shirley等人提出了平面耦合漫反射项,来解决菲涅尔效应和表面-次表面反射率的权衡,同时支持Helmholtz准则和能量守恒。推导了用于菲涅尔反射的Schlick近似:
公式适用于镜面反射率是完美菲涅尔镜的表面。Ashikhmin和Shirley提出了一个有相互关联,能量守恒的,能与任何镜面项耦合的漫反射项的广义版本,并由Kelemen和Szirmay-Kalos进一步完善:
在这里,是镜面反射项的定向反照率,是半球上的余弦加权平均值。可以预计算的值并将其存储在查找表中。计算平均值的方法于我们之前遇到的求平均值相同。
该公式与多次表面反射公式很相似(),因为Imageworks多次反射镜面项源自Kelemen-Szirmay-Kalos耦合漫反射项。但是,有一个重要的区别。这里,我们使用来代替。是包括了菲涅尔在内的全镜面BRDF项的方向反照率,以及多次反射的镜面项(如果用到的话)。这一差异增加了查找表的维度,因为它不仅取决于粗糙度α和仰角θ,还取决于菲涅尔反射率。在Imageworks实现的Kelemen Szirmay-Kalos耦合漫反射项中,它们使用了三维查找表,折射率为第三轴。它们发现在积分中包含了多次反射项会使比更平滑,因此16x16x16的表就足够了。
图26 第一行和第三行显示了添加到Lambertian项中的镜面项。第二和第四行显示了与Kelemen-Szirmay-Kalos耦合漫反射项一起使用的相同镜面项。顶部两行的粗糙度低于底部两行。在每行内,粗糙度从左到右增加。
如果BRDF使用Schlick Fresnel近似并且不包括多次反射镜面项,那么f0的值可以从积分中计算出来。这样做允许我们为使用二维表,在每个条目中存储两个量,而不是三维表,如Karis所讨论的。此外,Lazarov提出了一个适用于的解析函数,类似地将f0从积分中分解出来来简化拟合函数。
这些模型是通过考虑表面(镜面)和次表面(漫反射)术语之间的能量守恒来开发的。而其它模型则是从物理原理开发出来的。其中许多模型依赖于Subrahmanyan Chandrasekhar的工作。它开发了一种半无限、各向同性散射体积的BRDF模型。正如Kulla和Conty所证明的,如果平均自由程足够短,则该BRDF模型是任意形状散射体积的完美匹配。
由于它不包括折射,因此Chandrsekhar BRDF可用于仅对折射率匹配的曲面件建模。这些是两侧折射率相同的曲面。为了建模非索引匹配的曲面,必须修改BRDF以考虑光进入和离开曲面的折射。
作为迪士尼原则着色模型的一部分,Burley包括了一个漫反射BRDF项,旨在包含粗糙度效应以及匹配相关材质。
其中:
而α 是镜面粗糙度。在各向异性的情况下,使用αx和αy之间的中间值。这个等式通常被称为迪士尼漫反射模型。
次表面fss项的灵感来自Hanrhan-Krueger BRDF,它旨在作为远距离物体全局次表面散射的替代品。漫反射模型基于用户控制的参数kss在fss和fd粗糙漫反射项之间进行混合。
迪士尼模型已被用于电影,以及游戏。完整的迪士尼漫反射还包括一个光泽项,主要用于模拟面料,但也有助于弥补由于缺乏多次反射镜面项导致的能量损失。迪士尼光泽项将在后面讨论。几年后,Burley提出了一个更新的模型,旨在与全局次表面散射渲染技术结合。
由于迪士尼漫反射模型使用与镜面BRDF项相同的粗糙度,因此可能难以对某些材质进行建模,但是,使用单独的漫反射粗糙度值将是一个微不足道的修改。
大多数其它的粗糙表面漫反射BRDF已经使用微平面理论进行开发,它们使用了NDF D,微观BRDF fµ以及遮蔽阴影g2的各种不同选择。这些模型中最著名的是由Oren和Nayar提出的。Oren-Nayar BRDF使用Lambertian micro-BRDF,球形高斯NDF,以及Torrance-Sparrow V-cavity遮蔽阴影函数。
完整形式的BRDF模拟了一次二次反射。Oren和Nayar在它们的论文中还包括了一个简化的“定性”模型。多年来已经提出了Oren-Nayar模型的一些改进,包括优化,调整以使“定性”模型更接近完整模型而不增加其成本,并将微观BRDF改为一个更准确的光滑表面漫反射模型。
Oren-Nayar模型假设一个微观曲面具有完全不同的法线分布和遮蔽阴影函数,而不是当前镜面模型中使用的那些。
使用各项同性GGX NDF和高度相关的Smith遮蔽阴影函数导出了两个漫反射微平面模型。由Gotanda得到的第一个模型是数值积分的一般微平面方程,使用了镜面耦合漫反射项作为微观BRDF,然后将分析函数拟合到了数值积分数据中。Gotanda的BRDF没有考虑平面之间的相互反射,拟合函数相对复杂。
使用Gotanda,Hammon模拟BRDF中相同的NDF,遮蔽阴影函数和微观BRDF,包括了相互反射。他表明,相互反射对于这种微平面配置很重要,它表达了粗糙平面总反射率的一半。第二次反射几乎包含了所有缺失的能量,因此Hammon使用来自两次反射模拟的数据。此外,由于添加了相互反射的平滑数据,Hammon能够将相当简单的函数拟合到结果中:
其中:
αg是GGX镜面粗糙度。为了清楚起见,此处的术语和Hammon中演示因素略有不同。注意,fsmooth是耦合漫反射的BRDF,而没有ρss/π因子。Hammon讨论了混合的BRDF,它可替代其它平滑表面的漫反射BRDF,以提高性能或改善与旧模型的兼容性。
总体而言,Hammon漫反射BRDF成本较低,且基于合理的理论原理。需要注意的是,表面不规则性大于散射距离的假设是BRDF推导的基础,这可能会限制它能够精确建模的材质类型。
公式中显示的简单Lambertian项仍然应用于许多实时渲染的应用程序。除了Lambertian项的低计算成本外,它比其它漫反射模型更容易使用间接和烘焙照明,并且它与更复杂的模型之间的视觉差异通常很微妙。尽管如此,对照片级真实感的不断追求推动了更准确模型的使用。
布料往往具有与其它类型材料不同的微观几何。根据不同的织物类型,它具有高度重复的编织微结构,即从表面垂直突出的圆柱(螺纹)。因此,布料表面具有特征性外观,通常需要专门的着色模型,例如各向异性镜面高光,凹凸散射(通过突出半透明光纤散射光线引起的明亮边缘效应),甚至还有视线方向的色彩偏移。
图27 使用为游戏Uncharted 4构建的布料系统的材质。左上方球体为标准BRDF,其具有GGX微平面镜面和Lambertian漫反射。上部中间的球体使用了织物的BRDF,其它的每个球体增加了不同类型的每像素变化。从左到右,从上到下为:织物编织细节、织物老化、不完美细节、小皱纹。
大多数织物都具有高频空间变化。布料BRDF模型分为三大类:从观察中创建的经验模型,基于微观理论的模型和微圆柱模型。我们将分别从每个类型中看一些例子。
在Uncharted游戏中,布料表面使用以下漫反射BRDF项:
其中krim,kinner和kdiff是用户控制的边缘照明项的缩放因子,分别是使前向(内)表面和Lambertian项变亮的因子。
此外,αrim和αinner控制边缘和内部项的衰减。该行为是非物理的,因为有几个和视觉相关的效果,但没有一个依赖于光的方向。
Ashikhmin等人提出了使用高斯NDF的逆模型来表达天鹅绒。这个NDF在随后的工作中略有修改。后者还提出了一种微平面BRDF的bianti
相比之下,Uncharted4中的布料使用微平面或微圆柱模型,取决于镜面项的布料类型,以及漫反射项的“包裹照明”的经验次表面散射近似。
在这里我们使用(x)+表示clamp(0,1)。表示此模型会影响光照以及BRDF。箭头右边的术语取代了左边的术语。用户指定的参数c(scatter)是散射颜色,值w(范围[0,1]控制了照明宽度)。
对于布料模型,迪士尼使用它们的漫反射BRDF项,在粗糙散射模型中增加了光泽项:
其中k(sheen)是一个调节光泽项强度的用户参数。光泽颜色c(sheen)是白色和ρss亮度归一化后的混合(由另一个用户参数控制)。换句话说,ρss除以亮度来隔离色调和饱和度。
Ashikhmin等人提出使用高斯NDF模型的逆来建模天鹅绒。这个NDF在随后的工作中略有修改。后者还提出了一种微平面BRDF的变体形式,用于一般的材质建模,没有遮蔽阴影项以及可修改的共同特性。
游戏The Order中使用的布料BRDF结合了改进的微平面BRDF和来自Ashikhmin的天鹅绒NDF的广义形式和Premoze之后发布的漫反射扩展项。广义天鹅绒的NDF是:
其中, α控制高斯的逆的宽度,而kamp控制其幅度,完整的布料BRDF为:
这种BRDF的一种变体被用于游戏Uncharted4中,用于粗糙的织物,如羊毛和棉。
Imageworks使用不同的逆向NDF作为可以添加到任何BRDF中的光泽项:
虽然此NDF的Smith的遮蔽阴影函数没有封闭形状的解决方案,但Imageworkds能够使用分析函数逼近数值解。Estevez和Kulla讨论了光泽着色函数与光泽项和BRDF其余部分之间能量守恒的详细信息。
图28 Imageworks光泽镜面项添加红色漫反射项。从左到右,光泽度粗糙度值为α = 0.15, 0.25, 0.40, 0.65, 和 1.0。
用于布料的微型圆柱体模型和用于头发的模型非常相似。这一模型的背后是假设表面被一维线条覆盖。Kajiya和Kay为这一表面创建了一个简单的BRDF模型,由Banks给出了坚实的理论基础。它被称为Kajiya-Kay BRDF或Banks BRDF。该概念基于如下事实:由一维线条组成的表面在任何给定位置具有无限数量的法线,由垂直于该位置处的切向量t的法线平面限定。在Uncharted 4游戏中,Kajiya-Kay BRDF用于闪亮的织物如丝绸和天鹅绒的镜面项。
Dreamworks使用相对简单的且可由艺术家控制的微圆柱模型用于织物。纹理可用于改变粗糙度,颜色和线的方向,这可以用于指定表面平面,用于模拟天鹅绒和类似的织物。可以为经线和纬线设置不同的参数,以模拟复杂的变色织物。
Sadeghi等人提出了一种基于织物以及单个线测量的微观圆柱模型。该模型还考虑了线与线之间的遮蔽与阴影。
我们在最后几节中讨论的模型依赖于几何光学,它将光视为光线而不是在波中传播。几何光学基于任何表面不规则性小于波长或大于约100个波长这一假设。
真实世界的表面并不那么乐观。它们往往在所有尺度上都有不规则性,包括1-100的波长范围。我们指的是具有纳米尺度等尺寸的不规则性,以区别于前面部分讨论的微观几何不规则性,这些不规则性太小,无法单独渲染,但大于100个光波长。纳米尺度对反射率的影响不能通过几何光学来建模。这些效果取决于光的波动性质,并且需要波动光学(也称为物理光学)来对它们进行建模。
厚度接近光波长的表面层或膜也会产生与光的波性相关的光学现象。在本节中,我们将讨论波性光学现象,比如衍射和薄膜干涉,讨论它们的重要性。
纳米尺度会引起衍射现象。根据Huygens-Fresnel原理,波前每个点(具有相同波相的点集)都可以被视为新球面波的源。当波遇到障碍时,Huygens-Fresnel原理表面他们会在拐角处稍微弯曲,这是衍射的一个例子。几何光学无法预测这种现象,在光入射到平面表面的情况下,几何光学确实可以正确地预测光将在单个方向上反射。也就是说,Huygens-Fresne提供了额外的扩展,它表明,表面上的球面波恰好形成反射波前,通过相消干涉消除了所有其它方向的波。由于表面点的高度不同,表面上的球面波不再整齐排列。
图29 在左侧,我们看到在空白空间中传播的平面波前,如果波前的每个点都被视为新球面波的源,则新的波在除前向之外的所有方向上都会被破坏性地干涉,从而再次产生平面波前。在中心,波遇到障碍,障碍物边缘的球面波在其右侧没有能够破坏性地干扰它们的波,因此一些波在边缘周围衍射或“泄漏”。在右侧,平面波前从平坦表面反射,平面波阵面比左侧的点更早遇到左侧的表面点,因此从左侧的表面点发射的球面波有更多的时间传播,因此会更大。不同尺寸的球面波前沿着反射的平面波前的边缘加强干涉,并且在其它方向上破坏干涉。
如图所示,光在不同方向上散射。它的一部分被镜面反射,即在反射方向上累加到平面波前。剩余的光以趋向于纳米几何的某些性质的方向衍射出来。镜面反射与衍射光之间的区分取决于纳米几何形状凸起的高度,或者更准确地说,取决于高度分布的变化。衍射光在镜面反射方向上的角度扩展取决于纳米几何形状凸起相对于光波长的宽度,更宽的不规则会导致更小的传播。如果不规则性大于100个光波长,则衍射光和镜面反射光之间的角度很小,可以忽略不计。尺寸减小后的不规则性会导致衍射光更广泛的扩散,直到不规则性变得小于光波长,此时不发生衍射。
在具有周期性纳米尺度的表面中,衍射最为清晰可见,因为重复图案通过相长干涉增强衍射光,从而产生了彩虹色。虽然衍射也发生在非周期表面,但很轻微。
然而,Holzschuch和Pacanowski最近对测量材质的分析表明,许多材质中存在着明显的衍射效应,当前模型无法很好地拟合它们。后续引入了一个结合了微平面和衍射理论的模型,通过一般的微平面BRDF和微观BRDF来解释衍射。
薄膜干涉是当从薄介电质的顶部和底部反射的光路彼此干涉时发生的波动光学现象。
图30 光入射到反射基板顶部的薄膜上。除了最基本的反射之外,存在多个光折射的路径,从基板反射,并且从顶部薄膜表面的内部反射或者通过它折射。这些路径都是同一个波的副本,但由于路径长度的不同导致短的相位延迟,因此它们相互干扰。
根据波长和路径长度差之间的关系,不同波长的光要么相长干涉要么相消干涉。由于路径长度随着角度变化,因此不同波长在相干干涉和相消干涉之间转换,最终的结果是彩虹色转换。
为了使这种效果发生,薄膜需要非常薄,这和相干长度的概念有关。该长度是光波的一个副本位移后且仍然与原始波相干干涉的最大距离。该长度与光的带宽成反比,光的带宽是其光谱功率分布(SPD)延伸的波长范围。激光具有极窄的带宽,以及极长的相干长度。它可能是英里,这取决于激光的类型。这种关系是有意义的,因为被许多波长位移的简单正弦波仍将与原始波相干干涉。如果激光是真正的单色,它将具有无限的相干长度,但实际上激光具有非零带宽。相反,具有极宽带宽的光将具有比较混乱的波形。有意义的是,这种波形的拷贝需要在它停止与原物体相干干涉之前仅移位一小段距离。
理论上,理想的白光是所有波长的混合,其相干长度为零。然而,出于可见光光学的目的,人类的视觉系统(仅在400-700nm范围内感测光)的带宽决定了相干长度,其约为1微米。
与衍射相似,多年来,薄膜干涉被认为是仅在肥皂泡和油渍等表面上发生的特殊效应。然而,Akin指出,薄膜干涉确实为许多日常生活中的表面带来了微妙的色彩,并展示了如何模拟这种效果来增加真实感。
图31 无(左侧)和有(右侧)薄膜干涉的皮革材料。由于薄膜干涉引起的镜面颜色增加了图像的真实感。
他的文章引起了对基于物理的薄膜干涉研究的增加,包括了RenderMan的PxrSurface和Imageworks着色模型在内的各种着色模型都包含了对此效果的支持。
适合于实时渲染的薄膜干涉技术已经出现了一段时间。Smits和Meyer提出了一种有效的方法来解决一阶和二阶光路之间的薄膜干涉。他们观察到的所得颜色主要是路径长度差的函数。这可以从膜厚度、视角和折射率有效地计算出来。
它们的实现需要具有RGB颜色的一维查找表,可以使用密集光谱采样来计算表格的内容,并将其转换为RGB颜色作为预处理,这使得该技术非常快。在游戏Call of Duty: Infinite Warfare中,一种不同的快速薄膜近似被用作分层材料系统的一部分。这种技术不能模拟薄膜中的多次反射光以及其它物理现象。Belcour和Barla提出了一种更准确,计算成本更高的技术,但仍然以实时渲染为目标。
在现实生活中,材料通常彼此叠加。表面可能被灰尘、水、冰或雪覆盖。出于装饰或者保护的目的,它可能涂有漆或其它涂层;或者它可能有多层作为其基本结构的一部分,例如许多生物材料。
最简单且最具有视觉意义的分层情况之一是透明涂层,即在一些不同材料上的光滑透明层。一个例子是粗糙木材表面的光滑涂层。迪士尼原则着色模型为其包括了一个明确的术语,同样的,Unreal,RenderMan的PxrSurface材料,以及Dreamworks Animation和Imageworks使用的着色模型都包括了此内容。
透明涂层的最显著视觉效果是由透明涂层和下面的基底反射的光产生的双重反射。当基底是金属时,第二次反射是最明显的,因为此时介电透明层和基底的折射率之间的差异最大。
当基底是电介质时,其折射率接近透明涂层的折射率,导致第二次反射相对较弱。此效果类似于水下材料。
透明涂层也可以着色。从物理的角度来看,这种着色是吸收的结果。根据Beer-Lambert定律,吸收的光取决于光穿过透明涂层的路径长度。该路径长度取决于视线和光的角度,以及材料的折射率。更简单的实现(例如迪士尼原则模型和虚幻引擎中的实现)不会对视线依赖进行建模,其它人也是如此做的,例如PxrSurface和Imageworks以及Dreamworks着色模型中的实现。Imageworks模型还允许连接任意数量不同类型的层。
在一般情况下,不同的层可以具有不同的表面法线。例子包括了在平坦路面上流动的水,在颠簸不平土壤顶部的平滑冰块,或者覆盖纸板箱的皱纹塑料包裹。电影业的大多数分层模型支持每层单独的法线。这种做法在实时应用程序中并不常见,尽管虚幻引擎中的clearcoat实现支持它作为可选功能。Weidlich和Wilkie提出了一种分层的微平面模型,假设层厚度小于微平面的大小。他们的模型支持任意数量的涂层,并能跟踪从顶层到底层的反射和折射,并再次拷贝。它对于实时渲染而言足够简单,但不考虑层之间的多次反射。Jakob等人提出了一个全面而准确的模拟层级材料的框架,包含了多次反射。虽然不适合于实时运行,但该技术对于地面实况非常有用,其使用的思想对以后的实时技术的实现也有帮助。
游戏Call of Duty: Infinite Warfare使用了一种特别值得注意的分层材料系统。它允许用户组合任意数量的材料层,它支持层之间的折射、散射和基于路径长度的吸收,以及每层不同的法线。结合高效的运行,该系统可实现前所未有的复杂实时材质,并且能以60Hz运行。
图32 测试表面显示了使命召唤的各种功能:无限多层的材质系统。该材质模拟具有变形和散射的复杂几何表面,尽管每一侧仅由两个三角形组成。
材质混合是组合多种材质的特性(即BRDF参数)的过程。例如,为了模拟一块带有锈斑的金属板,我们可以绘制一个遮罩纹理来控制锈斑的位置,并用它来混合锈斑的材质特性(镜面颜色f0,漫反射颜色ρss,粗糙度α)。被混合的每种材质也可以在空间上变化,参数存储在文立中。混合可以在预处理中完成,以创建新的纹理,通常被称为“烘焙”,或者在着色器中及时生成。虽然表面法线n不是BRDF参数,但其空间变化对外观很重要,因此材质混合通常也包括法线贴图。
材质混合对于许多实时渲染应用程序非常重要。例如,游戏The Order:1886具有复杂的材质混合系统,其允许用户创作广泛的并由各种空间遮罩控制的任意深度的材料堆叠。大多数材质混合都是作为离线预处理完成的,但有些合成操作可以根据需求推迟到运行时。此运行时处理通常用于环境,以添加唯一平铺纹理的变化。流行的材质工具Substance Painter和Substance Designer使用类似的材质合成方法,Mari纹理绘制工具也是如此。
即时纹理混合元素可以提供多种效果,同时节省内存。游戏采用材质混合用于各种目的,例如:
• 对建筑物、车辆和生物生成动态伤害。
• 允许用户定制游戏内设备和服装。
• 增强人物和环境的视觉多样性。
有时,一种材质会在另一种材质的顶部混合,不透明度低于100%,但即使完全不透明的混合材质也需要在需要执行部分混合的遮罩边界上具有像素。在任何一种情况下,正确的方法应该是评估每种材质的着色模型并混合结果。但是混合BRDF参数然后一次着色要快得多。在材料材质与最终着色颜色具有线性或非线性关系的情况下,例如漫反射和镜面反射颜色参数,通过插值后没有误差或者引入很少误差。在许多情况下,即使对于最终着色颜色具有高度非线性的参数(例如镜面粗糙度),沿着遮罩边界引入的误差也不会令人反感。
我们需要特别考虑混合法线贴图。通过将该过程视为高度图之间的混合,通常会有比较好的结果,从中可以得到法线贴图。在某些情况下,例如在基础表面上覆盖细节法线贴图时,会优先选择其它形式的混合。
材质过滤与材质混合是密切相关的主题。材质属性通常存储在纹理中,并且通过GPU双线性过滤和mipmapping等机制进行过滤。然而,这些机制基于以下假设:被过滤的量(着色方程的输入)与最终颜色(着色方程的输出)具有线性关系。线性再次仅适用于某些数量,但不是通用的。在法线贴图上或在包含非线性BRDF参数的纹理(如粗糙度)上使用线性mipmapping方法可能会导致伪影。这些伪影表现为镜面反射(闪烁高光),或者表面光泽度或亮度的意外变化,表面与相机距离发生变化。在这两者中,镜面走样更明显。用于减轻这些走样的技术通常被称为镜面抗锯齿技术。我们现在将讨论几种方法:
材质过滤的最常用解决方案与法线和法线分布函数的过滤有关。为了理解为什么会走样以及如何解决它们,请回想一下NDF是子像素表面结构的统计描述。当相机和表面之间的距离增加时,先前覆盖多个像素的表面结构可以减小到子像素尺寸,从凹凸映射的范围移动到NDF的范围。这种转变与mipmap密切相关,后者将纹理细节的减少封装为子像素大小。
考虑对对象的外观进行渲染的建模,外观的建模总是假设一定的观察范围。宏观几何体被建模为三角形,中尺度几何体被建模为纹理,且小于单个像素的微观尺度几何体通过BRDF建模。
图33 在左侧,圆柱体使用原始法线贴图进行渲染。在中间,使用包含法线平均和整合后的分辨率低的多的法线贴图。在右侧,圆柱体以相同的低分辨率渲染纹理,但包含了理想的NDF的法线和光泽度值。右侧的图像是原始外观更好的表示。当以低分率渲染时,该表面也不易于走样。
给定图像中显示的比例,将圆柱体建模为平滑网格(宏观尺度)并用法线贴图(中尺度)表示凸起是合适的。
选择具有固定粗糙度的Beckmann NDF来模拟微尺度法线分布。这种组合表示在此尺度下很好地模拟了圆柱外观,但是,当观察尺度发生变化时会发生什么?
研究下图,顶部的黑框图显示了表面的一小部分,由四个法线贴图纹理覆盖。假设我们以一定比例渲染表面,使得每个法线贴图纹理元素平均被一个像素覆盖。对于每个纹理元素,法线(分布的平均值)显示为红色箭头,由Beckmann NDF包围,用黑色显示。法线和NDF隐式指定了基础表面结构,如横截面所示。中间的驼峰是法线贴图中的凸起之一,小摆动是微观表面结构。法线贴图中每个纹理元素与粗糙度相结合,可以看作是整合纹理元素所覆盖表面区域的法线分布。
图34 上图圆柱的部分表面。顶行显示法线分布(红色显示平均法线)和隐含的微观几何。底行显示了将四个NDF平均为一个的三种方法,如在mipmapping中所做的那样。左边是实际上的平均法线分布,中心分别显示平均(法线)和方差(粗糙度)的平均结果,右边显示合适NDF的NDF叶片。
现在假设相机已经移动的和对象更远,因此一个像素覆盖了所有的四个法线贴图纹理元素。在该分辨率下表面的理想表示将精确的表示在每个像素覆盖的较大表面区域整合的所有法线的分布。可以通过平均顶级mipmap的四个纹理元素的NDF来找到此分布。左下图显示了这种理想的法线分布。如果用于渲染,该结果将最准确地表示在较低分辨率下表面的外观。
底部中心的图显示了法线单独的平均值、每个分布的平均值和粗糙度的结果。粗糙度对应了每个的宽度。结果具有正确的平均法线(红色),但分布太窄。此错误将导致表面显得过于平滑。更糟糕的是,由于NDF分布过窄,它会以闪烁的高光形成形成走样。
我们不能直接用Beckmann NDF表示理想的法线分布。然而,如果我们使用粗糙度图,Beckmann粗糙度会在纹理元素之间变化。想象一下,对于每个理想的NDF,我们发现定向的Beckmann叶片在方向和总宽度上最接近。我们将Beckmann叶片的中心方向存储在法线贴图中,将粗糙度存储在粗糙度图中。结果显示在右下角。这个NDF更接近理想中的NDF。与简单的法线平均相比,圆柱体的外观能够被更还原的表达出来。
为了获得最佳的结果,应将过滤操作(如mipmapping)应用于法线分布,而不是法线或者粗糙度值。这样做意味着考虑NDF与法线之间关系的方式略有不同。
通常,NDF定义在由法线贴图的每像素法线确定的局部切线空间中。然而,在不同法线上过滤NDF时,将法线贴图和粗糙度贴图的组合定义为在几何表面下,底层切线空间中定义的倾斜的NDF(对于法线指向不平均的NDF)是更有用的。
当前使用的解决NDF滤波问题的大多数技术通过计算法线分布的方差来工作。Toksvig观察到,如果法线被平均而不是重新归一化,则平均法线的长度与法线分布的宽度成反比。也就是说,原始法线指向不同方向的越多,它们的平均值就越短。它提出了一种基于此法线长度修改NDF粗糙度参数的方法。用修正的粗糙度评估BRDF近似于滤波法线的扩散效应。
Toksvig的原始方程是和Blinn-Phong NDF一起使用的:
其中是原始粗糙度参数值,是修改后的值,是平均法线的长度。该等式也可以与Beckmann NDF一起使用,通过应用等价式,因为两个NDF形状非常接近。使用GGX的方法则不那么简单,因为GGX和Blinn-Phong之间(或Beckmann)没有明确的等价关系。使用αb来等价ap会在高光中心给出相同的值,但是高光的外观是完全不同的。更令人不安的是,GGX分布的方差是未定义的,这使得这种基于方差的技术在于GGX一起使用时没有稳定的理论基础。尽管存在理论上的苦难,但是使用其与GGX分布结合是相当普遍的,通常使用,在实际中也有较好表现。
Toksvig的方法具有考虑GPU纹理过滤引入正常方差的优点。它也适用于最简单的法线mipmapping方案,线性平均而不归一化。此功能对于动态生成的法线贴图(如水波纹)非常有用,它必须在运行时生成mipmap。该方法不适用于静态法线贴图,因为它不适用于压缩法线贴图的主流方法。这些压缩方法依赖于法线的单位长度。由于Toksvig的方法依赖于平均法线变化的长度,因此与其一起使用的法线贴图可能必须保持未压缩。即使这样,存储缩短的法线也会导致精度问题。
Olano和Baker的LEAN映射技术基于映射法线分布的协方差矩阵。与Toksvig的技术一样,它也适用于GPU纹理过滤和线性mipmapping。它还支持各向异性法线分布。与Toksvig的方法类似,LEAN映射与动态生成的法线能很好地配合,但为了避免精度问题,与静态法线在一起使用需要较大的存储空间。Hery等人独立开发了类似的技术,并在皮克斯的动画电影中哦那个与渲染亚像素细节,如金属片和小划痕。LEAN映射的简单变体CLEAN映射需要较少的存储,代价是无法支持各向异性。LEADR扩展了LEAN映射,也考虑了位移映射的可见性效应。
实际应用程序中使用的大多数法线贴图都是静态的,而不是动态生成的。对于这样的映射,通常使用方差映射相关技术。在这些技术中,当生成法线贴图的mipmap时,计算平均之后丢失的方差。Hill指出,Toksvig技术、LEAN映射和CLEAN映射的数学公式都可以用于以这种方式预先计算方差,这消除了这些技术在原始形式中使用时的许多缺点。在某些情况下,预先计算的呢方差值存储在单独的方差纹理的mipmap之中。更常见的是,这些值将用于修改现有粗糙度映射的mipmap链。例如,该方法用于游戏“使命召唤:黑色行动”中的方差图。通过将原始粗糙度值转换为方差值,将法线图中的方差相加,并将结果转换回粗糙度值来计算修改后的粗糙度值。对于游戏The Order:1886, Neubel和Pettineo以类似的方式使用了Han的技术。他们将法线贴图NDF与其BRDF镜面项的NDF进行卷积,将结果转换为粗糙度,并将其存储在粗糙度图中。
为了以一些额外存储为代价来改善结果,可以在纹理空间x和y的方向上计算方差并将其存储在各向异性粗糙度图中。该技术本身仅限于轴对齐的各向异性。这在人造表面里非常典型,但在自然中的表面非常少。以存储一个或多个值为代价,也可以支持定向的各向异性。
与原始形式的Toksvig,LEAN和CLEAN映射不同,方差映射技术不考虑GPU纹理过滤引入的方差。为了弥补这一点,方差映射实现通常使用小滤波器对法线贴图的顶层mip进行卷积。当组合多个法线贴图时,需要注意正确地组合法线贴图地方差。
高曲率的几何以及法线贴图可以引入法线方差。由此变化产生的走样无法用之前讨论的方法来消除。存在一组不同的方法来解决几何法线方差。如果几何体上存在唯一的环境映射,那么几何曲率可以被烘焙到粗糙度图中。还可以使用像素着色器的导数指令在运行中估计曲率。如果法线缓冲区可用,则可以在渲染几何体时或后处理过程中完成此计算。
到目前为止讨论的方法主要关注镜面反射,但法线方差也会影响漫反射。考虑法线方差n·l项的影响可以帮助提高漫反射和镜面反射的准确性(因为两者都在反射积分中乘以该因子),方差映射技术将法线分布近似为平滑高斯叶片。如果每个像素覆盖数十万个凸起,这是一个合理的近似值,因为它们都可以平滑的平均。
然而,在许多情况下,像素很多只能覆盖几百或几千个凸起,这可能或导致比较“硬”的外观。如之前的图10所示,它是一系列图像,显示了一个球体,其中有一个从图像到图像尺寸减小的凸起。右下方的图像显示了当凸起足够小以平均成平滑高光时的结果,但左下和中下方的图像显示了小于像素但不足以平滑平均的凸起。如果你观察这些球体的动画渲染,那么帧与帧之间高光会不断闪烁。
如果我们要绘制这样一个表面的NDF,它看起来就像下图中的左图。随着球体的动画效果,h矢量在NDF上移动并越过亮区和暗区,从而产生“闪亮“的外观,如果我们能在这个表面上使用方差映射技术,它将使用类似于下图右侧的平滑NDF来有效地近似该NDF,从而失去闪亮的细节。
图35 左边是随机凹凸不同表面上的小凸起(一侧有几十个凸起)的NDF。右侧是一个宽度大致相同的Beckmann NDF。
在电影业中,通常使用广泛的超采样来解决,这在实时渲染应用中是不可行的,并且在离线渲染中也是不符合需要的。目前已经开发了几种技术来解决这一问题。有些不适合实时使用,但可能为未来研究提供了途径。目前已经设计了两种用于实时渲染的技术。Wang和Bowles提出了一种用于迪士尼Infinity 3.0游戏中渲染闪闪发光的雪的技术。该技术旨在产生合理的闪亮外观,而不是模拟特定的NDF。它适用于具有相对稀疏闪光的雪等材质。Zirr和Kaplanyan的技术模拟了多尺度上的法线分布,在空间和时间上是最稳定的,并且允许更多种类的外观。
我们没有太多篇幅来涵盖有关材质过滤的大量文献,因此我们将提到一些值得注意的参考文献。Bruneton等人提出了一种用于处理跨越从几何到BRDF尺度的海洋表面上变化的技术,包括环境照明。Schiling讨论了一种类似方差映射的技术,该技术支持使用环境贴图进行各向异性着色。Bruneton和Neyret提供了该领域早期工作的全面概述。