计算机图形学入门24:材质与外观

1.前言

想要得到一个漂亮准确的场景渲染效果,不只需要物理正确的全局照明算法,也要了解现实中各种物体的表面外观和在图形学中的模拟方式。而物体的外观和材质其实就是同一个意思,不同的材质在光照下就会表现出不同的外观,所以外观是光线和材质共同作用的结果。

在自然界中有成千上万的材质表现,因此本文就介绍一下现实中存在的各种类型的材质以及内在的原理。

2.什么是材质

在自然界中的光线与材质共同作用表现出不同的外观,那么在图形学中材质表示什么呢?

材质就是光线在物体表面的反射方式,而无论什么材质,必定满足物理正确的渲染方程,那么渲染方程中和光的反射有关的是哪个呢?

只有BRDF一项和光的反射方式有关,因此材质其实就是BRDF

3.材质分类

3.1 漫反射材质

**漫反射材质(Diffuse / Lambertian Material)**是比较常见的一种材质,往往出现在粗糙的表面,例如木材等。

对于漫反射材质,任何方向的入射光线照射到表面时,都会向半球方向均匀反射。如下图所示。

假设物体表面是白色的,不发光也不吸收光,且入射的光都是大小相同且方向均匀的。那么根据能量守恒,所有反射出去的光线的能量(Irradiance)等于所有入射光线能量(Irradiance),并且反射的光也是大小相同且方向均匀的。

那么,就可以把这个渲染方程写出来。

这里入射的Radiance是常数,BRDF(Diffuse)也是常数,这两项就可以拿出去,整个式子就变成了对半球上一个cosθ 的积分,积分出来是π

那么整个式子就变成了 Lo=πfrLi ,又因为能量守恒,入射的Radiance等于出射的Radiance,所以 Li=Lo ,因此 fr=1/π

这时候就是完全不吸收能量的BRDF,这里定义一个反射率albedo (ρ)的概念,这个值可以是一个一维标量,也可以是RGB等三维标量,让反射率albedo在0到1之间,这样就可以引入不同颜色的BRDF,BRDF的值就是albedo / π ,取值范围是**[0, 1/π]**。

3.2 镜面反射材质

有完美反射的镜面反射材质(Ideal reflective material),在现实中不多见,例如镜子等。

对于镜面反射材质,入射光线照射到表面后,会沿反射方向反射,入射光线与面法线的夹角等于反射光线与面法线的夹角。如下图所示。

反射方向计算相对容易,如下图所示,已知入射光ωi 、入射角θi 、法线方向n ,求反射光ωo

根据向量的平行四边形法则 ,入射光ωi 加反射光ωo 的结果为入射光在法线方向的投影的2倍,投影可直接点乘求得,因此可得。

3.3 光泽反射材质

**光泽反射材质(Glossy material)**也比较常见,介于漫反射与镜面反射之间,看起来比镜面反射模糊,例如抛光金属、铜镜等。

对于光泽反射材质,入射光线照射到表面时,会沿反射方向的一定范围内反射。如下图所示。

3.4 折射材质

**折射材质(Refractive material)**也比较多见,例如水、玻璃等。

折射材质往往也有部分反射,光线在穿过两种透明介质之间的平面时,部分能量会折射入物体内部,其余的能量会反射出去。如下图所示。

在折射时入射角θi 与折射角θt的关系与平面两侧透明介质的折射率有关,当光线从折射率小的透明物体(例如空气)射入折射率大的透明物体(例如水)中时,折射角会小于入射角,如下图所示。

