Games101 图形学入门笔记

材质与外观

自然界中的材质

  • 首先了解自然界中的材质

    演示图片

    如上这幅图,不同的物体、场景、组合,会让我们看到不同的效果

    但是归根到底就一个核心:光线如何传播的,又是如何跟物体作用的。

    研究自然界中的材质,就是在研究光线如何传播

计算机图形学中的材质

由于渲染方程是几乎100%正确的,那么方程中一定有一项是描述材质的,材质 == BRDF如下3D的由四边形组成的模型,右边是渲染后的图,表现为陶瓷杯,为啥就能看出是陶瓷? 因为在渲染方程中通过对BRDF函数的定义,使杯子表现了一定程度的镜面反射+漫反射,给人一种陶瓷感。

演示图片

漫反射材质(BRDF)

演示图片

漫反射的BRDF推导过程:

  • 假设入射光是均匀分布在半球上的并且处处相等,漫反射光也同入射光一样,均匀的分布,且处处相等。

  • 由能量守恒可以知道入射的照度Irradiance == 出射的Irradiance,并且入/出射都是均匀分布,那么他们任一单位立体角方向的通量即Radiance必须一样,即 Lo = Li 建立渲染方程如下:

  • 对cosθ在半球上的定积分结果为π,最终可得到完全不吸收能量的漫反射BRDF为:fr = 1 / π

  • 其中还定义了 ρ 反射率albedo,可以是单通道(0\~1)、三通道(RGB),从而可以引入不同颜色的漫反射BRDF

    演示图片

抛光/毛面金属材质(BRDF)

演示图片

完全镜面反射+折射材质(BRDF)

这些材质的BRDF比较难计算,有兴趣的再去深入了解吧

演示图片

镜面反射方向计算

  • 先画图,注意三个方向都是单位向量,入射出射角度相等

  • 根据平行四边形法则,可以构建方程解出出射方向向量:ωo

  • 解释一下:ωi + ωo = 2 · 红线向量,红线向量: $cos\theta_i$ · |ωi|。平行四边形最长的那根对角线长度为 $2cos\theta_i$** · |ωi|** ,|ωi| = 1可以省略,即 $2cos\theta_i$,但这只是个标量,所以用这个标量乘以方向向量n,就得到对角线这一段向量为 $2cos\theta_i$** · n** ;角度θ用点乘算出。 最终得到下面等式,即可得到出射方向

    演示图片

    演示图片

计算镜面反射方向其实还是有那么点麻烦的吧,所以之前进行Blinn-Phong模型着色计算时,高光项判断出射方向是否足够接近镜面反射,用的是半程向量half vector跟法线n来比,半程向量计算非常简单:入射+出射然后单位化就行了。

立体角可以拆解成方位角φ+天顶角θ

这里是方位角(天顶角看上面这张图就行了)

演示图片

对于这两个角度属性,在镜面反射中的关系为:

方位角:φo = (φ + π)mod 2π

天顶角:θi = θo

折射方向计算

光从一种介质进入到另一种介质就会发生折射。

第三幅图水底的这种现象称为caustics,这是由于水面凹凸不平,水底某些点会聚集较多的光线,有点聚焦的意思。

演示图片

演示图片

演示图片

折射方向计算:

斯内尔定律(Snell’s Law): 给出了描述光从一种介质传播到另一种介质时是如何折射的方程: $\bm{\eta_isin\theta_i = \eta_tsin\theta_t}$

必须知道两种材质的折射率η,和入射角度θi,方能算出θt,再结合φt 就能得到ωt

演示图片

折射发生的条件:

  • 光疏介质->光密介质:必然折射

  • 光密介质->光疏介质:根据入射角度大小,过大可能就没有折射而是全反射

    所以会有一个全反射和折射的临界角

证明:

  • 由折射方程:ηisinθi = ηtsinθt

  • 借助cosθt进行判断(用sinθt的话证明会复杂一些)

    演示图片

    演示图片

  • 看根号内的式子(首先 $1-cos^2\theta_i$ < 1 恒成立)

    当**ηi/ηt < 1**,根号下式子 > 0,等式有意义,必然发生折射 。

    ηi/ηt > 1,具体看$1-cos^2\theta_i$ 的大小,如果入射角 $\theta_i$比较大,根号下式子可能会 < 0。

例子:水介质和光介质

演示图片

  • 两个角度看这张图:

    (1)光从空气射入水中,可以明显看到,空气中不管角度多大都会发生折射

    (2)记住图形学中考虑问题都是摄像机发射光线,光线从水中射入空气,只能看到大概97.2°的一个锥形区域的光,角度再大一点就发生全反射了。所以超过这个锥形区域,其他地方的光都射向水底了,比较黑。

