ARCore之路-光估计之光照

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

  在现实世界中,光扮演了极其重要的角色,没有光万物将失去色彩,没有光世界将一片漆黑。在3D数字世界中亦是如此,3D数字世界是一个使用数学精确描述的世界,光照计算是影响到这个数字世界可信度的极其重要的因素。

在这里插入图片描述

  在上图中,左图是无光照的情况下的球体(并非全黑是因为我们设置了环境光),这个球体看起来与一个2D圆形并无区别。右图在有光照的情况下给我们的感觉就好多了,有高光、有阴影。实际上我们视觉感知环境就是通过光与物体的交互而产生的。

  3D数字世界真实度与3D数字世界使用的光照模型有直接关系,越高级的光照模型对实现世界模拟得就越好,当然计算代价也是越大的。特别是对实时渲染的应用来说,一个合适的折中方案选择就很关键。

  在接下来的几篇文章中,我们将介绍Arcore如何利用光估计技术使AR体验更真实,我们还将继续扩展其中的一些基本技术,以改进我们AR应用程序。当然,在这之前,还是有必要了解一些光照基本知识。

一、光源

  顾名思义,光源就是光的来源,常见的光源有阳光、月光、星光、灯光等等。光的本质其实很复杂,它是一种电磁辐射但却有波粒二相性(我们不会深入去研究光学,那将是一件非常复杂且枯燥的工作,在计算机图形学中,我们只要了解一些简单的光学属性并应用)。在实时渲染中,我们通常把光源当成一个没有体积的点,用L来表示它的方向,使用辐照度( irradiance ) 来量化光。对于平行光来说,它的辐照度可通过计算在垂直于L 的单位面积上单位时间内穿过的能量来得到。在图形学中考虑光,我们只要想象它会向空间发射带有能量的光子(particles),然后这些光子会和物体表面发生作用(反射,折射和吸收),最后的结果是我们看到物体的颜色和各种纹理。

二、光与材质的交互

  当光照射到物体表面时,一部分被物体表面吸收,另一部分被反射,对于透明物体而言,还有一部分光穿过透明体,产生透射光。被物体吸收的光能转化为热量,只有反射光和透射光能够进入眼睛,产生视觉效果。反射和透射产生的光波决定了物体呈现的亮度和颜色,即反射和投射光的强度决定了物体表面的亮度,而它们含有的不同波长光的比例决定了物体表面的色彩。所以,物体表面光照颜色由入射光、物体材质,以及材质和光的交互规律共同决定。

  材质可以被认为是决定光如何与物体表面相互作用的属性。这些属性包括表面反射和吸收的光的颜色、材料的折射指数、表面光滑度、透明度。通过指定材质属性,我们可以模拟各种真实世界的表面,如木材、石头、玻璃、金属和水。

  在我们的模型中,光源可以发出不同强度的红、绿和蓝光;这样,我们就可以模拟许多光色。当光从光源向外传播并与物体碰撞时,其中一些光可能被吸收,另一些则可能被反射(对于透明物体,如玻璃,有些光线透过介质,但我们这里不考虑透明度)。反射的光现在沿着它的新路径传播,并且可能会击中其他物体,其中一些光又被吸收和反射。光线在完全吸收之前可能会击中许多物体。最终,一些光线最终会进入眼睛,如下图所示。

  根据三原色理论,眼睛的视网膜包含三种光感受器,每一种感光器对红光、绿光和蓝光敏感(有些重叠)。传入的RGB光会根据光的强度将其相应的光感受器刺激到不同的强度。当光感受器受到刺激(或不刺激)时,神经冲动从视神经向大脑发送,在那里大脑产生一种光感受器。根据光感受器的刺激在你的大脑中产生图像。(当然,如果你闭上/闭上眼睛,感受器细胞就不会受到任何刺激,而大脑会将其记录为黑色。)

  在上图中,假设圆柱体的材料反射75%的红光,75%的绿光,而球体反射25%的红光,吸收其余的红光。也假设纯净的白光是从光源发出的,当光线照射圆柱体时,所有的蓝光都被吸收,只有75%的红光和绿光被反射出来。(即中等强度的黄色)。这种光随后被散射,其中一些进入眼睛,另一些进入球体。进入眼睛的部分主要刺激红色和绿色的锥细胞到中等的程度,观察者会认为圆柱体是一种半明亮的黄色。其他光线向球体散射并击中球体,球体反射25%的红——并吸收其余部分,因此,稀释后的红光(中高强度红色)被进一步稀释和反射,所有进入的绿光都被吸收。剩余的红光随后进入眼睛,主要刺激红锥细胞到一个较低的程度。因此观众认为球体是一种暗红色的球。

  这就是光与材质的交互过程。

三、3D渲染

  3D渲染又称为着色(Shading),是指对3D模型进行纹理与光照处理并光栅化成像素的过程。

  上图直观地展示了3D渲染过程。几何图形和顶点Shader从来没有真正渲染过线框模型,相反,它们只是定位并对顶点和表面进行着色,然后输入到像素/片段Shader和照明计算和阴影处理。最后一步称为光栅化,即是生成每个像素的颜色信息。我们在这里讨论的渲染过程是使用DirectX或openGL在设备的GPU上进行标准的实时渲染。

  Unity提供对模型的多种渲染方式,当然,有的如Wireframe、shaded、shaded Wireframe有比较明确的意义,有的则不那么明显。

猜你喜欢

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