为金刚制作一个逼真的毛发渲染系统成为了Weta Digital的视觉特效师面临的首要挑战。当电影主角是一个25英尺(7.62米)高的横冲直撞的大猩猩时,就必须要设计出一个可靠的毛发渲染系统。当金刚在电影里出现的时候,它的毛发要根据剧情和环境做出适当的变化。有时候毛发是梳洗干净的,有时候上面充满了泥土和树叶,还有时上面洒满了雪或者毛发全部都浸湿了。我们需要发展一个可以处理这些情况的毛发渲染系统。
金刚不是唯一一个需要灵活的毛发系统的数字角色。所有的数字角色都需要使用同样的毛发渲染系统。这些角色包括女主角Ann(在这部电影里换了众多的发型)、冒险号(这艘船把演员们载到了骷髅岛)上的船员以及纽约街道上的其它景物。甚至数字角色的毛发大衣也是由金刚的毛发渲染系统生成的。
毛发系统出现了有几年了,也在很多电影里得到了应用。但是,我们在这里想讨论Weta Digital如何通过超越标准的毛发渲染系统来满足《金刚》的创作需求。
毛发生成
毛发系统是通过RenderMan里的wmFur插件实现的,这个插件是Martin Preston编写的。毛发是从遍布整个细分曲面的毛囊里创建的,现实里的毛发也是从毛囊里长成的。毛发直接从表面长出,然后由变形器通过梳理毛发使之栩栩如生。
变形器在梳理TDs中是用来创作出需要的外观。其中有简单的变形器(如声音和波纹)也有比较复杂的定向变形器(如簇变形器和线变形器)。正如它的名字表达的意思一样,簇变形器允许艺术家将周围的毛发弯向中间毛发。线变形器是由任意数量的CVs组成的,线变形器从皮肤里长出,可以被建模。它在一定程度上影响周围的毛发。对于一个特定的角色,可能会有数个梳理程序以使身体不同部位的毛发具有不同的特点。举个例子,金刚的手臂、头部和胸部有不同的毛发梳理程序。等等。
为了控制毛发变形器,艺术家们需要通过使用纹理贴图或者单顶点原始变量(使用Maya的Artisan绘制)来指定各项表面特性。这些特性包括长度、光秃度、稠密度以及变形器其他的控制变量。
通过对变形器进行分层,艺术家(毛发梳理师)们得以以程序化并且非破坏性地快速创建,改变金刚毛发的外观。例如,头发可以朝特定方向弯曲。然后通过使用簇变形器可以改变弯曲度。所有的这一切都不会影响先前生成的毛发簇的行为。因为金刚的外观必须具有强烈的艺术感,所以这一点非常重要。通过对多次迭代进行测试可以逐步制作出需要的外观。
最终,DSO为金刚制作了300-350万根毛发,尽管毛发的数量在很大程度上取决于拍摄需要。有趣的是,我们决定不去存储DSO产生的毛发,而是去在每一帧里重新生成毛发。当权衡了传输数GB的毛发缓存时花费的可观的网络带宽和每次重新产生毛发时花费的成本,我们做出了这个决定。最终,鉴于前面提到的在网络上传输巨大的缓存文件带来的成本,Weta的大规模的“渲染农场”在每一帧的基础上生成了毛发。
毛发渲染
Weta为了生成金刚的头发采用了Stephen Marschner在2002年发表的名为“人类头发纤维的光散射”论文里提出的光照模型。为了既能渲染金刚粗糙杂乱的头发又能渲染Ann的干净漂亮的金发,这篇论文的细节经过改良并应用于RenderMan的着色器。非常好的一点是,使用Marschner的光照模型做出了干净的洗发水广告里的头发效果。所以为了做出金刚需要的外观效果,我们对这个模型做了一系列的改进和优化。面临的挑战就是和金刚的模型上的由脏兮兮的牦牛毛制成的毛发进行匹配。
Marschner 模型
Marschner的论文基于它的单一毛纤维光散射实证测量模型。论文主要观点为头发的射主要存在三个亮点:第一个亮点来自发丝表面直接的镜面反射。第二个亮点(和第一个亮点不同)是由射入头发内部的光(透射进去的)由另一个方向从内部反射出来光形成的。最后一个亮点来自直接透过头发的光(例如从背后光源照过来的光)。
为了实现该理论,渲染模型将每根头发纤维近似为一个透明的椭圆柱体。这种椭圆柱体内部可以吸收光,它的表面由倾斜的鳞片覆盖(倾斜角度为表皮层角)。每根头发的方向会对着色产生影响。随着轴向转动的不同,和其他方位相比,一些特定的方位会产生较强的反射亮点。在第二个亮点中,那些特定朝向的椭圆横截面会使光聚焦成一个明亮的亮点,这常常会产生闪烁或者焦散。
该模型也导致了第一第二亮点的分离。第一亮点向发根移动,并且因为它完全是由反射产生的,所以它的颜色取决于光的颜色。第二亮点向发梢移动并且由于它是由内部透射出来的光产生的,所以它的颜色取决于头发的颜色。
金刚的具体细节
用于金刚的着色器设置时采用两种方式来处理光的透射和吸收。第一种方式是,着色器负责处理从背后光源透射过来的光。第二种方式是,灯光设置负责处理大量头发对光的透射和吸收。
如果一根颜色较浅的头发被从背后过来的光照射,它往往会发光并且发出荧光。这种现象就是光透过头发时产生的透射现象,但它很大程度上取决于头发的颜色(由于黑色头发吸收了光的绝大部分,所以黑色头发没有这种特质)。如上文所述,还存在一种焦散现象,焦散会导致透过头发的光看起来比光源更明亮。
对穿过大量头发的光的透射和吸收是通过累加光透过头发时产生的颜色和不透明度来进行处理的。鉴于RenderMan的深度着影工具在累加半透明物体的不透明度和颜色时的出色表现,它们是完成这种工作的绝佳工具。为了生成深度阴影贴图,Weta不想使用着色球的全部实力来生成每个阴影(有时会达到20个甚至更多),所以Weta在阴影渲染器里使用了精简版的头发着色器。对头发进行渲染时只计算头发透过的光的多少。使用这种着色球来进行深度阴影渲染时会同时减少光的透过量。
最后,Weta需要把金刚的毛发变得粗糙,然后添加控件以赋予金刚在野生动物身上才有的毛发变化。为了实现这一目标,他们首先在金刚的头发上添加了一个圆柱形的漫射项来负责处理灰尘。然后,表皮层角度(Marschner描述的)被“随意设置”以表现更多破碎蓬乱的头发,使其看上去和牦牛的毛发相似。最后,添加控件以生成薄膜油层(用在头部的毛发上面)并且使毛发看起来油润有光泽。
闭塞和阴影
为了给金刚的毛发制作阴影,Weta同时使用了深度阴影贴图和“卷闭塞”贴图。正如前文所提到的,深度阴影擅长减弱透过毛发的光。他们被用来为关键/主要光源制作阴影并且用来制作毛发对光的吸收。
大量的闭塞贴图被用来在每一个整洁的底片上计算、存储毛发的环境闭塞。大量的砖质贴图以同样的方式被用来制作表面的环境闭塞表面贴图。首先,毛发上带着given groom的金刚被摆放成特定的姿势(不要忘了,这是per-groom map),对于毛发上的每一个点都要计算闭塞量。然后以砖贴图的方式存储(使用毛发“直接突出”的Pref来使其变得杂乱)。和任何砖贴图一样,这可以通过毛发着色器来观察以发现闭塞和弯曲的方向。总而言之,毛发闭塞有助于保护毛发丛的细节,但是由于是每个groom变得独立,每次groom变化时它都需要更新。