--- title: "材质与外观" date: 2022-07-25T15:23:18+08:00 --- ### 图形学中的材质 用于描述光线和不同材质间的作用关系 ![](../../images/eg_material_in_cg.png) 上图从左至右分别为三维空间中的网格模型,渲染出的两种不同结果 #### 材质(Material) == BRDF 渲染方程由物理量推出,因而渲染方程本身严格正确,BRDF描述了某一种材质,因此BRDF决定了光如何被反射 ###### 漫反射材质 漫反射:任何一根光线打到漫反射位置的点上会被均匀地分散到各个不同的方向上去 ![](../../images/diffuse_lambertian_material.png) * 漫反射材质可定义任何一个不同的点上不同的漫反射系数 经验定义: 在Blinn-phong模型中,我们定义过漫反射系数,有多少Intensity到达,然后用一个0到1的颜色控制能被吸收多少(RGB三个通道各不相同,那就引入了颜色) 正确定义: 空间中从任何一个方向进来的光的Radiacne是一样的,反射出来的光因为漫反射所以也是同样的 因此如果如果这个点不发光也不吸收光(白的),那就意味着所有的光进来多少就发射出去多少。也就是进来多少Irradiance,就会出去多少Irradiance,因为Radiance是一致的的,所以入射和出射的Radiance也要是一样的 ![](../../images/caculate_diffuse_material.png) 要使Li等于Lo,所以BRDF为$1/\pi$,此时是完全不吸收能量的 可定义一个反射率(albedo)在0到1之间,那就可以引入不同颜色的BRDF,值为$albedo/\pi$。这个BRDF的范围是$(0,1/\pi)$ $$f_r = \rho/\pi$$ ###### Glossy材质 类似于镜面反射又有些粗糙 ![](../../images/glossy_material.png) ###### 类玻璃/水的通透材质 ![](../../images/Ideal_feflective_material.png) 左图为玻璃球(水的性质),右图有颜色且来自于玻璃球壳内,说明折射光在玻璃里传播时会被部分吸收 #### 反射 ##### 物理上的反射定律 镜面反射:入射角等于反射角 ![](../../images/perfect_specular_reflection_in_physic1.png) ##### 计算公式 方式一: 根据反射定律,入射光的方向和出射方向的正中间一定是法线方向,再利用平行四边形法则,将$\omega o$和$\omega i$加起来,一定会沿着n方向,其长度为$2\cos \theta $ 方式二: 将入射和反射角投影到局部坐标系上,可以认为任何一个方向和法线的夹角为0,意味着其方向沿着法线方向,为坐标系的水平方向 再定义一个$\phi$角度:规定$\omega i$、$\omega o$、n在某一个平面上,$\phi$等于0,如果这个平面绕着n在转,所形成的角度叫方位角 通过这种方式可以将任何的角度拆成$\theta$和$\phi$,对于左图从上往下看,得到右图,入射角和出射角的朝向在方位角上正好相反(也就是在一个角度上加上一个$\pi$),然后所有的角度都是按$2\pi$循环的 所以已知$\theta和\phi$,就可以计算出射方向 ![](../../images/perfect_specular_reflection_in_physic2.png) 镜面反射: 对于一个全镜面反射来说,只需要考虑菲涅尔系数 $$L_o(\omega_o) = F_r(\omega_r)L_i(\omega_r) = \int_{\Omega}f_r(\omega_o,\omega_i)L_i(\omega_i)\cos \theta_i d\omega_i$$ $\omega_r和\omega_o$关于表面法线对称 此处描述$f_r$BRDF项使用狄拉克函数$\delta$ $\delta$函数满足: $$\delta(x) = \begin{cases} \infty & \text{x = 0} \\\\ 0 & {x \neq 0 } \end{cases}$$ $$\int_{-\infty}^{+\infty} {\delta(x)} =1$$ $$\int_{-\infty}^{+\infty} {f(x)\delta(x-x_0)dx} = f(x_0)$$ 此时将狄拉克函数代入方程中可得到 $$L_0 = \int_{\Omega} {\frac{\delta(\omega_i - \omega_r )}{\cos\theta_i}F_r(\omega_i)\cos\theta_i d\omega_i} = F_r(\omega_r)L_i(\omega_r)$$ 得到镜面反射的BRDF表达式: $$f_r(p,\omega_0,\omega_i) = F_r(\omega_r)\frac{\delta(\omega_i - \omega_r)}{\cos\theta_i}$$ ### 折射 * 色散:一束平行光经过棱镜后,因为不同的波长有不同的折射率,会被分解成不同的光线 * Caustics(不准确翻译为焦散) 产生Caustics的原因永远不是散射,而是聚焦 形成原因:光线打到的海水表面时,光线会往不同的方向去折射,对于海底的某一个点来说,有几率接收到来自不同方向打过来的光 ![](../../images/eg_specular_refraction.png) #### 斯内尔定律(Snell's Law) 不同材质拥有不同的额折射率,如真空认为是1,水为1.333,折射率越高说明光在穿过这个材质时会被折射得非常厉害,折射角会非常小,体现出不同波长的光被折射得不同程度 ![](../../images/medium_eg_snell_law.png) 方位角的朝向中,入射光和折射光也是正好相反的 入射角的正弦和折射角的正弦满足折射率相乘相等 $$\eta_i \sin\theta_i = \eta_t \sin\theta_t$$ ![](../../images/snell_law_caculation.png) 由斯内尔定律可计算折射角的余弦 $$\eta_i \sin\theta_i = \eta_t \sin\theta_t$$ $$\cos\theta_t = \sqrt{1-\sin^2\theta_t} $$ $$= \sqrt{1-(\frac{\eta_i}{\eta_t})^2 sin^2\theta_i}$$ $$\sqrt{1-(\frac{\eta_i}{\eta_t})^2(1-\cos^2 \theta_i)}$$ #### 全反射现象 当满足下列条件时,折射角的余弦的计算没有实数意义,即折射不可能发生 $$1-(\frac{\eta_i}{\eta_t})^2(1-\cos^2\theta_i) < 0$$ 要使上式成立则 $$\frac{\eta_i}{\eta_t} > 1$$ 即入射介质的折射率大于折射介质的折射率,此时可能会发生没有折射的现象,名为全反射现象 如:Snell's Window/Circle 人在水底,往各个不同的方向看,只能看到一个锥形的区域(97.2度)。如下图,最左边的一根光线的折射角就已经达到90度了,如果角度再大一点,所有能量都会反射到池子底部 ![](../../images/eg_snell_window.png) #### BSDF = BRDF + BTDF BRDF中的R表示反射,折射是BTDF,其中的T是transmit。BRDF和BTDF加起来可以统称BSDF,其中的S表示散射 #### 菲涅尔项(Fresnel Reflection/Term) 反射率取决于入射角(和光的偏振)的现象 ![](../../images/eg_fresnel_reflection.png) 如上图中,反射现象随着视角变化而明显 ##### 绝缘体 图中红线所示,如果一根光几乎和物体表面完全持平,那它就会被完全反射掉;如果光和物体是垂直的,更多的能量会发生折射,反射的能量会非常少 下图的另外两根线表示的是极化现象,和光线的波动性有关,其实光线是沿着各个不同方向有振动的,极化就是只沿着某一个方向振动(S和P是两个方向的极化) ![](../../images/fresnel_term_dielectric.png) ##### 导体 导体的菲涅尔项和绝缘体的不一样,即使在垂直看过去的情况下,也是反射很多能量 导体的折射率是复数,需要一个N和一个K ![](../../images/fresnel_term_conductor.png) ##### 菲涅尔项的公式 一个0到1之间的数,有多少能量会被反射,2个不同的极化(polarization:S和P)会告诉你不同的反射率,如果考虑不极化的光,就将2项平均 ![](../../images/fresnel_term_formule.png) ##### 菲涅尔近似式 可认为该曲线在视角为0度时为某一个值,到达90度值就为1,和绝缘体类似,对导体而言,不考虑其下降再上升的过程 基准反射率与折射率存在数学关系 $$R_0 = (\frac{n_1-n_2}{n_1+n_2})^2$$ 曲线上升到90度时为1,0度时等于$R_0$ $$R(\theta) = R_0 + (1 - R_0)(1 - \cos\theta)^5$$ 可近乎完美地近似绝缘体或导体 #### 微表面材质/模型 如下图在空间站拍摄的照片,有相对完美的高光,但看不到地球表面的山、树、和建筑物 与微表面理论不谋而和,只要离得足够远,看向一个物体时,很多微小的东西看不到,看到的是它们最终形成的对表面的作用(对光形成的总体的效应) ##### 微表面理论(Microfacet Theory) 假设物体表面是粗糙的,从远处看看到的是材质(外观),从近处看看到的是几何 * Macroscale层级:(flat & rough)从远处看,看到的是一个平面,并且是粗糙(材质看上去是粗糙的)的; * Microscale层级:(bumpy & specular)从近处看,可以看到很多凹凸不平的表面,并且每一个小的表面的微元都认为是完全镜面反射的物体 漫反射将光反射到各个方向上就是认为所有的微表面都像一个很小的镜子,分布又各不规则,最后形成的分布就会把光打到各个不同的方向上去 ![](../../images/microfacet_theory.png) ##### 微表面法线分布 * 可使用微表面模型将表面的粗糙程度用微表面的法线分布表示 glossy材质: 如下图的表面,看起来很平,它们的分布法线差的不太远,基本都是朝上的。所以如果将它们的分布画出来,它们的法线会集中在宏观的表面法线的周围 ![](../../images/microfacet_BRDF_glossy.png) diffuse材质: 如下图,如果表面粗糙(意味着所有的微表面会沿着不同的方向),如果将法线画出来,那它的分布就会离中心离的特别远都会有分布的值 ![](../../images/microfacet_BRDF_diffuse.png) * 微表面模型的BRDF公式 菲涅尔项(Fresnel)- F(i,h): 表示总共有多少能量被反射。根据不同的入射方向有不同程度的反射(也就是说如果入射方向几乎是平的,那么就会有大量能量被反射) 法线分布(distribution of normals)- D(h): 这个分布表示在任何一个给定方向上分布的值(可能是集中在中间的,可能是均匀分散开的) 只有当微表面的法线方向和half vector完全一致的时候,才能吧入射方向的光反射到出射方向上去 阴影遮掩(shadowing-masking)(几何项) - G(i,o,h): 这些微表面间有可能会发生互相遮挡。对入射的光线,有可能会出现自己给自己的阴影;对于观察方向也是一样的,有部分也有可能因为遮挡会看不到 光线近似平行于表面时更易发生自遮挡,这种入射方向为掠射角(Grazing Angle),阴影遮掩的提出正是用于修正掠影角 ![](../../images/microfacet_BRDF_caculate.png) ------------------- 使用微表面材质渲染得到的图像质量很高,且微表面模型可描述的物体种类较多,金属、皮质、木头 ![](../../images/microfacet_BRDF_example.png) #### 各向同性/各向异性材质 如下图在电梯间的内部,电梯间的六面几乎都是金属,金属是平面的,如果说头顶上有一些小灯打到金属的表面上去会形成高光,高光一般都是圆和椭圆,但这里出现了一条一条的现象 当金属为拉丝金属,就会产生如图现象 ![](../../images/isotropic_inside_an_elevator.png) * 各向同性:认为其微表面不存在一定的方向性,或方向性微弱 下图可见法线在各个方向上的分布是均匀的 ![](../../images/isotropic_materials_theory.png) * 各向异性:认为其法线分布具有明确的方向性 ![](../../images/anisotropic_materials_theory.png) * Anisotropic BRDFs 如果出射方向和入射方向在方位角上旋转,得到的还是相同的BRDF,那就是各向同性的材质。如果不只和相对的方位角有关,还和绝对的方位角有关,那这个BRDF就是各向异性的 $$f_r(\theta_i,\phi_i;\theta_r,\phi_r) \neq f_r(\theta_i,\phi_i;\theta_r, - \phi_r)$$ * 尼龙 正常尼龙做法为水平方向和竖直方向的一根压一根,其各向异性在对角线上有不同的表现 ![](../../images/anisotropic_BRDF_nylon.png) * 天鹅绒 底层有很多伸出去的纤维,如果这些纤维往各个不同方向上分布是均匀的,就可认为是各向异性。但我们可将纤维拨到一边去,认为造出各向异性效果 ![](../../images/anistotropic_BRDF_velvet.png) #### BRDF属性 * 非负性 $$f_r(\omega_i - \omega_r) \geq 0 $$ * 线性 BRDF可拆分为多块,分别做光线传播,再累加各块,得到结果与未拆分相同 $$L_r(p,\omega_r) = \int_{H^2} f_r(p,\omega_i \rightarrow \omega_r)L_i(p,\omega_i)\cos\theta_id\omega_i$$ * 可逆性 交换入射方向和出射方向,得到的BRDF值相同 $$f_r(\omega_r \rightarrow \omega_i) = f_r(\omega_i \rightarrow \omega_r)$$ * 能量守恒 BRDF不会让能量变多 $$\forall \omega_r \int_{H^2} f_r(\omega_i \rightarrow \omega_r)\cos \theta_i d\omega_i \leq 1 $$ path tracing 中光线在无限次弹射后会收敛正是因为能量守恒 * 各向同性和各向异性 各向同性说明BRDF的值只与相对的方位角相关,可改写为下式 $$f_r(\theta_i,\phi_i;\theta_r,\phi_r) f_r(\theta_i,\phi_i;\theta_r, - \phi_r)$$ 原本四维的BRDF会变成三维 * 由于BRDF的可逆性,所以对于各向同性来说,相对的方位角无需考虑正负 $$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可以用各种各样不同的模型去描述,但这些模型都是基于物理的描述或者近似,但只有测量出来的BRDF才是对的BRDF * 测量原因 以前的模型不够准确 可以通过某些物理方法测出菲涅尔项(绿线、红线),发现和理论上的曲线(蓝线)看起来完全不一样。也就是说实际上菲涅尔项非常复杂,不是简单公式可以描述的,所以之前的模型是不太准确的 物理上得出的很多结论大多经过简化,与实际不同,在多数情况下需要测量 测量后可以不用推出一些模型,可以直接用测的数据 ![](../../images/measuring_BRDF_motivation.png) ##### 怎么测量 * 理论 BRDF是2个方向(一个入射方向,一个出射方向)的一个函数,如果盯着一个着色点看,并改变它的入射方向(比如拿一个灯从四面八方照它),相机从四面八方去拍它,这样就可以覆盖BRDF所有可能的输入方向和可能的输出方向对,这样就可以做测量 ![](../../images/image-based_BRDF_measurement.png) * 实践仪器 这个器械有2个爪子,一个抓相机,一个抓光源,将样本放在正中间(球心),这2个爪子可以在球面上任意的旋转 ![](../../images/gonioreflectometer.png) * 算法 枚举所有出射方向,放置光源 枚举所有入射方向,放置相机 测量Radiance ``` foreach outgoing direction wo move light to illuminate surface with a thin beam from wo for each incoming direction wi move sensor to be at direction wi from surface measure incident radiance ``` 测得BRDF是四维的,测量十分耗时 固定了摄像机之后,光源要整个走一遍球面,才能覆盖所有的光源方向,如果下次换一下相机的方向,就又要把光源在整个球面走一遍,这就叫curse of dimentionality * 提升算法效率 如果测量的BRDF是各向同性的,实际上只有三维的 用BRDF的可逆性,只考虑相对方位角的话,又可以减少一半的测量 * BRDFs存在的问题 1. 需要精确测量掠影角 2. 需要足够高密度的采样频率来测量,以捕获高频的镜面反射 3. 逆向反射 4. 空间反射率会发生变化 * BRDFs的存储 需要的存储要求 1. 紧凑的表现形式 2. 准确表示测量的数据 3. 能正确表现任意方向 4. 需要可用于重要性采样的良好分布 * BRDF库 BRDF库存储了很多不同的材质,大多数是假设各向同性的 对每一个材质做了90*90*180次测量,并存储结果至一个三维数组 存储数据量大(未压缩) ![](../../images/tabular_representation.png)