0 介绍材质与外观
研究材质,主要是在研究材质与光线如何作用 Material == BRDF
0.1 自然界中的不同材质 The Appearance of Natural Materials

- 海浪通透的质感,含盐度不同也会影响海浪的颜色
- 一束光投到洞穴内会形成光柱,看到东西一定是因为有光到达了眼睛,这里牵扯到散射
- 头发在周围一圈透光性很强,成百上千根头发之间如何作用
- 布料的质感一眼就能看出来是布,而不是金属
- 蝴蝶的翅膀由不同的鳞片组成的,鳞片很多本身是无色的,为什么叠在一起会形成不同的颜色
- 为什么能看到彩虹、双彩虹现象
- 光线打在鱼肉上的次表面散射现象
- 自然界中有无数种材质,非常强大的渲染器Manuka只有40种材质,要达到真实的效果需要依靠强大的艺术家采用一些非物理的方法
1 漫反射材质 Diffuse / Lambertian Material (BRDF)
- “理想漫反射”本身就是这样定义的:不管光从哪来,也不管你从哪看,表面都一视同仁地把光均匀散出去。
既然它对方向没有偏好,那么 BRDF 就不能依赖方向,只能是常数。
- 在 Bling-Phong 模型的时候,我们曾经经验性地使用 \(Intensity/R^2\) 定义漫反射系数,现在要准确地定义。
- 漫反射材质意味着光线从哪个方向进入都会被均匀地反射到各个方向上去,
现在我们人为制造一个任何方向上进入的 radiance 都相同的空间,假设有一点不发光不吸收光,利用能量守恒可以认为入射和出射的 irradiance 是相同的,又因为入射光和出射光都是均匀的,所以它们的 radiance 也相同,则 \(L_i = L_o\),渲染方程化简后(对半球上 \(\cos\theta\) 的积分结果是 \(\pi\))可以得到 BRDF 函数 \(f_r = 1/\pi\)(否则等式两边不相等) - 但材质不可能一点不吸收光 / 不发光,因此我们可以定义一个反射率 albedo,取值在 0 到 1 之间,则漫反射系数 \(f_r = \rho/\pi\),取值在 0 到 \(1/\pi\),即完全吸收和完全不吸收光时所对应的值

2 光泽材质 Glossy Material (BRDF)
这种材质散射规律是在镜面反射方向附近,一小块区域进行均匀的散射

3 理想反射/折射材质 Ideal Reflective / Refractive Material (BSDF*)
这种材质与光的作用方式可分为射入和射出(默认折射率η比空气大)
- 从空气射入材质内部,则一定是镜面反射+折射同时发生
- 如果从材质内部射入空气,则分两种情况
- 镜面反射+折射
- 不满足折射条件,仅镜面反射

3.1 完美镜面反射 Perfect Specular Reflection BRDF
- 利用平行四边形法则 / 利用方位角,俯视下两个方位角整好相反(即相差\(pi\))

用天顶角 polar angle / zenith angle \(\theta_i\) \(\theta_o\) 计算镜面反射方向有点复杂,所以之前进行Blinn-Phong模型着色计算时,高光项判断出射方向是否足够接近镜面反射时,没有用镜面反射方向与出射方向做比较,而是用半程向量half vector跟法线n来比,半程向量计算非常简单:入射+出射然后单位化就行了。
但如果用方位角 azimuth angle \(\phi_i\) \(\phi_o\)的形式来描述三维空间的一个方向,则出射方向计算很简单

3.2 折射 Specular Refraction
- 我们仍然采用几何光学的说法来描述折射,没有涉及到波
- 白光分解为不同颜色考虑折射率不同,右下角海水的折射产生的现象是Caustics(焦散是由于水面凹凸不平,水底某些点会聚集较多的光线,有点聚焦的意思。这种地方对于渲染来说是灾难)

3.2.1 折射定律 Law of Refraction
- 入射角正弦值×入射材质折射率=折射角正弦×出射材质折射率 Transmitted angle depends on index of refraction (IOR) for incident ray and exiting ray
- 入射光和出射光的方位角相反,相差
- 钻石的折射率很高,不同波长的光会被折射的程度就会相差比较大,因此看起来闪闪发光、五颜六色