BRDF:双向反射分布函数,用于计算反射光,BTDF:双向透射分布函数,用于计算折射光BRFD 和 BTDF 统称为BSDF一般生活中也可直接用BRDF,不区分BTDF BSDF

菲涅尔项(Fresnel Term)

反射率取决于入射角度,入射光与法线的夹角越大,反射的能量越多

  • 从书上反射出的光,射到桌面然后反弹到人眼中,如果入射光跟法线夹角比较小(左1),则几乎看不到桌面的倒影,即反射能量比较少;当入射光跟法线夹角特别大,几乎接近90°的时候,桌面会形成比较明显的书的倒影,也就是能量衰减得比较少。

    演示图片

    入射角度与反射率关系曲线图

    • 绝缘体(非金属)

      可以看到如果一根光线跟法线几乎成90°的话,反射率几乎为1,没有能量损失

      虚线可以不看,这部分是偏振光的性质,实线是两个方向偏振光取平均的结果,看红实线即可

      演示图片

  • 导体(金属物品)

    不管什么角度反射率都蛮高的

    演示图片

    菲涅尔项的计算

    • 精确计算菲涅尔项(没有必要)

      求s、p偏振光的菲涅尔项,然后取两者的平均作为最终结果

      计算挺复杂,明白这玩意儿跟出/入射角度介质反射率η有关就行了

      演示图片

    • 近似计算:Schlick’s approximation(性价比更高)

      • R(θ)函数,自变量θ为入射光线与法线夹角,定义域在[0°,90°],返回值为反射率,值域[0,1]

      • Schlick提出这个计算方式,其实就是重新拟合了一条曲线,近似的表现上面介绍的“入射角度与反射率关系曲线图”。R0就是入射光与法线夹角为0时的反射率。

      • 我们如果代入θ = 0,θ = 90,进去算很容易看出R(0) = R0,R(90) = 1 ,还是比较正确的。这个函数同时适用于导体和绝缘体。

        演示图片

在这里提到菲涅尔项的目的:引出微表面材质/模型

微表面材质(Microfacet Material)

研究微表面材质的动机是什么?—— 因为现实生活中,确实有这种现象存在

  • 如下,卫星拍摄的一幅图, 可以看到那一片高光,很神奇很不对劲,因为这是地球,地球表面是凹凸不平的,但是在目前的角度和距离下,这片高光的效果就跟它表面是个略有粗糙度的平面一样。
  • 只要当视角离得足够远,我们看不到表面的细节,只能看到光对该表面整体的作用结果

演示图片

微表面模型Microfacet Theory/Model

对于看向一个粗糙表面

  • 宏观上:平坦且略有粗糙
  • 微光上:凹凸不平,且每个微元都认为只发生镜面反射

总之,要有这么一个概念:从近处看能看到不同的几何细节,拉远后细节消失,看到的是材质

为什么会发生漫反射?因为粗糙的物体表面在微观上可以看成超级多细小的镜子,他们的朝向/法线各不相同,他们会把光线反射到四面八方.

微表面BRDF

  • 对于glossy毛面的材质,微表面的法线方向其实差不多,

    演示图片

    把他们的分布画出来,会集中在宏观的法线周围(宏观即不看微表面,镜头拉远后忽略细节,法线正直朝上)

    材质的效果如右图所示

    演示图片

    演示图片

  • 对于特别粗糙的材质,微表面法线分布图(左),渲染效果(右)

    演示图片

所以,通过微表面理论,我们可以把表面的粗糙程度用 微表面的法线分布 来表示

  • 如果微表面法线分布集中 ==> glossy
  • 如果微表面法线分布分散 ==> diffuse

那么对于微表面而言,入射光 ωi 反射到 ωo 方向会有多少能量?

微表面的 BRDF (双向反射分布函数 f(i,o))

  • 注意:微光上对于表面任意一个点来说,是镜面反射

    演示图片

  • F(i,h):Fresnel Term 菲涅尔项。给定入射方向 ωi 和半程向量h方向,返回反射方向的反射率,值域[0,1]

  • D(h) :Distribution of normals 微表面的法线分布。给定一个半程向量h,返回法线位于该方向的微表面数量

  • G(i,o,h):Shadowing Masking Term 阴影遮蔽,也叫几何项。 当入射光以非常平(Grazing Angle 掠射角度)的射向表面时,有些凸起的微表面就会遮挡住后面的微表面。这一项其实就起修正作用,当入射为掠射角度时,这一项可能就会返回一个比较小的数比如0.5 0.4之类的,把BRDF的返回值拉低一点。 如果没有这一项,假如我们渲染一个球,球的边界上,就会是掠射角度,会特别亮。(看分子 菲涅尔项F(i,h) 返回值接近1,D(h) 的返回值也会很大,因为微表面法线分布基本是正态分布,又因为入射很平,半程向量很居中,微表面的数量是最多的,返回值就大。最终就造成BRDF返回值比较大,反射光的能量只会减少很少的两,因此边缘着色特别亮。)

