ARCore之路-光估计之光照模型

版权声明:David Wang原创ARCore文章,仅供学习研究之用,不得用于任何商业目的,未经授权不得转载! https://blog.csdn.net/yolon3000/article/details/83153325

  光照模型(illumination model),也称为明暗模型,用于计算物体某点处的光强(颜色值),简单的说光照模型就是一个公式,使用这个公式来计算在某个点的光照效果。从算法理论基础而言,光照模型分为两类:一种是基于物理理论的,另一种是基于经验模型的。基于物理理论的光照模型,偏重于使用物理的度量和统计方法,比较典型的有ward BRDF模型,其中的不少参数是需要仪器测量的,使用这种光照模型的好处是“效果非常真实”,但是“计算复杂,实现起来也较为困难”,目前大火的PBR(Physicallly-Based-Rendering 基于物理渲染)渲染,其对表面采用微平面进行建模,利用辐射度,加上光线追踪技术构成了当前PBR的基础;经验模型更加偏重于使用特定的概率公式,使之与一组表面类型相匹配,所以经验模型大都比较简洁,效果偏向理想化。其实两者之间的界限并不是明确到“非黑即白”的地步,无论何种光照模型本质上还是基于物理的,只不过在求证方法上各有偏重而已。

  从使用角度而言,光照模型分为局部光照模型和全局光照模型。所谓局部光照模型,是将光照的种类进行分解,在计算时只考虑其中的一种,不考虑光的反射;而全局光照模型则是考虑到所有的光照种类,包括直接光照与间接光照。一个比较类似的例子是物理力学,牛顿力学最初是考虑理想状态下的运动方式,无摩擦力;然后慢慢的会在力的条件中考虑到摩擦力因素;接着会学习弹性系数。总之是将一个原本复杂的过程分解为各种子过程,然后渐进叠加。

Cookie

一、漫反射与 Lambert 模型

  粗糙的物体表面向各个方向等强度地反射光, 这种均匀地向各个方向散射的现象称为光的漫反射(diffuse reflection)。产生光的漫反射现象的物体表面称为理想漫反射体,也称为兰伯特(Lambert)反射体。

Cookie

  我们可以把光看作是以某种方向穿过空间的光子的集合。每个光子携带一些(光)能量。每秒发射的(光)能量被称为辐射通量。每个区域的辐射通量(称为辐照度)很重要,因为这将决定一个表面上一个区域接收多少光(从而决定它在眼睛中的亮度)。我们可以认为,辐照度是指照射到表面某一区域的光量,或者是通过空间中一个想象区域的光量。

  考虑一个不透明物体的表面,如上图所示。当光线击中物体表面的某个点时,一些光进入物体的内部并与物体表面附近的物质相互作用。光线会在物体内部反弹,其中一些会被吸收,剩下的部分从表面四面八方散开,这被称为漫反射。简单地说,我们假设光是在光线进入的同一点散射出去的。吸收和散射的数量取决于材质,例如,木材、泥土、砖块、瓷砖和灰泥会不同地吸收/散射光(这就是为什么材料看起来不同)。在模拟这种光/物质相互作用的近似过程中,我们假定光在表面以上的各个方向均匀散射,因此,不管视点位置在哪,反射光都会到达眼睛,因此,我们不需要考虑视点(即漫射照明计算是独立的),无论视点在什么位置,表面上的点的颜色总是相同的。

  我们把漫射光的计算分为两部分。第一部分,我们指定一种光色和漫射反照率(diffuse albedo color)。漫射反照率指定了表面由于漫反射率而反射的入射光量(由于能量守恒,未反射光量被材料吸收)。这是通过分色处理的(因为光可以分成RGB三原色)。假如表面上的点反射50%的入射红光、100%的绿光和75%的蓝光,入射光的颜色是80%的白光,也就是说,入射光的数量以Bl=(0.8,0.8,0.8)表示,而漫射反照率则由Md=(0.5,1.0,0.75)表示;然后,从该点反射出的光量由以下Cd给出:

   C d = B L M d = ( 0.8 , 0.8 , 0.8 ) ( 0.5 , 1.0 , 0.75 ) = ( 0.4 , 0.8 , 0.6 ) C_{d}=B_{L} \otimes M_{d}=(0.8, 0.8, 0.8) ⊗ (0.5, 1.0, 0.75) = (0.4, 0.8, 0.6)

  在上述公式中,漫射反照率(diffuse albedo color)必须在0.0到1.0之间,这样才能描述光的反射率。然而,上面的公式并不完全正确。我们仍然需要包括Lambert余弦定律(它根据表面法向和光矢量之间的角度控制表面接收的原始光的多少)。设Bl表示入射光的数量,Md表示漫射反照率颜色,I表示光矢量,n表示表面法向。则漫反射光的计算公式如下:

   C d = m a x ( L n , 0 ) B L M d C_{d}=max (L·n, 0) · B_{L} \otimes M_{d}