3.2.2 全反射现象 Total internal reflection
折射发生的条件
- 光疏介质→光密介质:必然折射
- 光密介质→光疏介质:根据入射角度大小,过大可能就没有折射而是**全反射**,所以会有一个全反射和折射的临界角
- 证明:由折射方程:\(\eta_i\sin\theta_i = \eta_t\sin\theta_t\),结合 \(\sin^2\theta + \cos^2\theta = 1\) 可知: \[ \begin{aligned} \cos\theta_t &= \sqrt{1 – \sin^2\theta_t} \\ &= \sqrt{1 – \left(\frac{\eta_i}{\eta_t}\right)^2 \sin^2\theta_i} \\ &= \sqrt{1 – \left(\frac{\eta_i}{\eta_t}\right)^2 (1 – \cos^2\theta_i)} \end{aligned} \] 对应的不等式为: \[ 1 – \left(\frac{\eta_i}{\eta_t}\right)^2 (1 – \cos^2\theta_i) < 0 \]
- 分析根号内的式子 (首先 \(1-\cos^2\theta_i < 1\) 恒成立)
- 当 \(\eta_i/\eta_t < 1\),根号下式子 \(> 0\),等式有意义,必然发生折射。
- 当 \(\eta_i/\eta_t > 1\),具体看 \(1-\cos^2\theta_i\) 的大小,如果入射角 \(\theta_i\) 比较大,根号下式子可能会 \(< 0\),当根号下的值等于 0:刚好到分界,这个入射角就是临界角
例子:水介质和光介质

两个角度看这张图:
(1)光从空气射入水中,可以明显看到,空气中不管角度多大都会发生折射
(2)记住图形学中考虑问题都是摄像机发射光线,光线从水中射入空气,只能看到大概97.2°的一个锥形区域的光,角度再大一点就发生全反射了。所以超过这个锥形区域,其他地方的光都射向水底了,比较黑
3.3 双向散射分布函数 BSDF(Bidirectional Scattering Distribution Function)
- BRDF中的R表示反射 Reflectance,我们还需要一种描述折射的函数叫BTDF,其中T是折射 Transmittance
- BSDF=BRDF+BTDF,平常我们说BRDF其实也包括反射,很少有人严格区分这个概念
3.4 菲涅尔项 Fresnel Reflection / Term
反射率取决于入射角度,入射光与法线的夹角(入射角)越大,反射的能量越多
从书上反射出的光,射到桌面然后反弹到人眼中,如果入射光跟法线夹角比较小(左1),则几乎看不到桌面的倒影,即反射能量比较少;当入射光跟法线夹角特别大,几乎接近90°的时候,桌面会形成比较明显的书的倒影,也就是能量衰减得比较少。

绝缘体(非金属)
可以看到如果一根光线跟法线几乎成90°的话,反射率几乎为1,没有能量损失
虚线可以不看,这部分是偏振光的性质,实线是两个方向偏振光取平均的结果,看红实线即可

导体(金属物品)
不管什么角度反射率都蛮高的

菲涅尔项的计算
菲涅尔项的计算 – 精确计算菲涅尔项(没有必要)
求s、p偏振光的菲涅尔项,然后取两者的平均作为最终结果 – 计算挺复杂,明白这玩意儿跟出/入射角度、介质反射率η有关就行了

近似计算:Schlick’s approximation(性价比更高)
\[ \begin{aligned} R(\theta) &= R_0 + (1 – R_0)(1 – \cos\theta)^5 \\ R_0 &= \left( \frac{n_1 – n_2}{n_1 + n_2} \right)^2 \end{aligned} \]
\(R(\theta)\) 函数,自变量 \(\theta\) 为入射光线与法线夹角,定义域在 \([0^\circ,90^\circ]\),返回值为反射率,值域 \([0,1]\),\(n_1\),\(n_2\) 是两种介质的折射率
因为原来的计算方式太复杂了,近似地表现上面介绍的“入射角度与反射率关系曲线图”
我们如果代入 \(\theta = 0\),\(\theta = 90^\circ\),进去算很容易看出 \(R(0) = R_0\),\(R_0\) 就是入射光与法线夹角为 0 时的反射率,\(R(90^\circ) = 1\),还是比较正确的。这个函数同时适用于导体和绝缘体。
在这里提到菲涅尔项的目的:引出微表面材质/模型
4 微表面材质(Microfacet Material)
研究微表面材质的动机是什么?—— 因为现实生活中,确实有这种现象存在
- 如下,卫星拍摄的一幅图,这片高光的效果看起来像平面,但我们知道它是凹凸不平的
- 只要当视角离得足够远,我们看不到表面的细节,只能看到光对该表面整体的作用结果

微表面模型假设:物体的表面是粗糙的,从远处看是一个粗糙的平面,从近处看是一个凹凸不平的、每一个微元都是镜面反射的平面(即从远处看看到的是材质/外观,从近处看看到的是几何)
为什么会发生漫反射?因为粗糙的物体表面在微观上可以看成超级多细小的镜子,他们的朝向/法线各不相同,他们会把光线反射到四面八方