折射定律 (Snell's Law) 满足公式如下。其中nint 分别代表平面两边透明介质的折射率(IOR) ,如上图所示上半部分为ni ,下半部分为nt

通过折射定律可以算出折射角度。

根据三角函数的关系如下。

结合折射定律公式,推导出折射角的余弦值cosθt如下。

注意,这里是有求平方根操作的,而当根号内小于0 时求平方根是无意义的,那么根号内会有小于0的情况吗?

显然,当ni/nt 大于1 ,并且θi 的比较大时,可能会出现求折射角无意义的情况,也就是全反射现象(Total Internal Reflection)。如下图所示。

就是当入射介质的折射率大于折射介质的折射率,这样就有可能出现没有折射的全反射现象。下面举个现实中的例子。

当人在水底往各个方向去看,只能看到一个锥形的区域。如下图所示。

常见物体的折射率如下。

对于折射来说BRDF (Bidirectional Reflectance Distribution Function,双向反射分布函数 )自然就不适用了,折射适用于BTDF (Bidirectional Transmittance Distribution Function,双向透射分布函数 ),两者可以统称为BSDF(Bidirectional Scattering Distribution Function,双向散射分布函数)。

3.5 菲涅尔反射

**菲涅尔反射(Fresnel Reflection)**是现实中很常见的现象。入射光线与平面的夹角除了影响折射的效果以外,也影响反射的效果,如下图所示。

从图中可以看出,桌面的反射效果和视线与桌面的夹角有关,视线越平行桌面,桌面的反射效果越强,书的倒影越清晰;视线越垂直桌面,桌面的反射效果越弱,书的倒影越模糊。

简单来说,就是物体的反射率其实与观察角度有关,对于绝缘体来说观察角度与法线夹角越大,反射的程度就越高,如下图中的红线。

而导体则与绝缘体不同,他的反射率与夹角呈如下关系。

金属的菲涅尔反射现象确实不明显,从哪个视角观察反射效果都比较清晰。

对于任意一个物体的精确反射率的计算公式如下。

这里考虑了两个极化,然后再求平均,公式的推理过程暂时不必深究,只要知道,物体的反射率和入射角度、入射空间的折射率、物体的折射率有关就可以了,通过该公式就能得出正确的反射率。

对于精确的算法来说,计算量是非常大的,因此有人提出了个简单的算法,大幅降低计算量来得到比较近似的效果,如下所示。

3.6 微平面材质

所谓**微平面材质(Microfacet Material)**就是当从远处看物体表面时,看不到物体细节,看到的是最终表面对光形成总体的效果。如下图所示。

说到微平面材质就不得不提微平面理论(Microfacets Theory) ,微平面理论就是从微观的角度去分析,认为任意物体的表面都是由许许多多的更小的镜面所组成,并且每个微小的平面都有自己的法线方向。

当这些微小的镜面的法线分布较为集中一致(从数学上看它们的方差较小)的时候,从宏观角度来看,物体的表面会显得比较光滑,镜面反射比较明显;反之,当这些微小镜面的法线方向分布较为杂乱的时候,物体的表面则会显得相对粗糙,漫反射比较明显。如下图所示。

而根据微平面理论和BRDF,也就可以推导出微平面BRDF(Microfacet BRDF)。

微平面BRDF首先考虑菲涅尔反射F(i, h) ,然后考虑法线分布D(h) ,这里又用到了半程向量h(入射方向与观察方向的中间向量hDir),只有当微表面的法线方向在半程向量周围一个限定的范围之内时,才能将光反射出去。

中间那一项G(i, o, h) 是考虑微表面之间的光线遮挡 ,比如当光线接近平行平面的时候,入射光线可能无法照射到一些微平面,这种情况称为Shadowing (如下图左),或者反射光线无法正常到达人眼,称为Masking(如下图右)。也就是当光线越接近平行物体表面的时候,这一项越容易发生。

微平面材质可以描述各种各样物体表面,比如金属、木质、橡胶等。

3.7 各向同性/各向异性材质

一些金属表面,往往会进行一些磨砂处理,在表面形成沿一定方向的划痕(如上图所示),也就是微表面存在明确的方向性,从而影响反射的效果,这样的材质就称其为各向异性材质(Anisotropic Materials) ;反之微表面不存在一定的方向性或者方向性很微弱的材质就称为各向同性材质(Isotropic Materials)。材质就可分为这两类。如下图所示。

从BRDF上考虑 :BRDF原来是两个方向的函数θi、φi 是输入方向,θr、φr 是输出方向。如果BRDF满足在方位角上旋转,得到的还是相同的BRDF(沿一个方位角θφ 的中心旋转,相对位置不变),就称为各向同性 ;如果相对位置改变,BRDF改变,则称为各向异性

对于各向同性材质,BRDF只和相对的方位角有关,即φr-φi,因此原来四维的BRDF,就可以写成三维的。

所有的BRDF,由于具有可逆性(交换入射方向和出射方向,得到的BRDF的值相同),因此相对方位角不用考虑正负,因此也可以写成方位角之差的绝对值,不用考虑大小或者正负关系。

4.BRDF的性质

1.BRDF是非负的(Non-negativity),表示了能量的分布。

2.BRDF是线性的(Linearity),可以拆分和叠加。

3.BRDF是可逆的(Reciprocity principle),调换入射方向和出射方向依然成立。

4.BRDF满足能量守恒(Energy conservation),入射能量等于反射能量(存在能量吸收的情况时,入射能量大于反射能量)。

相关推荐
gameckisme7 天前
Selfloss,官方中文,解压即玩,
游戏·unity·游戏程序·图形渲染·cocos2d·贴图·游戏策划
refineiks8 天前
three.js使用3DTilesRendererJS加载3d tiles数据
前端·3d·图形渲染·webgl
Padid8 天前
文章-深入GPU硬件架构及运行机制 学习后记
笔记·学习·硬件架构·图形渲染·着色器
Padid11 天前
OpenGL GLFW OIT 实现
c++·笔记·学习·图形渲染·着色器
玖er悠11 天前
Unity Shader实现简单的各向异性渲染(采用各向异性形式的GGX分布)
unity·图形渲染
米芝鱼14 天前
UnityShader自定义属性特性
开发语言·游戏·unity·游戏引擎·图形渲染·着色器
米芝鱼15 天前
UnityShaderGraph 卡通水面效果
游戏·unity·游戏引擎·图形渲染·着色器
知心宝贝15 天前
【小程序 - 大智慧】深入微信小程序的核心原理
开发语言·javascript·算法·微信小程序·小程序·前端框架·图形渲染
2401_8566522115 天前
高清无损!探索PDF转JPG的最佳实践工具
图像处理·学习·自然语言处理·pdf·图形渲染
是jin奥18 天前
Ubuntu 搭建 GLFW 环境及其相关测试 demo
linux·ubuntu·图形渲染