时间:2024-05-04
黎娅娟,马万峰
(四川大学计算机学院,成都 610065)
随着科技的发展,增强现实[1]越来越火爆,而增强现实的其中一个重要的技术就是虚实融合技术。虚实融合需要虚拟物体以及真实场景在光照、几何以及时间上的一致性。光照一致性[2-3]指的是虚拟物体光照效果的真实性,其光照效果与环境一致,有与环境同样明显的明暗、阴影等效果,从而和背景融为一体。几何一致性是指虚拟物体和真实环境几何空间的一致性。时间一致性则指的实时交互。目前的AR技术最缺少的就是光照一致性,因为很难获得真实场景中的光源信息,而真实场景中的光源不再是简单的点光源、平行光源等,而是各种复杂的光源混杂在一起的。
目前,国内外对虚实结合中的光照一致性均有了一定成果。1993年,Fournirer等[4]提出了利用基于图像的光照算法,使得虚拟物体与真实场景融合的思路。2003年,Daisuke Miyazaki等人[5]根据单视点拍摄的图像,测量了反射信息、几何信息以及光照信息等,估算了光源的位置分布信息。2006年,Tommy Jonson等人[6-7]利用辐射量的技术,把真实场景变化成环境贴图,利用Phong模型来模拟太阳光照,这是一个基于户外的系统。2009年,Banterle等人[8]提出了利用基于图像的光照技术,恢复整个场景的HDR图像,从而进行光照计算。2014年,Chen等[9]利用场景理解技术来估计真实场景的几何信息,进行光照估计。
本文提出的方法是在已有真实场景的HDR图像的基础上,将HDR上每一个像素点当作光源,预处理生成辐照贴图和含有MipMap等级的贴图,进行漫反射光照和镜面反射光照,同时在虚拟物体底部加上虚拟的无限大的平面,利用环境光遮蔽算法生成阴影,光照与阴影结合,即可渲染出虚拟物体最终的光照值。
本文通过光照模型对虚拟物体进行光照计算。光照模型,也叫做明暗模型,是用来计算物体任意点的颜色值的一种模型。光照模型有局部光照和全局光照两种模型,局部光照仅仅只考虑了可见光源对物体的影响,没有考虑到物体相互间的光照等。而在全局光照中,场景中的物体不仅仅会受到直接来自光源的光照,同时还会收到周围环境其他物体的反射光折射光等各种光的影响。现实生活中的光照就是全局光照[10]。
本文由于已有周围环境光照的所有信息,所以本文的光照就是全局光照。本文采用的是Cook-Torrance光照模型,它是基于物理的光照模型[11]。光线照射到物体表面会发生漫反射、镜面反射、折射等现象,本文只考虑其中的漫反射和镜面反射,该Cook-Torrance光照模型就是用来模拟不同材质的反射效果的模型。详细算法会在下一节详细说明[14]。
本节主要介绍IBL算法中的漫反射和镜面反射以及SSAO算法,以及如何将两个算法融合,渲染最终的画面。输入一张高动态范围的全景图作为背景,即真实环境,将全景图变换成立方体贴图,将立方体贴图上的每一个像素点作为虚拟光源,采用Cook-Torrance光照模型对虚拟物体进行光照,利用SSAO生成对应的AO纹理。最后结合,使得虚拟物体和真实环境很好地融合。
本文根据输入的全景图,转化为立方体贴图(Cubemap),也称为天空盒。由公式(1),生成天空盒上p点所对应的方向上的辐照值,假设p点一直在立方体正中心。公式(1)与图1结合一起,就是求点p处ωo方向上的辐射值,这个表达式取决于入射方向ωi在天空盒上的每一个采样方向,因为p点所在平面的下半部球上的方向为负值,不考虑在内,所以本文仅需要考虑在其半球上的入射光线。本文对p点ωo方向所在的半球上所有的入射光线ωi加权求平均值,即生成了ωo方向上的辐照值。本文用的黎曼求和积分计算积分方程,在p点所在的半球领域Ω上进行均匀的采样得到各个入射方向 ωi上的辐射值,加权平均后即Li(p,ωi)(n﹒ωi),乘以常量即是积分方程,因为是预处理,可以适当增加采样数量,使得结果更加的精确。
图1 半球积分
为了进一步简化积分计算,对公式(1)化简,将直角坐标系转化为极坐标系,见公式(2)。因为是在半球领域上积分,所以
对积分继续化简,因为生成的样例的数量是固定的,所以分别在θ、φ方向上采样n1、n2数量的样本,公式(2)可化简为公式(3)
漫反射的计算是采用预计算的方式,预计算的过程:在初始化的时候,计算环境贴图上任意一点P上的出射方向ωo上的辐照值,将计算的结果以FBO的形式输出到另一张立方体贴图纹理上。因为Cubemap有6个面,所以初始化时需要在前后左右上下6个方向上绘制6遍。后续在每帧计算漫反射光照时,仅需要通过虚拟物体的法向量来采样之前生成好的Cubemap即可,从而达到很好的实时性。输入的环境贴图与根据辐照值生成的辐照贴图见图2。
图2环境贴图和辐照贴图
镜面反射的计算同漫反射的计算一样,均是预计算出相关的纹理。但镜面反射的预计算会更复杂,镜面反射的相关方程见公式(4)。
为了方便预计算,我们将光照部分分为两个独立的部分,分别积分然后组合得到最后的结果,见公式(4)。式子的第一部分就是预过滤环境贴图部分,与漫反射中的辐照贴图类似,均是立方体贴图。但不一样的是,本次立方体贴图是含有MipMap等级的立方体贴图,等级由虚拟物体的粗糙度和金属度确定,粗糙度越高,金属度越低,采样向量越分散,导致反射画面更加模糊,因此MipMap等级更高。由于我们不能提前知道视线的方向,故本文是假设视线方向总是等于虚拟物体的某点的法向量,因此,不需考虑视线方向。式子第二部分就是反射积分的BRDF部分,BRDF也就是双向反射分布函数,它是根据给定的入射方向上的辐照值,来确定出射方向上的辐射率,也就是,入射光线经过物体表面反射,BRDF是描述变量如何在各个出射方向上分布的函数。我们假定照射的辐照度为白色,那么我们就可以在给定粗糙度、法向量和光线方向上计算BRDF部分。本文第二部分仍然会预计算生成一张BRDF的二维纹理,见图3,该纹理存储了一个对于菲涅耳方程缩放的值(红色部分)和一个偏执值(绿色部分)。我们把BRDF的法线向量和入射光线方向的点乘的结果作为水平坐标,把BRDF的粗糙度作为垂直坐标。将两部分进行合成即生成了镜面反射光照。
图3 BRDF二维图像
屏幕空间环境光遮蔽(SSAO)是一种模拟间接光照的算法,在本文,它用来替代软阴影[12],常见的阴影算法阴影映射和点阴影等[13],但是前提是可见的固定光源。现实世界中的光源并不是固定的,根据HDR图像分析光源难度大,且现实生活中光源是多光源的,这就更加增加了难度。因此本文用屏幕空间环境光遮蔽算法代替软阴影,但是该算法仅适用于光照很复杂,没有明显光源的环境。屏幕空间环境光遮蔽将褶皱、孔洞以及非常靠近的墙面变暗的方法来模拟间接光照,也就是本文的软阴影,从而消除悬浮感。因为这些区域很大部分都被周围的几何体遮蔽,光线难以流失,因此会看上去暗一些。
屏幕空间环境光遮蔽具体是这样计算的:对于模型的每一个三角面片,根据周围的面片的深度值计算遮蔽因子,遮蔽因子越多,即光照越暗。采集三角面片中心所在球内的多个随机的样本点的深度,与当前面片的深度值进行对比,比当前面片高的样本数量即是遮蔽因子。如图4(a)所示,灰色部分的样本是高于当前面片的深度值,也就是遮蔽因子,灰色越多,当前面片越暗。
由于采样的区域是一个球体,这样会导致一个平面接受的光照最多为50%,因为平面至少有一半的数量是遮蔽因子,但是在真实世界,平面是没有任何遮挡的,不应该是灰色。因此,本文将采样区域改为面片法向量所在平面的半球,如下图4(b)。由于仅仅对半球体内采样,没有考虑到当前面片底部的样本,因此不会出色灰蒙蒙的效果。
屏幕空间环境光遮蔽需要输入三角面片的位置信息、法线向量,计算出遮蔽因子后最终通过FBO将屏幕上每一个像素点所对应的环境光照比率存储在二维纹理上,但是此时有很多重复的噪声纹理,故本文会对生成二维纹理进行模糊化处理,从而创建一个光滑的遮蔽结果,如图5,供后续的光照计算使用。
图4遮蔽因子
图5 枕头的AO贴图
本节中将会展示输入同一个模型在不同的环境中的变化以及不同的模型在同一环境中的变化,以及加入SSAO算法与不加SSAO算法的对比图。实验环境为NVIDIA GeForce GTX 1050。
本节第一个实验为佛像和花瓶模型的不同材质在同一环境下的光照,材质属性有漫反射材质、镜面反射材质以及漫反射和镜面反射均有的材质。渲染结果见图6,图中第一行的模型为佛像,第二行的模型为花瓶。第一列的材质均为全部漫反射材质,第二列材质介于漫反射和镜面反射中间,第三列材质为全部镜面反射。可以看出,光线照射到全漫反射材质时,因为光线全部向四面八方发散,因此没有突出的亮斑;而光线照射到处于漫反射和镜面反射均有的材质时,会有少量的比较模糊的亮斑,有反射周围场景的模糊感,同时还有自身的颜色;光线照射到全镜面反射材质时,因为是镜面材质,会全部反射周围的场景,没有自身的颜色,因此渲染图成透明玻璃状态,完全地反射了周围环境。不同的模型在相同场景中均能够与场景很好的融合,给人真实的感觉,本文的算法确实能够较好的模拟不同的虚拟物体在相同场景的渲染效果。同时,用Fraps软件测试帧率,花瓶模型为470帧左右,佛像模型在450帧浮动,远远超过实时的要求,也说明了本文算法的优势性,能够实时的满足全局光照效果。
本文第二个实验为材质漫反射和镜面反射之间的佛像模型在不同的环境下的光照结果,输入的HDR图像均不相同。渲染结果见图7,虚拟物体的色调基本与周围环境一致。明亮的场景中,虚拟物体也很明暗;反之,灰暗的场景中,虚拟物体也随之很暗。实验表面,本文算法很好的兼容性,针对不同的环境,虚拟物体都能很好地与场景融合。
本文第三个实验为枕头模型在房间里的光照结果,渲染结果见图8。左图是没有SSAO的结果,右图是加入SSAO的结果。通过对比可以发现,因为右图有阴影的效果,明显比左图真实,同时消除了悬浮感,右图的枕头的AO图见图5,通过在枕头底部加入一块平面替代真实环境的沙发,达到了枕头与沙发间阴影的效果,使得整个虚拟物体更加的真实。由于SSAO算法每一帧需要绘制,因此很耗效率,测试帧率,关闭SSAO为285帧左右,开启SASAO为60帧左右,仍然可以满足实时渲染的要求。实验表明,SSAO算法确实能够很好的解决软阴影问题,从而消除虚拟物体的悬浮感,达到更好的真实效果。
本文第四个实验是在实验三的基础上,改变真实环境的主题色,测试枕头颜色的变化,渲染结果见图9。可以看到,随着环境色调的变化,枕头光照颜色随之变化,与场景的变化一致。实验再次验证,本文算法能够很好地保证虚拟物体与环境光照的一致性。
图6 不同材质的虚拟物体在同一环境下的渲染结果
图7 相同材质的虚拟物体在不同环境下的渲染结果
图8 相同材质的虚拟物体在不同环境下的渲染结果
图9 相同材质的虚拟物体在不同环境下的渲染结果
本文提出的方法,通过输入HDR图像与虚拟物体,能够输出虚拟物体与场景虚实融合的效果,达到全局光照的效果,使得场景与虚拟物体光照一致性,给人真实的感觉,并能够达到实时要求。经过测试,同一虚拟物体在不同场景中以及不同虚拟物体在相同场景中,均能很好的与场景融合。
本文算法针对光源不明显的场景,效果很真实,在以后的研究中,我们会针对单光源的场景,分析光源所在位置,从而使用别的阴影算法,达到真实的效果,消除悬浮感。
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!