二、镜面反射与 Phong 模型

  Lambert 模型较好地表现了粗糙表面上的光照现象,如石灰粉刷的墙壁、纸张等,但在用于诸如金属材质制成的物体时,则会显得呆板,表现不出光泽,主要原因是该模型没有考虑这些表面的镜面反射效果。一个光滑物体被光照射时,可以在某个方向上看到很强的反射光,这是因为在接近镜面反射角的一个区域内,反射了入射光的全部或绝大部分光强,该现象称为镜面反射。故此, Phong Bui Tuong 提出一个计算镜面反射光强的经验模型,称为 phong模型,认为镜面反射的光强与反射光线和视线的夹角相关。

Cookie

  phong模型的数学表达如公式如下:

   I s p e c = K s I L ( V R ) n s I_{spec}=K_{s}I_{L}(V•R)^{n_{s}}

   k s k _{s} 为材质的镜面反射系数, n s n_{s} 是高光指数, V 表示从顶点到视点的观察方向, R 代表反射光方向。高光指数反映了物体表面的光泽程度。 n s n_{s} 越大,反射光越集中,当偏离反射方向时,光线衰减的越厉害,只有当视线方向与反射光线方向非常接近时才能看到镜面反射的高光现象,此时,镜面反射光将会在反射方向附近形成亮且小的光斑; n s n_{s} 越小,表示物体越粗糙,反射光分散,观察到的光斑区域小,强度弱。

  在目前流行的PBR光照中,镜面反射综合考虑了Fresnel反射与表面粗糙度,使用了更复杂的计算公式,其计算公式如下:

   C d = m a x ( L n , 0 ) B L R f ( a h ) m + 8 8 ( n h ) m C_{d}=max (L·n, 0) · B_{L} \otimes R_{f}(a_{h})\frac{m+8}{8}(n· h)^m

Cookie

  在公式中,相应的术语的意义见上图。计算点的光照即是计算有多少光被反射到视图方向v。法线为h的微面元将光反射到V中,让 α h α_{h} 是光矢量和半矢量h之间的角度,然后 R f ( a h ) R_{f}(a_{h}) 告诉我们由于菲涅耳效应而反射出的h到v的光量。由于菲涅耳效应使反射光 R f ( a h ) R_{f}(a_{h}) 的数量乘以由于粗糙度 S ( θ h ) S(θ_{h}) 反射的光量即为镜面反射光的数量: m a x ( L n , 0 ) B L max (L·n, 0) · B_{L} 表示到达我们所照明的表面点的入射光的数量。