这个微表面、glossy、diffuse、这那滴各种材质,都是渲染方程中的BRDF项 fr

微表面模型渲染出来的效果特别真实

演示图片

现在特别火的PBR——physically Based Rendering 就一定会使用微表面模型。为了更好的效果和表现,工业界有很多自己开发的不同种类的微表面模型,但是都是基于上面介绍的微表面模型搞出来的 核心是不变的。

各向同性/异性材质(BRDF)以及区分方式

电梯间的四周的材质是这种沿某方向磨过的金属,它的高光表现如下所示,这是种各项同性材质。

演示图片

Isotropic Material:各向同性材质,各个方向法线分布是差不多的

Anisotropic Material:各项异性材质,各个方向法线分布是不同的,如沿着某个方向刷过的金属

演示图片

这两种BRDF的区分方式:

  • 各向同性材质:BRDF值只跟相对方位角有关,BRDF函数可以从四维降成三维
    • 什么意思?—— 对于各向同性材料,不管入射方位角 φi ,和出射方位角 φr ,怎么变化,只要这俩角度的相对差值 |φi - φr| 没变,那BRDF就不变,加绝对值是因为光的可逆性,下面公式也可以加上问题不大。

    • 具体来说,入射方向和出射方向的方位角同时绕着色点随便怎么转,只要 |φi - φr| 不变,BRDF返回值不会变,着色结果相同。

      演示图片

  • 各项异性材质:绝对方位角(各自的φ)有关,只要任意一方的方位角改变,就会呈现比较大的差别

演示图片

6 BRDF的性质总结
\===========

  • (1)非负性fr**(ωi ->ωr ) ≥ 0**

  • (2)线性:BRDF可以分成多项分别计算后相加(类似Blinn-Phong模型分成高光+漫发射+环境光)

    演示图片

  • (3)可逆性:调换BRDF的入射光和出射光,返回值是一样的

    演示图片

  • (4)能量守恒:不能违背能量守恒原则。下面公式,其实可以看做是半球上所有方向入射光的能量Li总 的一个系数,这个系数必须满足 ≤ 1

    演示图片

  • (5)各向异性/各向同性BRDF:不管是各项同性还是异性材质都遵循光的可逆性,互换出入射光,BRDF返回值不变。

    • 各向同性材质BRDF:跟出入射方位角无关,跟他们相对差值有关,因此四维BRDF函数变成三维。保持相对静止,方位角随便怎么旋转,BRDF返回值不变。

      演示图片

      并且满足光的可逆性,交换出入射光,数值不变;方位角也不用管谁大谁小。

      演示图片

    • 各向异性材质BRDF:跟绝对方位角有关。

7 测量BRDF的方式
\===========

前面对于BRDF的讨论都隐藏了BRDF的定义细节,相当于它还是个黑盒子,BRDF怎么定义的?
不通过实践测量的,用理论得出的BRDF函数都是耍流氓,是不准确的。像之前的菲涅尔项,就不准确,现实中的真正的效果并不是曲线描述的那样。

对一个材质的BRDF的测量,工作量非常大

测量过程: 固定光源在某一个入射角,用一个摄像机在整个球面的不同出射角进行拍摄,最终得出在这个入射角下对应的所有出射角的能量分布。然后再把光源换到另一个角度,重复此操作,直到光源遍历了球面所有角度为止。

演示图片

从而得出一般测量方法:

入射出射方向可以互换

演示图片

每移动一次光源,摄像机就要遍历整个球面,在移动光源,循环往复,效率还是很低的。

以下这几种情况,是可以提高效率的:

  • 各向同性的材质,可以把4D降到3D的
  • 由于光的可逆性,工作量可以减少一半
  • 不用采样那么密集,就采样若干个点,其中间的点可以插值出来
  • …还有很多方法,这里省略了

当前有关于测出来的庞大的BRDF数据如何存储的研究

  • 神经网络压缩数据
  • * *