写在前面:原始文案来源于凌风同学博客,本文在其基础上增加图片并对文案稍作修改。此系列文章已经私信咨询能否授权发布,但一直尚未得到本人回复。出于工作要求,本人需要记录该系列课程体系,以供后期交流学习使用,不得已在此公开。特在此严谨声明,该系列文章不以盈利为目的,侵权麻烦私信即可删除。
阳了整整一周,差点交代了。今天终于有点力气,写一篇吧
Lecture 17 Materials and Appearances
一.Material == BRDF
(一)Diffuse / Lambertian Material
漫反射光线会出现以下特征:
以下是两个漫反射的实际渲染模型:
漫反射的BRDF推导过程如下:
我们假设物体是白色的,不吸收能量,且进来的光都是相同且均匀的,那么根据能量守恒,反射的光也是相同且均匀的。进来多少Radiance就要反射多少Radiance,就可以把这个渲染方程写出来(如上图所示)。那么这里入射的Radiance(Li)是常数,BRDF(Diffuse)(fr)也是常数,这两项就可以拿出去,整个式子就变成了对半球上一个cosθ的积分,积分出来是π。那么整个式子就变成了Lo=πfrLi,又因为入射的Radiance等于出射的Radiance,所以Li=Lo。那么fr=1/π。这时候就是完全不吸收能量的BRDF。
我们定义一个反射率albedo(ρ)的概念,这个值可以是单通道的一个数,也可以是RGB等,让反射率albedo在0到1之间,这样就可以引入不同颜色的BRDF。
(二)Perfect Specular Reflection
镜面反射,在这种情况下,会出现金属光泽
比如铜和铝:
这种情况下,有了光的折射,会有玻璃效果
就像玻璃和水膜
求反射的出射角ωo方法:
方法①:通过平行四边形法则即可得到出射光的方向ωo
方法②:定义方位角(类似于立体角)
把这些角度投影到一个局部坐标系上。平着向前看(如上图),任何一个方向和法线的夹角为θ。例如如果θo=0,则意味着是沿法线方向,θo=90°则意味着沿着水平方向平着向右去。另外一个角度定义φ,沿法线反方向俯视这个空间(如上右图),可以看到φi和φo是反向,也就是说两个角相差一个π,通过θ和φ就可以定义ω(类似于知道了球坐标)。
(三)Specular Refraction
镜面折射
折射同样也用方位角去分解入射光与出射光的角度。
水平向前看光路满足折射定律,由此可以得出θi和θt的关系。
从上往下看φi和φt依然是反向,相差一个π的关系。
这样我们就可以把折射角的余弦算出来:
通过上式我们可以发现,折射会得到cosθt这样一个有意义的实数,如果这个有意义的实数不存在,那么就说明折射不可能发生。那么什么时候这个式子没有意义?答案是根号下的式子为负,即:
当入射介质的折射率大于折射介质的折射率,那么折射就不会发生,这就是全反射现象。
如人在水下向上看的视野,是一个97.2°的视锥
(四)Fresnel Reflection / Term
如上图例子所示,如果垂直于桌子向下看,桌子上几乎没有书本的反射,但是一旦视角慢慢平行于桌子,就会发现反射越来越明显。
这种现象就叫菲涅尔项。入射光进来时与法线的角度决定了有多少能量会被反射。
以绝缘体为例(蓝线和绿线表现的是光的一种极化性质,和光的波动性有关(不用管,渲染器也不会去考虑这个问题)。红线是最后平均蓝绿两条线后的线,这里只看红线就可以)
横轴代表入射光与法线的角度,纵轴代表反射率。当入射光和法线夹角很小时,反射也很小,当入射光和法线夹角逐渐变大时,反射会越来越强。当视线完全正对物体时(角度为90)此时的反射率最大,没有折射。
而对于导体来说,无论入射光和法线夹角是多大,反射都很强。
菲涅尔项的计算公式如下,S和P是光的两个极化方向,Rs和Rp是在这两个方向上的反射率是多少 实际上常用Reff取二者平均
菲涅公式非常复杂,因此我们通过拟合出一条曲线,用一个式子将这种现象描述出来:
R0表示基准反射率,也就是光线与法线夹角为0°时的反射率,然后考虑夹角增大到90°的这样一条曲线。当夹角为0°时,反射率为R0,当夹角为90°时,反射率为1。这样无论是对导体还是绝缘体,这个公式都可以很好地近似描述菲涅尔项。
二.Material == BRDF
(一)Microfacet Theory
微表面:从远处看看到的是材质外观,从近处看看到的是几何特征。
(从近处看上去表面是凹凸不平,一个个小表面,从远处看是平的,但是材质的感觉是粗糙的。如从太空中看凹凸不平的地形,只能看见光滑的一片)
微表面是指从近处看凹凸不平的表面,宏表面是指从远处看光滑的表面
(二)Microfacet BRDF
当表面比较光滑时,微表面的法线方向比较集中,指向的方向都集中在一小块儿区域内,此时的物体是glossy(光滑的)
当表面比较粗糙时,微表面的法线方向比较散乱,指向的方向范围比较大。这就会形成漫反射(diffuse)材质
微表面的BRDF方程如下:
BRDF首先考虑菲涅尔项F(i,h),然后考虑法线分布D(h),这里又用到了半程向量,只有当微表面的法线方向在半程向量周围一个限定的范围之内时,才能将光反射出去。最后中间那一项G(i,o,h)是考虑微表面之间的光线遮挡,比如有一束光几乎平行于微表面打过来,那么前面的微表面就有可能遮挡住光线。
(三)Isotropic / Anisotropic Materials (BRDFs)
如上图:
各向同性Isotropic,微表面并不存在一定的方向性或方向性很弱
各向异性Anisotropic,微表面有明确的方向性
各向异性反应在BRDF上就是:
BRDF原来是两个方向的函数θi、φi是输入方向,θr、φr是输出方向。如果BRDF满足在方位角上旋转,得到的还是相同的BRDF(沿一个方位角θ或φ的中心旋转,相对位置不变),就称为各向同性;如果相对位置改变,BRDF改变,则称为各向异性。
(四)Properties of BRDFs
1.BRDF的值永远是非负的,表示了能量的分布。
2.BRDF的线性性质。BRDF可以分成好多块分别做光线传播,把各部分分别计算的结果加起来,即为BRDF(如当时做Blinn-Phong模型公式时拆成了漫反射高光环境光三部分分别去计算,最后加了起来得到结果)。
3.交换入射方向和出射方向,得到的BRDF的值是一样的。
4.能量守恒,BRDF不可能让能量增多。就算是完全反射,也就是进来多少再出去多少。如果有部分被吸收,那么反射出来的能量就会比原来进来的小。
5.BRDF的值只与相对的方位角有关,即φr-φi,因此原来四维的BRDF,如果是各向同性材质,就可以写成三维的。
所有的BRDF,由于具有可逆性(交换入射方向和出射方向,得到的BRDF的值是一样的),因此相对方位角不用考虑正负,因此后面又可以写成方位角之差的绝对值,不用考虑谁大谁小谁减谁。
三.Material == BRDF
为什么要测BRDF?因为以前的BRDF模型并不足够准。如上图,对于菲涅尔项来说,如果通过物理方法来测出,其与理论(蓝色)的各种方法算出来的结果好像完全不一样。而且如果能直接测量BRDF,就不需要再去推某些BRDF了。
(一)Image-Based BRDF Measurement
如何测量呢?把要测量的物体放在中间,找一个灯从四面八方照这个物体,拿一个相机从四面八方去拍,这样就覆盖了所有BRDF可能存在的方向了。
枚举所有的出射方向,然后把光源放上去;再对于每个出射方向,枚举所有的入射方向,然后把相机放上去(入射方向和出射方向可以互换。然后测量得到的Radiance是多少。
但是这样操作数据量会立马增上去。
所以可以设计更好的思路,通过测量一部分点,剩下的可以猜出来。
当把BRDF数据都测出来以后,就通过库来存储这些数据。