基于物理渲染的基础理论1.0版

发表于2016-05-22
评论1 3.6k浏览
  本篇作为理论的概括介绍,并不涉及公式的部分,如果有问题或错误请留言讨论,谢谢指正,我也会不断补完这篇
  基于物理渲染的优点
 · 很容易就可以作出真实和照片级的效果。
 · 同一配置可以适用于在不同HDR光照环境下。
 · 接口简单而直观,都是基于世界真实的参数。(如粗糙度,金属度,等等)。
 · 不需要美术去提供经验性的"奇怪"参数和配置。
 · 更容易去解决问题和扩展需求。
  基于物理的渲染和和传统区别
 · 有着基于物理规则的光照模式
 · 有着无处不在的fresnel效果
 · 能量守恒“energy conservation”,物体平面的反射光无法超过它所解接受的入射光
 · 基于物体材质,会分辨金属和介电质,微平面的概念
 · 线性空间的光照,支持gamma矫正的,HDR渲染和tonemap
  光与物质的交互(light and matter)
  光是是一种横向传播的电磁波,电磁波的波长范围非常广,但只有390~760nm之间的一段波谱是人眼可见到的,也就是在图形学里对渲染着色起作用的部分。另外因为光有波粒二象性的缘故,有时候我们在图形学里也会把光做为光子(photon)来处理。


  当光投射到传感器(眼睛,照相机等)上时,颜色和亮度就会被吸收并感知,而光与物质交互后被感知的,就是物体的颜色。
  物质对光的影响,可以用折射率(refractive index)来描述,当由复数来表示折射率时,它的实部影响速度(相对于真空中的速度),虚部来影响光的衰减(被吸收),折射率会改变光的波长。
  我们先根据物质按照内部折射率是否均匀来进行分类:
  均匀介质(Homogeneous Media)
  内部密度相同的物质,意味着他有唯一的折射率,对应透明的均匀物质来讲(如水,玻璃),光通过时,并不会改版光的颜色或强度,而当物质对某一种可见光谱有吸收率的时候,那么,光就会随着在物质内的传播距离而逐渐被吸收,而光的方向并不发生改变,这就是光被吸收(absorption)。
  

  光穿透玻璃和水时,方向,颜色和强度都不会发生
 
 
  方向没有变化,光但随着距离会丧失强度(改版颜色),也就是光被吸收了。
  非均匀物质(heterogeneous medium)
  当非均匀物质内部的折射率非常突然的时候,这时就会发生散射(Scattering)现象,光会被分割为多个方向,但光的总量并不会发生变化。
  

  除了以上两种交互外,  物质还可能因为其他能量发出新的光,称为自发光”emission“。

 
 
  光与物质交互的三种方式,吸收,散射,发光。
  光与平面的交互(light and object surface)
  上一个段落讲点,光在密度不同的物质内传递的现象,而渲染中最为典型的,是发生在物体表面时,关于光与空气和物质之间的散射效果。
  这个时候平面散射光会分为两部分:进入平面的部分(折射,在物体内部传播中被吸收或散射),从平面出去的部分(反射)。
    

  一个假设完美无限光学平坦的平面(简称光学平面)反射效果,平面两侧的空气和物体有各自的折射率
  但实际上,平面大多都不是光学平面(除了镜子或镜头等),而是一种微几何体(Microgeometry),表面都会有一些比可见光波长要大的不规则凹凸,但又小到无法覆盖一个像素或者采样点,所以,我们就把这种非光学平面,理解为一组微小光学平面的集合,而可见光的反射,实际上是在平面各个点上轻微不同方向的反射集合,也就是后面会提到的微平面理论(Microsurface Theory)。
 
 
  roughness
  上面的平面相对平滑时,表面方向的变化也比较轻微,从而反射光的方向变化也较小,有了较清晰的反射。而下面的表面粗糙,表面方向的变化范围也较广泛,反射光的方向变化也比较大,出现了模糊的反射。
  

  两个平面在微观上的粗糙度(roughness)不同导致不同的反射效果
  漫反射光与镜面光(diffuse and specular)
  这里,我们光和平面交互分为两个项目来描述,从平面直接反射的部分称为镜面反射光(Specular),来源于拉丁语的“Mirror”,另外一部分光,传入到物体内部,而经过折射,被材质吸收(转变为热能),或者内部进行散射,一些散射光最终会重新返回从平面折射出来,并被摄像机或眼睛所捕捉到,称为漫反射光(Diffuse)。漫反射光被物质吸收并散射后,会成为不同波长的光,这也就给予了物体颜色,比如物体吸收了蓝色以外的光,那物体就是蓝色的,而因为散射的混乱比较均匀,从每个方向看起来都是一样,所以这点和镜面光不一样。也可以使用这个名字albedo来描述。

   
 
  非光学平面反射(Surface Reflectance)和折射散射(Subsurface Reflectance)的宏观视图,形成了Diffuse和Specular。
  金属和非金属材质
  物体内部的折射光的作用,取决于物体内部的组成,内部组成的不同,可以分为,金属(metal)导体,电介质(Dielectrics)绝缘体和半导体(Semiconductors ),因为半导体在渲染中出现的机会不多,在处理物体时简单的分组为金属和非金属就可以了。金属会吸收所有的折射光,而且通常会比绝缘体的反射率要高,通常的反射率要达到60%~90%,而绝缘体则是0%~20%,反射率高,就防止了入射光被吸或折射,这样,金属就有了”闪亮“的外观。
 
 
  金属的折射光能量都立刻被自由电子吸收
  而非金属(绝缘体),光会在内部进行吸收和散射活动,最后,一些折射光会通过散射,重新从入射平面反方向射出
  

  非金属的折射光会进行散射
  导体的反射会跨越光谱,所以反射是有颜色的,虽然颜色反射在导体里比较罕见的,但在一些日常的材质里(金,铜,黄铜)还是可以看到这种效果,而绝缘体的反射通常是他们的本来颜色,因为金属会吸收所有的穿透光,也就没有任何漫反射(diffuse)部分,但金属氧化的部分和一些表面残留物还是会散射少量的光。也是因为这些原因,可以使用“metalness”(金属度)这种参数,虽然不是纯粹的pbr,但更受美术的喜欢。
 

  不同材质的漫反射颜色,金属为0.
  次级表面散射(Subsurface Scattering)
  从前面的图中,可以看到折射后的散射光从平面不同的点发射出来,和原始的入射点的距离也各不相同,可以统称为次级表面散射光,根据散射出的距离和入射点像素的大小的关系,可以分为两种情况:
 

  如左图所示,当像素的尺寸大于入射到出射点的距离时,这个距离就可以被忽略,可以认为这个平面散射出的光和入射光是在相同点上,也就是右图的样子,也就是我们常说的漫反射。

  

  当像素小于出射到入射距离时,每个点的着色就会收到其他光入射到其他点的影响,也就是常说的“次级表面散射”技术,很重要的一点是,它和普通的漫反射着色是一种物理现象(都是折射光的次级表面散射),唯一不同的就是散射的距离与观察点大小的关系,一个通常被认为是“次级表面散射”的表现,当在较远的距离观察时,就可以被认为是漫反射着色(例如远距离角色的皮肤),而“正规的漫反射着色”在很近距离观察时,也会有次级表面散射的效果。
  无处不在的Fresnel反射
  Fresnel表现的是材质的反射率和入射角(也就是光源入射向量和平面法线向量的夹角)的对应关系,也就是说,入射光的角度越大,反射率也会越强,Fresnel反射项通常成为F( )
  

  以水面为例,正常入射事只有3%的反射,而水平时则几乎到100%。
  PBR的一个改变,就是对fresnel方程的修正上。这个会在下一篇有公式的章节做进一步解释
  对于所以的材质来说,当以掠射角观察时,光滑物体接近“边缘”的地方,会形成完美的镜面,也就是说特定的角度上,“任何表面光滑的物质都可以成为完美镜面”。