三、Blinn-Phong 光照模型

  Blinn-Phong 光照模型, 又称为 Blinn-phong 反射模型(Blinn–Phong reflectionmodel)或者 phong 修正模型(modified Phong reflection model),是由 Jim Blinn于 1977 年对传统 phong 光照模型基础上进行修改提出的。和传统 phong 光照模型相比,Blinn-phong 光照模型混合了 Lambert 的漫射部分和标准的高光,渲染效果有时比 Phong 高光更柔和、更平滑,此外它在速度上相当快,因此成为许多 CG 软件中的默认光照渲染方法。此外它也集成在了大多数图形芯片中,用以产生实时快速的渲染。在 OpenGL 和 Direct3D 渲染管线中, Blinn-Phong 就是默认的渲染模型。phong 光照模型中,必须计算V • R 的值,其中 R 为反射光线方向单位向量,V 为视线方向单位向量,但是在 Blinn-phong 光照模型中,用 N •H 的值取代了V • R 。 Blinn-phong 光照模型公式为:

   I s p e c = K s I L ( N H ) n s I_{spec}=K_{s}I_{L}(N•H)^{n_{s}}

   H = L + V L + V H=\frac{L+V}{|L+V|}

  其中 N 是入射点的单位法向量, H 是“光入射方向 L 和视点方向V 的中间向量”,通常也称之为半角向量。注意:半角向量被广泛用于各类光照模型,原因不但在于半角向量蕴含的信息价值,也在于计算半角向量是一件简单、耗时不多的工作。
  通常情况下,使用 Blinn-phong 光照模型渲染的效果和 phong 模型渲染的效果没有太大的区别,有些艺术工作者认为 phong 光照模型比 blinn-phong 更加真实,实际上也是如此。 Blinn-phong 渲染效果要更加柔和一些, Blinn-phong 光照模型省去了计算反射光线方向向量的两个乘法运算, 速度更快。 与 phong 光照模型相比,使用 blinn-phong 进行光照渲染,在同样的高光系数下,高光领域覆盖范围较大,明暗界限不明显。Blinn-phong 渲染效果如下:

Cookie

四、高级光照模型

  随着时间的推移与人们的不懈追求,光照模型得到了深入的发展,人们不再满足于只是对漫反射现象和镜面反射现象进行模拟, 而是希望可以模拟更多特殊材质上的光照效果,如同向异性、各项异性等。前面所述的无论是漫反射,还是镜面反射,都属于材质和光交互的理想状态,就好像物理学中的无阻力状态和恒温状态,真实的情况是:漫反射和镜面反射都需要依据材质特征和物体表面微平面特征。因此很多为了衡量材质的光学特
征和物体表面微平面特征的如 BRDF(Bidirectional Reflectance Distribution Function)模型应运而生。这些高级光照模型比标准光照模型要复杂得多,下面我们只作简单概述。

Cookie

(一) 、Cook-Torrance 光照模型

  使用 phong 和 blinn-phong 光照模型渲染出来的效果都存在一个问题:效果过于艺术化,不太真实。这是因为这两种模型都对材质细节方面没有进行考虑。1981 年, Robert L. Cook 和 Kenneth E. Torrance 发表了名为“A ReflectanceModel For Computer Graphics”的论文,首次提出了 Cook-Torrance 光照模型。Cook-Torrance 光照模型将物体粗糙表面(rough surface)看作由很多微小平面(微平面)组成,每一个微平面都被看作一个理想的镜面反射体,物体表面的粗糙度由微平面斜率的变化来衡量。一个粗糙表面由一系列斜率变化很大的微平面组成,而在相对平滑的表面上微平面斜率变化较小。Cook-Torrance 模型将光分为两个方面考虑:漫反射光强和镜面反射光强。实际上, cook-Torrance、 phong和 blinn-phong 三种光照模型的本质区别都在于使用不同数学表达式计算 R s R_{s} R s R_{s} 在英文中称之为“specular term”。

(二)、BRDF 光照模型

  BRDF, Bidirectional Reflectance Distribution Function,中文翻译为“双向反射分布函数”。该函数描述了入射光线在非透明物体表面如何进行反射。BRDF 的结果是一个没有单位的数值,表示在给定入射条件下,某个出射方向上反射光的相对能量,也可以理解为“入射光以特定方向离开的概率”(实时计算机图形学第二版 111 页)。如下图所示, Wi 表示光线入射方向, Wo 表示光线出射方向(入射点到视点),则该情况下的 BRDF 值表示:光线以 Wi 方向入射,然后以Wo 方向出射的概率,或者光强。这些信息也可以用仪器进行测试记录,并存放在图片上,称为 polynomial texture map。

Cookie

  BRDF 模型有很多分支模型,如 HTSG BRDF 模型擅长模拟很多物理现象,是现今最完整的 BRDF 模型,但是同时需要昂贵的计算开销; Ward BRDF 用于各向异性表面的经验模型有些复杂,并且需要从实际物体表面来获取 BRDF 数据。这些数据可以通过测角仪、图像双向反射计来得到,国外网站也有一些公开的数据库。

参考文献

1、GPU 编程与CG 语言之阳春白雪下里巴人 康玉之

猜你喜欢

转载自blog.csdn.net/yolon3000/article/details/83153325