PBR:基于物理的渲染
相比传统的Lambert着色和Phong着色,PBR着色在效果上有着质的提升,可以表示更多更复杂的材质特征:
①表面细节;
②物体粗糙度;
③区别明显的金属和绝缘体;
④物体的浑浊程度;
⑤菲涅尔现象:不同角度有不同强度的反射光;
⑥半透明物体;
⑦多层混合材质;
⑧清漆效果;
⑨其它更复杂的表面特征;
1、BRDF
Bidirectional Reflectance Distribution Function,即双向反射分布函数。
BRDF一般满足两个特性,交换律和能量守恒。
交换律是说当摄像机位置和光源位置调换位置,这个函数计算的最终结果是相同的。
能量守恒很好理解,就是这个函数的计算结果不能超过光强。
关于光照计算是有很多种流派的,如果某光照计算违反了两者或其中之一,那么它们就不是BRDF,就不是PBR材质。
BRDF有好几种模拟表面光照的算法,然而,基本上所有的实时渲染管线使用的都是Cook-Torrance BRDF。
Cook-Torrance镜面反射BRDF由3个函数(D,F,G)和一个标准化因子构成。D,F,G符号各自近似模拟了特定部分的表面反射属性:
①D(Normal Distribution Function,NDF):法线分布函数,估算在受到表面粗糙度的影响下,取向方向与中间向量一致的微平面的数量。这是用来估算微平面的主要函数。
②F(Fresnel equation):菲涅尔方程,描述的是在不同的表面角下表面反射的光线所占的比率。
③G(Geometry function):几何函数,描述了微平面自成阴影的属性,当一个平面相对比较粗糙的时候,平面表面上的微平面有可能挡住其他的微平面从而减少表面所反射的光线。
以上的每一种函数都是用来估算相应的物理参数的,而且你会发现用来实现相应物理机制的每种函数都有不止一种形式。它们有的非常真实,有的则性能高效。你可以按照自己的需求任意选择自己想要的函数的实现方法。
Epic Games公司的Brian Karis对于这些函数的多种近似实现方式进行了大量的研究。这里将采用Epic Games在Unreal Engine 4中所使用的函数。其中D使用Trowbridge-Reitz GGX,F使用Fresnel-Schlick近似法(Approximation),而G使用Smith’s Schlick-GGX。
2、菲涅尔效应
3、微表面理论
所有的PBR技术都基于微平面理论。
4、GGX光照模型
GGX模型所解决的问题是,如何将微平面反射模型推广到表面粗糙的半透明材质,从而能够模拟类似于毛玻璃的粗糙表面的透射效果。
Unity的PBR
Unity内部实现机制遵循了PBR的基本准则,支持金属度,表面粗糙度,能量守恒,菲涅尔反射,表面阴影遮蔽等特性。
①Albedo:基础色,相当于UE4的Base Color。可用纹理贴图指定,也可用一个颜色值代替。
②Metallic:金属度,意义跟UE4的一致。但它可以用金属贴图代替,此时Smoothness参数会消失。
③Smoothness:光滑度,跟UE的粗糙度取值刚好相反,但都是表示材质表面的粗糙程度。(Unity指定了Metallic贴图后的效果,Smoothness参数消失,Unity的Smoothness参数从0~1的变化)。
④Smoothness Source:指定存储光滑度数据的纹理通道,可选择金属度、镜面贴图的Alpha通道或基础色贴图的Alpha通道。
⑤Occlusion:遮蔽图,用于指定材质接受间接光(如环境光)的光照强度和反射强度。(Unity中使用遮蔽图为人物阴暗面(脸部,脖子)屏蔽环境光的影响)。
⑥Fresnel:随着物体表面法线与视线的角度增大,物体的反射能力增大,这种现象称之为菲涅尔效应。在Unity中,无法直接调节菲涅尔效应的参数,但内部实现机制会自动处理。越光滑的表面具有越强的菲涅尔效应,相反,越粗糙的表面具有越弱的菲涅尔效应。
近今年,PBR的技术主要朝着更逼真、更复杂、效能更好的方向,或是结合若干种模型的综合性技术迈进。代表性技术有:
①PBR Diffuse for GGX + Smith (2017)
②MultiScattering Diffuse (2018)
③Layers Material(分层材质)
④Mixed Material(混合材质)
⑤Mixed BxDF(混合BxDF)
⑥Advanced Rendering(进阶渲染)
BxDF:
目前计算机图形渲染领域,基于物理的渲染方式主要有:
①辐射度(Radiance):计算光源的镜面反射和漫反射占总的辐射能量的比例,从而算出颜色。在实时渲染领域,是最主流的渲染方式。BRDF大多数都是基于此种方式,包括Cook-Torrance。
②光线追踪(Ray Tracing):即光线追踪技术,它的做法是将摄像机的位置与渲染纹理的每个像素构造一条光线,从屏幕射出到虚拟世界,每遇到几何体就计算一次光照,同时损耗一定比例的能量,继续分拆成反射光线和折射光线,如此递归地计算,直到初始光线及其所有分拆的光线能量耗尽为止。由于这种方式开销非常大,特别是场景复杂度高的情况,所以常用于离线渲染,如影视制作、动漫制作、设计行业等。近年来,随着NVIDIA的RTX系列和AMD的RX系列显卡问世,它们的共同特点是硬件级别支持光线追踪,从而将高大上的光线追踪技术带入了实时渲染领域。
③路径追踪(Path Tracing):实际上路径追踪是光线追踪的一种改进方法。它与光线追踪不同的是,引入了蒙特卡洛方法,利用BRDF随机跟踪多条反射光线,随后根据这些光线的贡献计算该点的颜色值。
BxDF可细分为以下几类:
①BRDF(双向反射分布函数,Bidirectional Reflectance Distribution Function):用于非透明材质的光照计算。Cook-Torrance就是BRDF的一种实现方式。
②BTDF(双向透射分布函数,Bidirectional Transmission Distribution Function):用于透明材质的光照计算。折射光穿透介质进入另外一种介质时的光照计算模型,只对有透明度的介质适用。
③BSDF(双向散射分布函数,Bidirectional Scattering Distribution Function):实际上是BRDF和BTDF的综合体:简单地用公式表达:BSDF = BRDF + BTDF。
④SVBRDF(空间变化双向反射分布函数,Spatially Varying Bidirectional Reflectance Distribution Function):将含有双参数的柯西分布替代常规高斯分布引入微面元双向反射分布函数(BRDF)模型,同时考虑了目标自身辐射强度的方向依赖性,在此基础上推导了长波红外偏振的数学模型,并在合理范围内对模型做简化与修正使之适用于仿真渲染。
⑤BTF(双向纹理函数,Bidirectional Texture Function):主要用于模拟非平坦表面,参数跟SVBRDF一致。但是,BTF包含了非局部的散射效果,比如阴影、遮挡、相互反射、次表面散射等。用BTF给表面的每个点建模的方法被成为Apparent BRDFs(表面双向反射分布函数)。
⑥SSS(次表面散射,也称3S,Subsurface Scattering):它是模拟光进入半透明或者有一定透明深度的材质(皮肤、玉石、大理石、蜡烛等)后,在内部散射开来,然后又通过表面反射出来的光照模拟技术。 关于次表面散射方面的研究,比较好的是Jensen的文章《A Practical Model for Subsurface Light Transport》,该文提出了一个较为全面的SSS模型,将它建模成一个双向表面散射反射分布函数(BSSRDF)。
⑦BSSRDF(双向表面散射分布函数,Bidirectional Surface Scattering Reflectance Distribution Function):它常用于模拟透明材质,目前是主流技术。它和BRDF的不同之处在于,BSSRDF可以再现光线透射材质的效果,还可以指定不同的光线入射位置和出射位置。