除了金属外,大部分的材质的反射和角度对应曲线或梯度的变化都不是很大
 

  非金属的反射系数,在边缘处亮度更高
 

  当入射角度为0时,非金属材质(2%~8%),水和液体是2%,砖块8%,其他有机材质和塑料是5%,半导体和晶体是15%~50% 金属60%~90%
  如果要达到真实的fresnel,那么美术对fresnel的控制应该越少越好,需要提供一些参数值来使用,通常是光泽度(Gloss,或粗糙度 Roughness)和反射率。提供一个基础反射率,来设置平面最小的反射值,让fresnel曲线从这个最小反射值开始,以满足不同角度的需求。
  Surface Reflectance
  前文已经提到了微几何体,之所以有微平面的概念,因为从宏观来看,在我们渲染模型网格时,使用法线贴图就可以描述表面小的细节,但这样仍然会有一定的缺失,很多真实世界的平面上,还是有一些微小的凹陷,裂缝或突起,而用肉眼是很难看清楚的,小到连正常大小的法线贴图也无法来表现,虽然肉眼无法看到,但这些微观特征,还是对Diffuse和Specular产生了影响。
  微平面的细节,对反射的影响更多,也就是Specular,因为粗糙的微平面会把反射光分散或者内部遮挡,所以有了下面两个项目来描述这个现象
  Normal Distribution Function
  因为微几何体的所以平面的方向,并不是均匀分布的,如果是分布比较均匀的光滑平面,那么光就会在几乎相同的方向反射,产生清晰的高光,如果粗糙表面则是模糊的高光. 有多少微平面点的法线更倾向宏观平面的法线方向,我们把这种平面法线方向分布的统计,称之为microgeometry normal distribution function D(),和fresenl方程不同的是,D()并没有一个类似0~1的范围,而是来帮助确定微平面法线在某一个给定方向上的集中度。
  所以,D()决定了高光的镜面反射高光的大小,亮度和形状,一些D()会提供前面提到的类似"Roughness(粗糙度)"的参数(也可以是glossiness),当粗糙度降低时,微几何体平面的法线方向就会更集中在宏观的平面法线方向上,D()的值也会变高。除了指定粗糙度参数外,也可以通过传递一张Glossn map的方式提供更高的细节。
 

  不同Roughness的表现
 

  左侧Specular Map ,右侧 gloss map
  Geometry Function  
  因为微几何体的构造缘故,一些入射光的平面点被内部遮挡,成为了内部阴影而无法接受光照(也就不能反射光)。
  

  shadowing现象
  而有一些反射光被内部遮挡,他们的反射光无法被观察到,虽然有反射光可以多次反弹后再被视点观察到,但在微平面理论里可以忽略不计了。
  

  masking现象
  这因为有这种现象,所以需要有一个Geometry Function G(),来代表反射光的可见度,所以G()是在0~1之间的一个范围值,在着色模型里,有时会和其他参数合并称为V()(Visiblity)。和D()一样,因为微平面有凹凸感,当它的粗糙度提高时,shadow和masking的现象也会增加,粗糙度高的平面会光滑平面更阴暗一些,G()也要收到roughness参数的影响。另外G()也是下面要讲的能量守恒的一个基础,它使得反射光不会高于平面的入射光。
  Energy Conservation 能量守恒
  镜面反射光(Specular)与漫反射光(Diffuse)是相互排斥的,因为离开表面的光总量不能他接受的入射光强,你的漫反射与镜面反射综合不能超过1
   http://www.codecogs.com/favicon.ico[/img]
  这意味着,如果你的希望材质有较高的镜面反射效果(高反射率),就需要要去降低漫反射,能量守恒是PBR的一个重要的方法,可以让艺术家在设置反射率和反照率时(高光颜色和漫反射颜色)不会违法物理定律
  

  同一个材质,从100%的漫反射到100%的镜面反射转化过程
  能量守恒对高光部分的处理,也称为“Energy Preserving Specular”,通常是在渲染方程里添加Normalization Factor来实现的能力守恒
   

  是否使用Normalization Factor的对比,左下面使用Factor的亮度更淡了一些,因为左上非能力守恒的模型反射了更多的光,而下面能力守恒的模型,高光变得更加明亮和集中。
  当把微平面理论引入到着色系统后,那么反射多少光,就要受到平面粗糙度的影响,渲染粗糙度较大的表面时,会获得较大范围和模糊的反射光,而光滑表面的则更清晰。虽然材质都反射相同总量的光,但粗糙平面的会把把反射分散到不同的方向,而光滑平面则反射的更为集中。比如你高光半径提高了10倍,那么暗度将提高100倍。
  

  Gloss的变化的反射效果,Normal Distribution Function(D())也必须是能量守恒所的。
 

  实际应用上漫反射较多而且粗糙的材质,会反射模糊和更广阔的高光,比较光滑而反射率高的材质则反射更明亮和紧凑的高光
  理论概述就先到这里,本文也是从很多资料中整理而来,不能算是原创吧,资料太多,可能收集和描述的不够全面,随着后面章节的添加,这个部分应该还会做进一步的修改。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引