首先没听过Disney这个Principled BRDF的请戳这个链接(https://disney-animation.s3.amazonaws.com/library/s2012_pbs_disney_brdf_notes_v2.pdf)。从使用率上来说,Pixar的RenderMan,Disney的Hyperion以及UE4都采用了这个模型,说明肯定有值得学习的地方。在这里先谈谈它的设计思路和特点。
Disney BRDF的最大的特点就是直观。它就像一个万能的Shader可以随便通过调整参数就渲染大部分常见的材质。Artist不需要抓耳挠腮的站在工程师的角度考虑当前的材质有几层,是什么材料的,该选择什么反射模型。相反的,所有参数都直接和最终的视觉结果直接相关,直接根据视觉结果调整不需要真正了解材质的物理性质,而且也更加直观。例如下图,要增加镜面反射,只是增加一个数字就可以了,不需要考虑当前是什么BRDF,有没有使用Microfacet,材质有几层等,当然底层实现还是基于这些前两节说过的模型,只不过这些复杂的模型并没有,也不需要暴露给Artists。
这一条主要是说参数的定义并不是基于物理性质,或者材质模型的性质,而是基于最终的外观。这样的好处当然是再一次使得系统更加直观易用。Artists可以直接根据参数参数直观的调出想要的某种外观去模拟目标材质。
参数调整时外观改变过度非常平滑,两组完全不同的参数之间直接插值外观的渐变也非常直观。下图是原文从一块橡皮插值到一个金属的过程:
这一点对于使得调整材质时的体验一致性很强,对于易用性甚至培养使用者的习惯都很重要。
所有的参数以及最终材质的外观都是基于MERL BRDF数据库中的数据的。这个数据库储存了100种用光学仪器测量出来的不同材质的双向反射分布函数的值。所有参数是根据这个数据库中存在的材质特性去定制的,而最终参数的结果也会尽量的去匹配这个数据库中的材质外观。所以基于物理什么的在这种直接和最终现实中的数据的方法比起来也显得浮云了。
实现
上面把这个Disney的Shader吹的神乎其神,接下来简单的介绍一下它底层的材质模型到底是长的什么样。它的BRDF用公式表示的话就是这样的:
对就是这么简单,和上一节介绍过的有两层镜面反射的材质大同小异,只不过在多了两个subsurface项和sheen项。通过调节给出的参数可以改变每个项的权重,改变Microfacet的分布函数的粗糙参数以及菲涅尔的种类,从而覆盖了非常大范围的材质。Disney BRDF的参数除了最基本的baseColor决定材质的颜色以外,还包括以下几个,所有参数的范围都是0到1:
具体的参数的意义,文档已经讲的很清楚了,我就挑重点的谈谈。个人认为最重要的参数应该是Metallic,Roughness和Specular。下面这张图片是用Metallic 0, Roughness 0.02和Specular 0.5渲染得到的,下面用这个结果作为参考说明其他几个参数对最终外观的影响。
Metallic就是一个插值因子,Metallic为0的时候对应的材质就是一层漫反射材质外面包裹了一层清漆(Clear coat)那种材质,而Metallic为1的时候,则没有任何漫反射项,并且Fresnel项使用导体的(或者直接让Fresnel等于1如果不在乎小细节),在0和1之间的时候则让漫反射项和Fresnel项插值。下面这张图片则是把参考图片的Metallic调成1得到的结果。
Roughness也许则同时影响漫反射项和基于Microfacet的镜面反射项。漫反射项的实现在文章第一节中已经给出了,Roughness越大的时候在入射角低的时候漫反射项会有更强的反光,详见基于物理着色(一)。Roughness的平方则是直接作为Microfacet的分布函数中的粗糙度参数。使用平方的话最终视觉外观的粗糙度更为线性。Microfacet的分布函数中的粗糙度参数则为,原因是如此出来的结果更符合MERL数据库中的结果。对Roughness的重新映射也体现了之前提到的基于外观和数据驱动的特点。下面这张图片则是把参考图片的Roughness调到0.2得到的结果。
Specular则决定了物体镜面反射强度的大小,实现更是简单不过,0-1就只是映射到Fresnel项中垂直入射角度镜面反射的强度而已。映射的范围是[0-0.08] ,分别对应的折射率范围是[1.0-1.8],可以覆盖绝大多数的材质。Specular 0.5的时候对应的折射率是1.5,也就是最常见的玻璃材质。下面这张图片是把参考图片的Specular调到0的结果。
Subsurface和Sheen参数文章中并没有给出完整的定义,Disney BRDF中的Subsurface并不是真正的计算完整的次表面散射模型,它只是非常hacky的将diffuse光照到更多原本找不到的地方,这个Subsurface只能用于非常近似的渲染场景中的背景或者细小的次表面散射材质,这里学习的价值不是很大。下面是把参考图片的Subsurface调到1.0的渲染效果。
Sheen则是为了模拟某些布料在入射角度低的时候会反射更强的光,实现也是非常Hacky的直接用多一个Fresnel去增强入射角度低的时候的光线。这么做当然也无法完整的模拟布料的反射模型。下面两张图是Sheen分别为0和1时候的对比。
Clearcoat参数则是第二层镜面反射的强度,现实中有许多两层镜面反射的材质,例如文章第二节中提到的车漆,详见基于物理着色(二)- Microfacet材质和多层材质。Clearcoat的0到1映射第二层镜面反射强度0到0.25,第二层镜面反射中项的使用常数0.25。项的则取决于ClearcoatGloss。下面的两张图是Metallic为1,Roughness为0.7,ClearcoatGloss为0.05时,Clearcoat分别为0和1时的对比。
其他所有以Tint结尾的参数则是对应项是否有颜色。例如SpecularTint为0的时候镜面反射的光照就是无色的(所有光线都被反射),为1的时候则变成BRDF的颜色baseColor。
写到这里,再结合前两张对基本材质模型的介绍,希望这个系列的文章已经给出了一个对Disney这个材质系统的大概的认识。无非就是基于对基本的材质模型间的插值,叠加等操作去模拟更复杂的材质。但是参数的选择则是通过非常用心的分析现实中各种材质外观的特性挑出了一些最能决定外观的参数,并且将这些参数重新映射到0-1的范围内,使得使用的时候更加直观,可以插值,并且重映射非常注重和去拟合现实中测量的反射数据。UE4中的材质系统使用的是同一个BRDF,当然有许多简化的地方,例如漫反射项就只是最简单的Lambertian模型。
下面的图片就是完全用Disney BRDF渲染的,加上好看的纹理,法线贴图以及粗糙图之后几乎是可以以假乱真了(点开看大图)
缺点和限制
当然没有什么是完美的,Disney BRDF也不例外。我个人认为它主要有以下几方面的限制。
写到这里基于物理着色系列就结束了,这个系列文章中的技术并没有涵盖渲染蜡烛,玉,皮肤等次表面散射的材质,也没有包括任何渲染云彩,烟雾等的技术。关注以后的文章吧。另一方面也感觉这类内容似乎对于知乎大部分读者专业性有些过强,所以有尽量少些公式多贴图,想讨论更多细节的线下私信留言吧。
本文中其他Shader Ball以及兔子的渲染结果使用的是本人自己开发的渲染器EDXRay。(链接是非常旧的介绍,见谅)