07.基于Lambert三角面的高级粗糙表面:Torrance,Sparrow,Cook,Blinn,Oren-Nayar
建立一个描述粗糙表面的数学模型的想法很早就有了。Torrance和Sparrow1967年设计出了一个以表面作为基准面的BRDF(早于Phong)。基面上分布有许多微小的三角面,用它们之间形成的角度来描述表面的粗糙程度。由于相邻三角面间形成的槽之间的角度正好相反,因此也叫它为V形槽。这个模型在物理上是正确的,因为它使用的是真实世界的参数来描述反射的分布,而且它具有波长独立性,意思就是说表面上的某一点因视角的不同而有不同的颜色。以后的几种模型都是基于这个基本模型而建立的。
之后Cook和Torrance在1982年迈出了重要的一步(有时称为Cook-Torrance模型,有时也称为Blinn-Cook-Torrance模型,因为它也把Blinn模型考虑进去了)。它是一种由Blinn和Torrance-Sparrow混合而成的模型,也是物理上精确的并而渲染速度上有所改进,其中之一是集成了更多的三角面分布函数。Torrance-Sparrow,基于著名的高斯分布;内建基于Phong式分布的Cook-Torrance;Trowbridge-Reitz和Beckmann分布。不过这只是一小部分,重要的是集成了关于光线的计算信息,光线照射在三角面上,依据两个参数来反射。一个是著名的菲涅耳效应(简单的说就是反射量依据反射角和表面折射率--参见第一部分)。第二是基于自身的阴影投射和三角面遮罩的几何衰减因子,如下图。
Cook-Torrance这种常见模型主要是建立高光和模拟金属质感。有时也会混合Lambert的漫射部分,但由于它在物理上的正确性它不适用于艺术表现,而且它的速度也不是最快的一个。下图的第一个球体是Cook-Torrance高光,在表面粗糙度很小的情况下它跟Blinn高光的形态很相似。另一个常见的三角面模型是Oren-Nayar模型(实际上我们常用三角面模型是出于它的快速,而且它是Lambert漫射之外一个很好的选择)。它是Cook-Torrance模型的一个简易版,能建立漫射表和Blinn高光。我见过很多Oren-Nayar模型不同的应用方法,所以我很难解释它。这中间很多不使用遮罩和自身阴影投射,也不把波长计算算在其中。大多数情况下这个模型看起来像Lambert漫射加上视线正对处的暗淡,再加上一些背部散射。下图中的2,3号球是oren-Nayar模型的简单渲染,画圈的部位是同一点的不同视角,说明了反射值依据视角的不同而不同。我很喜欢这个模型,因为它比Lambert更具真实性。
下图中的1号球是另一种Oren-Nayar模型的应用。它看上去更像没有暗淡的lambert和背部散射的混合。不要问我它的算法是什么,它只是千万种经典模型中的一个变种。2号球体是复杂表面上的Oren Nayar漫射,带有尖锐的Blinn高光。3号球体使用相同的设置,只是漫射部分是Lambert,高光是Phong。
08.各向异性和序乱的模型:Ward, He, Schlick, Lewis, Lafortune等...
在上世纪90年代出现了大量的模型,而且有很多模型发展到了现在。这之中最流行的是He-Torrance-Sillion-Greenberg模型(1991--非常复杂,引入SSS特效,有着新型漫射部分叫直接漫射,基于物理真实和三角面),Schilick模型(1994--类似遮罩的三角面,漫射 和高光部分一起计算,支持各向异性的新算法),Ward模型(1992--带有高斯分布的快速各向异性模型,物理上正确),Lewis模型(1993--也叫著名的经典cosine-lobe模型,物理上正确的Phong分布的扩展)和lafortune模型(1997--由于它是Lewis模型的普及,也叫普通版的cosine-lobe模型)。在一些3D软件中你可以看到它们的应用,但软件中不是用的它们的真名,因为软件的程序员只是用这些模型来达到他们特定的需求。这也是许多不同的模型存在的原因。举例来说,如果你安装了3ds max的第三方渲染插件和材质包,以及一些带有BRDF模型的插件(像HairFX,MooDee shaders,Facialstudio),你会看到有20-30种不同的模型供你选择。再让我们来看看名向异性吧。到现在为止我们只介绍了各向同性模型,就是说反射值不随模型的旋转而发生变化。同样基本的三角面模型也是各向同性的,因为三角面的尺寸一样,且在表面上均匀分布。如果反射值随摄像机的角度旋转而不同也不能说明是各向异性的模型,就像我在第一部分里讲到的那样,各向异性是你在某一方向观察时表面上的凹凸和刮痕表现出同一性。来看看图片吧。
球1的高光是Ward模型。很像Blinn是吗,但我认为这个看上去要好点,因为高斯分布使得高光处有更多的细节,不像Blinn那么柔和。这个球只是有高光,但是当你使用物理上正确的镜面反射光线跟踪时你就明白我在说什么了。球2就是Ward模型的光线跟踪反射,球3是同样条件下的Blinn模型。球2我使用了各向异性的参数,还做了一段动画来看这个效果。有趣的是我也可以把Blinn模型弄成各向异性,这就是我所说的序乱的模型。你可以看到,Blinn模型上的各向异性有点问题,Blinn反射像平常那样柔和,但左下的那道细长高光表现的非常尖锐,这不像我想像中的那样。第三个球体是另个一种有趣的各向异性模型,它是finalshaders的distant fur,是3ds max的渲染插件finalrender stage-1的材质插件。它可以做为高级BRDF模型的很好的例子,它含有许多不同的基本BRDF模型和一些扩展的功能,能方便的使用户创建他们想要的效果。
下图中的1号球是在绒绒的粗糙球体上使用了柔和的不均等色和Lambert漫射。在做成动画的时候不均等色也会使球体看上去模糊,像长绒毛一样。2号球使用非常尖锐的各向异性高光来模拟油油的表面。第3个球使用了自定义曲线来控制一个强大模型的光线反射分布。很遗憾这个类型的模型没有在大多数渲染器里得到支持,这种类型的著名模型有FALLOFF贴图和Zauner模型。我希望在渲染程序里能够很好的整合镜面反射衰减和各向异性分布的自定义曲线。4号球使用Zauner模型来产生模拟的SSS效果。看来我们已经接触到了SSS,好吧我们开始下一个话题吧。
09.高级渲染技巧和SSS模型:Kubelka-Munk,Hanrahan-Krueger,Jensen
首先,Kubelka-Munk和Hanrahan-Krueger模型跟高级渲染没什么关系。它们跟上面讲的模型一样,跟表面和摄像机有关,这两个又跟SSS特效有关。实际上它们是跟SSS特效最有关的模型,除了He模型之外。但它们只是处理表面的漫射部分,就是说它们不能真的计算表面下面的光线来达到实现真实物理属性的目的。这种技术需要新的渲染技术,像高级光线跟踪算法(MONTE CARLO)和光子贴图技术的支持。Kubelka-Munk模型是一个非常简单的用来描述表面上色素层的BRDF。它先考虑一层色素,下一步通过一个拥有众多参数的函数来模拟多层表面下的光线散射。就是说你可以指定表面的层数,漫射和散射行为,吸收光线的颜色和厚度。
下图的的1号球是Hanrahan-Krueger模型的动画。红色的过渡色是基本层,然会我在之上加了一层皮肤色的层,做成动画。第二个球是复杂表面上的Hanrahan-Krueger,打了背部散射的灯光来模拟毛发的细微模糊效果。这个模型模拟皮肤效果很好,特别是结合纹理贴图的时候。但注意它只是一个BRDF(R表示反射),毕竟有它的局限性。三号球是使用了正确物理属性MONTE CARLO算法的SSS效果。这种效果很慢,你可以把它当做是加强的光线跟踪算法,因为要从表面上某一点发射出多条光线到场景中来收集必要的信息,这比只发射一条光线要慢很多。这也可以是一种序乱的Lambert光线跟踪算法,因为从这一点处的半球体射出的光线是随机的。我不肯定MONTE CARLO算法的光线跟踪渲染器是否考虑了BRDF模型,来达到多种效果的目的。典型的基于Lambert的电脑图像看上去是死板的,这时典型的GI来到了,但这种算法渲染动画的速度太慢了。因此,Henrik Jensen,光子贴图的发明者(几乎所有的渲染器都集成了这种特效)结合了这两种方法各自的优点,它使用了普及化的Hanrahan-Kruger作为散射部分(直接散射和漫射)和一种优化的漫射逼进算法作为多重散射的漫射部分(加上菲涅耳效应),他称他的这种快速SSS为BSSRDF宝贝。他成功了,看看Gollum,哈里波特,或其它一些大预算的电脑动画你就知道我的意思了。最后一个球体使用了Hanrahan-Kruger和低品质的MONTE CARLO的混合来加速SSS特效。
最后希望这篇讲解BRDF模型的文章讲到了你不知道的一些东西。如果你发现其中有不对的地方发EMAIL给我。
全文完