- 有了上述假设我们可以找到微表面法线的分布和材质的关系 the distribution of microfacets’ normals
- Glossy的材质说明微表面的法线方向分布比较集中

Diffuse的材质说明微表面的法线方向分布比较分散

所以,通过微表面理论,我们可以把表面的粗糙程度用 微表面的法线分布 来表示
- 如果微表面法线分布集中 ==> glossy
- 如果微表面法线分布分散 ==> diffuse
微表面模型的BRDF F为菲涅尔项,用来查询不同的入射出射方向,由多少光线被反射 D为法线分布,用来查询有多少微表面的法线分布在半程向量方向 G是因为微表面上的起伏可能发生互相遮挡,有些微表面会失去它的作用。几乎和表面平行的光线容易发生互相遮挡的现象,我们把这种光线角度称为Grazing Angle,G这一项就是为了修正它,让它不要过亮
4.1.1 微表面的 BRDF (双向反射分布函数 f(i,o))
注意:微观上对于表面任意一个点来说,是镜面反射(PS: 往特定方向集中,和能量吸收无关)
- 输入是入射方向 \(i\) 和出射/观察方向 \(o\)
- 输出是这对方向下的 BRDF 值,表示反射强度密度

- D(h):Distribution of normals 微表面的法线分布。
- 返回法线位于给定的半程向量 \(\boldsymbol{h}\)方向的微表面数量
- 因为只有法线恰好是半程向量 h 的那些微平面,才能把光从 i 精准反射到 o(进入相机), 其他法线方向的微平面,会把光反射到别的方向,我们看不见
- F(i,h):Fresnel Term 菲涅尔项
- 给定入射方向 \(\boldsymbol{\omega_i}\) 和半程向量 \(\boldsymbol{h}\) 方向
- 返回反射方向的反射率,值域 \([0,1]\)
- G(i,o,h):Shadowing Masking Term 阴影遮蔽,也叫几何项
- 当入射光以非常平(Grazing Angle 掠射角度)的射向表面时,有些凸起的微表面就会遮挡住后面的微表面。这一项其实就起修正作用,当入射为掠射角度时,这一项可能就会返回一个比较小的数比如 0.5、0.4 之类的,把 BRDF 的返回值拉低一点。如果没有这一项,假如我们渲染一个球,球的边界上,就会是掠射角度,会特别亮。(看分子:菲涅尔项 F(i,h) 返回值接近 1,D(h) 的返回值也会很大,因为微表面法线分布基本是正态分布,又因为入射很平,半程向量很居中,微表面的数量是最多的,返回值就大)
- 微面元虽然方向对了,但它可能被旁边别的微面元挡住
- 当入射光以非常平(Grazing Angle 掠射角度)的射向表面时,有些凸起的微表面就会遮挡住后面的微表面。这一项其实就起修正作用,当入射为掠射角度时,这一项可能就会返回一个比较小的数比如 0.5、0.4 之类的,把 BRDF 的返回值拉低一点。如果没有这一项,假如我们渲染一个球,球的边界上,就会是掠射角度,会特别亮。(看分子:菲涅尔项 F(i,h) 返回值接近 1,D(h) 的返回值也会很大,因为微表面法线分布基本是正态分布,又因为入射很平,半程向量很居中,微表面的数量是最多的,返回值就大)
现在特别火的PBR——physically Based Rendering 就一定会使用微表面模型。为了更好的效果和表现,工业界有很多自己开发的不同种类的微表面模型,但是都是基于上面介绍的微表面模型搞出来的 核心是不变的。
5 各向同性/异性材质(BRDF)以及区分方式
电梯间的四周的材质是这种沿某方向磨过的金属,它的高光表现如下所示,这是种各项同性材质

Isotropic Material:各向同性材质,微表面不存在方向性,各个方向法线分布是差不多的,
Anisotropic Material:各项异性材质,微表面存在方向性,各个方向法线分布是不同的,如沿着某个方向刷过的金属

