【Unity Shader入门精要学习】基于物理的渲染(一)
基于物理的渲染一(PBS)
光线和某一介质接触之后一般会发生两种情况,一个是反射,而另一个就是折射。光线到底被反射多少是由菲涅耳等式( Fresnel equations)决定。
而我们可以认为现实世界中,光滑的平面并不是真的光学平滑,而是有很多的细小微平面组成,微平面越凹凸不平则物体表面就越粗糙,否则表面就越光滑。因为越光滑法线变化越小,反射的光越集中,高光现象就越明显,反之法线变化越大,反射的光就越发散,高光现象就越不明显,高光就越模糊。
微平面
一、表面反射
表面反射就是指光线经过介质的折射一部分会进入介质内部,一部分会反射介质外部,被反射出来的就是表面反射,而具体反射多少,是由菲涅尔等式来描述。在渲染中,表面反射对应的就是高光反射。
二、次表面散射
一些光被折射进介质内部后,又会被散射出来,而被散射出去的光就是次表面散射光。金属材质具有很高的吸收系数,因此,所有被折射的光往往会被立刻吸收,被金属内部的自由电子转换为其他能量。而非金属材质往往具有吸收和散射两种现象。也就是次表面散射光。
但是散射出去的光的位置有多种情况,既可能离射入点很近,也有可能很远。所以数学建模的时候会有两种情况。如果离得近并小于一个像素的大小,那么渲染就可以在局部进行,如果离得远则需要使用次表面散射渲染技术。
这篇内容建立在忽略次表面散射距离的基础上,只是用局部渲染。
次表面散射距离
三、渲染方程
而如何使用数学模型来描述上面所提到的光照模型,也就是对光这个抽象概念进行量化,可以使用辐射率来量化光。辐射率是指单位面积,单位方向上光源的辐射通量。通常使用L表示。而在渲染中,通常会使用入射光线辐射率Li来计算出射光线的辐射率Lo,这个过程往往也被成为着色。也就是有了渲染方程:
其中Le(v)是自发光的辐射率,dw可以被认为是某条光线,f(w,v)就是某条光线在观察方向上射出的百分比,也就是权重,Li(w)是有效入射光线的辐射率,(n·w)就是光线在法线上的投影。
渲染方程的解释
这个方程可以从右向左来解释:
某一光线×它在某个方向上的投影(也就是衰减)
×对应的入射光辐射度×在观察方向上射出的权重。它们在180度方向上的积分(求和)+自发光辐射率。
而去掉渲染方程中的自发光项,就会变成反射等式( Reflectance Equation)。而在实时渲染中,自发光往往都是直接加上对应的光源即可。
四、精确光源
在实时渲染中,累加部分,也就是积分,基本无法实现,所以往往会使用若干精确光源叠加的方式来代替,而不是计算入射光线整个半球上的积分。
所以使用精确光源来近似模拟这些光源。也就是经常使用的平行光,点光源,聚光灯。这些光源被认定为大小无限小且方向确定。公式:
其中l为光的方向,c为光的颜色,v是观察方向。相比积分操作,这里使用一个特定方向的f(l,v)值来代替积分,这样简化了操作。如果是多个光源,就把对应的光源叠加求和即可:
多个光源叠加
五、BRDF(Bidirectional Reflectance Distribution Function)双向反射分布函数
在近似光源的公式中,只剩下f(l,v)未知,它代表在给定入射光的方向的情况下,有多少百分比的光会被反射到观察方向,它有个专门的名字:双向反射分布函数(BRDF)。
顾名思义,双向就意味着有两个方向:f(I,V),其中I是入射方向,V是观察方向。如果沿着法线旋转不影响BRDF的结果,那么这种BRDF被称为各向同性的BRDF,如果结果不一样就是各向异性的BRDF。
BRDF的理解就是当一束光沿着入射方向I到表面某个点时,f(I,V) 表示了有多少部分的能量反射到了观察方向V上。
BRDF决定了整个着色过程是不是基于物理的,这可以用BRDF是否满足两个特性来判断:
是否满足交换律和能量守恒。
交换律要求当交换l和v之后,BRDF的值不变,即:f(l,v)=f(v,l)。
能量守恒则要求表面反射的能量不能超过入射的光能,即:
BRDF可以描述两种不同的物理现象:表面反射,次表面散射。
用于描述表面反射的部分叫做高光反射项,用于描述次表面散射的部分叫做漫反射项。
image.png
如何得到BRDF呢?一种情况是使用精确的光学仪器在真实的物理世界测量,根据所得到的数据进行数学建模。但真实世界的光照非常复杂,很难有一个BRDF可以满足所有材质。下面给出常见的BRDF的高光反射项,漫反射射项:
Disney BRDF。
六、漫反射项
经常使用的是Lambert模型,就是最简单也是最广泛的BRDF:
其中cdiff表示漫反射光线所占的比例,通常也被称为漫反射颜色(diffuse color)。 与我们使用Lambert光照模型的不同的是这里的f(l,v)是一个定值,还缺少一个余弦因子(n· l),但实际(n· l)是反射公式的一部分,而不属于BRDF。之所以要除以π是因为假设漫反射在各个方向上的强度都是一样的。同时BRDF要求在半球内的积分值是1,所以在给定入射方向l的光源在某表面的出射漫反射辐射率为:
漫反射辐射率
这样看右侧的公式就和我们经常使用的Lambert光照模型差不多了。
但实际的世界中很难有这种完美均匀的散射,根据真实的BRDF分析发现,很多材质在掠射角表现出了的明显的高光反射,而且还与表面的粗糙程度有着很大关系。粗糙表面在掠射角容易出现亮边,光滑的表面在掠射角会形成一条阴影。而这些实际情况是无法使用现有的Lambert光照模型体现出来的。
菲涅尔
http://filmicworlds.com/blog/everything-has-fresnel/
这篇文章写的很详细,什么是菲涅尔现象。
所以很多基于物理的渲染会选择使用更加复杂的的漫反射项来模拟更加真实的次表面散射的结果,如Disney BRDF:
其中baseColor是表面颜色,一般通过纹理采样得到,roughness是表面粗糙度。这个公式既考虑了掠射角的反射的情况,也考虑了粗糙度对漫反射的影响。Disney使用了Schlick 菲涅耳近似等式来模拟掠射角的反射变化,同时使用粗糙度进一步修改它,这使得光滑材质在掠射角也可以有明显的的阴影边。
菲涅尔近似式