刚刚看了‘Path Tracing in Production’,里面提到了Weta digital的Manuka材质系统,在这里总结一下,算是对之前Material小结的一个补充。
之前主要是讲BRDF,现实中不仅包括reflectance,也包括transmittance,因此,除了BRDF外,还需要BTDF,而BS(cattering)DF也是BRDF BTDF的合集。
Layer-based material system
基于Manuka material system,来介绍这个分层材质系统。用户可以任何组合多个BSDF构成一个材质堆栈(material stack),真实世界的材质大都也是如此,比如下面是对树叶这个材质的分层解读,这里包括譬如角质层,叶肉,表层蜡质等,都有不同的材质表现和反射属性。
Manuka对BSDF进行了归类:BRDF只反射,BTDF只折射,BSDF既反射又折射(半球面),BCSDF(我不清楚这个,大概针对毛发这类材质)。在设计时,所有BSDF都有一个相同的接口,除了要实现Sample,Eval和PDF这些基本方法外,还会提供一些材质特殊的信息,比如平均方向,折射率,粗糙度等
Manuka采用的是一种shade-before-hit策略,通常,我们都是在intersection后获取交点对应物体的材质属性,这一切在Manuka中已经预处理了,好处是支持很多复杂的视觉效果,但缺点是占用大量的内存,因此,压缩是一个很关键的技术,通常,会用8bit来存储颜色,而粗糙度等属性则会用16bit。
材质系统的图层叠加(layering operation)有两种方式:水平和垂直,具体包括Mix,Coat,Blend和Add,其中Mix和Blend属于horizontal,而coating和add属于vertical。个人理解Blend是Mix针对只有两层材质的特殊形式给出的优化,相比blend,add仅支持发光材质。
另外,个人理解,尽管一个材质系统是多层的,每层都是一个独立的材质,当我们会把多层看作成一个综合后的材质,比如一个材质有两层,分别对应两个BRDFs,记为
和
,当我们进行叠加操作时,每层都有自己的权重
,
,然后做一次normalization,这样就可以得到整体材质的计算公式,而不需要考虑层之间的光线折射反射效果,这里,图层间不同的叠加方式会有不同 权重计算公式:
同时,真实世界中,不同材质在叠加时,自身的属性也可能会变化,比如水泥,干水泥较为明亮或中度灰,而湿水泥则变暗,这里会有一个accumulation techniques,在叠加材质时可以更改折射率,粗糙度等属性。
以人体皮肤的例子,我们通过图层叠加的方式,来模拟大千世界各类复杂材质。