在三维里,一个方向通常要用两个角来描述:\(\theta\) 是和法线的夹角,叫天顶角/极角;\(\phi\) 是绕法线转了多少,叫方位角。所以入射方向 \(i\) 要写成 \((\theta_i, \phi_i)\),出射方向 \(o\)(或 \(r\))要写成 \((\theta_r, \phi_r)\),于是 \(f(i,o)\) 展开后就是 \(f_r(\theta_i, \phi_i; \theta_r, \phi_r)\)。所以BRDF是一个四维函数 \(f_r(\theta_i, \phi_i, \theta_o, \phi_o)\)。
这两种BRDF的区分方式:
各向同性材质:BRDF值只跟相对方位角有关,BRDF函数可以从四维降成三维
- 什么意思?——对于各向同性材料,不管入射方位角 \(\boldsymbol{\phi_i}\) 和出射方位角 \(\boldsymbol{\phi_r}\) 怎么变化,只要这俩角度的相对差值 \(|\boldsymbol{\phi_i} – \boldsymbol{\phi_r}|\) 没变,那BRDF就不变,加绝对值是因为光的可逆性,下面公式也可以加上问题不大。
- 具体来说,入射方向和出射方向的方位角同时绕着色点随便怎么转,只要 \(|\boldsymbol{\phi_i} – \boldsymbol{\phi_r}|\) 不变,BRDF返回值不会变,着色结果相同。
\[ f_r(\theta_i, \phi_i; \theta_r, \phi_r) = f_r(\theta_i, \theta_r, \phi_r – \phi_i) \]
各项异性材质:BRDF值与绝对方位角(各自的\(\phi\))有关,只要任意一方的方位角改变,就会呈现比较大的差别


6 BRDF的性质总结
- 非负性:\(f_r(\omega_i \to \omega_r) \ge 0\)
- 线性:BRDF可以分成多项分别计算后相加(类似Blinn-Phong模型分成高光+漫发射+环境光)

- 可逆性:调换BRDF的入射光和出射光,返回值是一样的 \[ f_r(\omega_r \to \omega_i) = f_r(\omega_i \to \omega_r) \]即\[ \frac{dL_o(\omega_o)}{L_i(\omega_i) \cos\theta_i \, d\omega_i} = \frac{dL_o(\omega_i)}{L_i(\omega_o) \cos\theta_o \, d\omega_o} \]

- 能量守恒:不能违背能量守恒原则。下面公式,其实可以看做是半球上所有方向入射光的能量\(L_i\)的一个系数,这个系数必须满足≤1
- \[ \forall \omega_r, \int_{H^2} f_r(\omega_i \to \omega_r) \cos\theta_i \,\mathrm{d}\omega_i \le 1 \]
- 把半球上所有入射方向的光都一起考虑后,某个出射方向最多只能拿到不超过输入总能量的那一份
- 各向异性/各向同性BRDF:都遵循光的可逆性,互换出入射光,BRDF返回值不变
- 各向同性材质BRDF:跟出入射方位角无关,跟他们相对差值有关
因此四维BRDF函数变成三维。保持相对静止,方位角随便怎么旋转,BRDF返回值不变。 \[ f_r(\theta_i, \phi_i; \theta_r, \phi_r) = f_r(\theta_i, \theta_r, \phi_r – \phi_i) \] 并且满足光的可逆性,交换出入射光,数值不变;方位角也不用管谁大谁小。 \[ f_r(\theta_i, \theta_r, \phi_r – \phi_i) = f_r(\theta_r, \theta_i, \phi_i – \phi_r) = f_r(\theta_i, \theta_r, |\phi_r – \phi_i|) \] - 各向异性材质BRDF:跟绝对方位角有关
- 各向同性材质BRDF:跟出入射方位角无关,跟他们相对差值有关
7 测量BRDF的方式
实际测量出的BRDF和各种各样的模型实际相差非常多 Theory vs. practice
对一个材质的BRDF的测量,工作量非常大
测量过程: 固定光源在某一个入射角,用一个摄像机在整个球面的不同出射角进行拍摄,最终得出在这个入射角下对应的所有出射角的能量分布。然后再把光源换到另一个角度,重复此操作,直到光源遍历了球面所有角度为止


从而得出一般测量方法:
入射出射方向可以互换

- 一些改进方法 Improving efficiency:
- 测量三维的BRDF,四维的计算量巨大 Isotropic surfaces reduce dimensionality from 4D to 3D
- 因为BRDF有可逆性,可以减少一半的测量 Reciprocity reduces # of measurements by half
每移动一次光源,摄像机就要遍历整个球面,在移动光源,循环往复,效率还是很低的。
以下这几种情况,是可以提高效率的:
- 各向同性的材质,可以把4D降到3D的
- 由于光的可逆性,工作量可以减少一半
- 不用采样那么密集,就采样若干个点,其中间的点可以插值出来
- …还有很多方法,这里省略了
Reference
https://blog.csdn.net/Motarookie/article/details/122425896







