真实感计算机图形学(二)--消隐及真实感图形生成
作者:田景成发布时间:2001/02/07
文章摘要:
在"真实感计算机图形学(一)--自然景物模拟"一文中给出了在计算机的图形设备上实现真实感图形必须完成的四个基本任务,同时介绍了第一个任务的相关技术--三维造型中的自然景物模拟。本文将着重介绍第三和第四个任务--确定场景中的所有可见面(消隐)和计算场景中可见面的颜色(光照模型、纹理以及颜色模型等)。
正文:
真实感计算机图形学(二)--消隐及真实感图形生成
1 消隐
在计算机图形学中,有三种方式表示三维物体:线框图、消隐图和真实感图。其中真实感图形的生成也要在消隐基础上进行光照处理。所谓消隐就是给定一组三维对象及投影方式(视见约束),判定线、面或体的可见性的过程。根据消隐在间的不同,消隐算法可分为两类:
· 物体空间的消隐算法,消隐在规范化投影空间中进行,将物体表面的k个多边形中的每一个面与其余的k-1个面进行比较,精确地求出物体上每条棱边或每个面的遮挡关系。这类算法的计算量正比于k2。
· 图象空间的消隐算法,消隐在屏幕坐标系中进行,对屏幕上的每一个象素进行判断,确定在该象素点上可见的面。若屏幕分辨率为m×n,物体空间中共有k个多边形,则此类算法的的计算量正比于mnk。
大多数消隐算法都涉及排序和相关性的概念。排序是为了确定消隐对象之间的遮挡关系,通常在X、Y、Z三个方向分别进行。消隐算法的效率在很大程度上取决于排序的效率。相关性是指物体对象或其变换后的图象局部保持不变的性质,在消隐算法中利用相关性是提高排序率的重要手段。
常用的物体空间消隐算法有多边形区域排序算法和列表优先算法等。
Z-Buffer (深度缓存)是最简单的图象空间面消隐算法,深度缓存数组的使用避免了复杂的排序过程,在分辨率一定的情况下,算法计算量只与多边形个数成正比。该算法也便于硬件实现和并行处理。在此基础上,Z-Buffer扫描线算法利用了多边形边和象素点的相关性,使得算法效率进一步提高。扫描线算法也为简单光照模型提供了良好的消隐基础。
2 简单光照模型及明暗处理
光照模型(Illumination Model)是根据有关光学定律,计算真实感图形中各点投射到观察者眼中的光线强度和色彩的数学模型。简单的局部光照模型假定光源是点光源,物体是非透明体,不考虑折射,反射光由环境光、漫反射光和镜面反射光组成。
环境光的特点是:照射在物体上的光来自周围各个方向,又均匀地向各个方向反射。计算公式为:
其中Ia为环境光强度(常数);Ka为物体表面对环境光的反射系数。
漫反射光是物体向周围均匀地反射的光线,根据朗伯(Lambert)余弦定律可以给出计算公式:
其中Kd 为物体表面的漫反射系数;Ip,j为某一点光源所发出的入射光强度;θi为该光源的入射角,即物体表面法向量N和点光源入射光线向量Li之间的夹角(cosθi = N·Li)。
为模拟高光,B.T.Phone提出了Phone镜面反射模型:
其中Ks为物体表面的法向量;n为镜面反射光汇聚指数;αi为某一点光源在物体表面上产生的镜面反射光方向(Ri)与视线方向(V)之间的夹角,即cosαi = Ri·V)。
综上所述,物体表面任意一点向观察点的反射光强度I=Ie+Id+Is计算公式为:
或表示成各单位向量的点积形式:
实际应用时,应对光强的红、绿、兰分量分别进行处理。
在计算机图形学中曲面通常由多边形近似表示,有两种增量式明暗处理算法可以解决多边形之间亮度和色彩的光滑过渡问题,即双线性亮度插值法( Gouraud Shading)和双线性法向量插值法(Phong Shading)。
Gouraud的方法主要针对简单光照模型中的漫反射项,先计算物体各顶点的平均光强,然后用双线性插值求出多边形内每一点的光强。这种方法计算量较小,但无法完全消除马赫带效应,存在算法难以处理的奇异情况,对高光的处理也不够理想。
Phong的方法同样是增量线性插值,但进行插值的是顶点处的平均法向量,对多边形中的象素点,由插值得到的法向量分别计算光强。这种方法克服了亮度插值的一些不足,并可以很好地处理镜面反射,但计算量较Couraud方法为大。
基于局部光照模型及明暗处理的阴影生成算法也有很多。阴影是指景物中哪些没有被光源直接照射到的按区。在计算机生成的真实感图形中,阴影可以反映画面中景物的相对位置,增加图形的立体感和场景的层次感,丰富画面的真实感效果。阴影可分为本影和半影两种。本影加上它周围的半影组成软影区。单个点光源照明只能形成本影,多个点光源和线光源才能形成半影。
对多边形表示的物体,一种计算本影的方法是影域多边形方法,环境中物体的影域定义为视域多面体和光源在景物空间中被物体轮廓多边形遮挡的区域的交集。这种方法的实现可以利用现有的扫描线消隐算法。Athherton等人提出了曲面细节多边形方法,以多边形区域分类的隐藏面消去算法为基础,通过从光源和视点两次消隐生成阴影。
以上两种阴影生成方法只适用于用多边形表示的景物,无法解决光滑曲面片上的阴影生成问题。为此,Williams提出了Z-Buffer方法,首先利用Z-Buffer算法按光源方向对景物进行消隐,然后再用Z-Buffer算法按视线方向进行会制。这种方法可以方便地在理包括光滑曲面的任意复杂的景物,但存储量大,阴影区域附近易产生走样。
3 整体光照模型与光线跟踪
照射到物体上的光线,不仅有从光源直接射来的,也有经过其它物体反射或折射来的。局部光照模型只能处理直接光照,为了对环境中物体之间的各种反射、折射光进行精确模拟,需要使用整体光照模型。
相对于局部光照模型,整体光照模型可以表示为Iglobal=KRIR+ KTIT。其中Iglobal为非直接光照对物体上一点光强的贡献;IR为其他物体从视线的反射方向R反射或折射来的光强,KR为反射系数;KT为其他物体从视线的折射方向T折射或反射来的光强,IT为折射系数。将Iglobal与局部光照模型的计算结果相叠加,就可以得到物体上点的光强。
光线跟踪算法是典型的整体光照模型,最早由Goldste、Nagel和Appel等人提出,Appel用光线跟踪的方法计算阴影;Whited和Kay扩展了这一算法,用于解决镜面反射和折射问题。算法的基本思想如下:
对于屏幕上的每个象素,跟踪一条从视点出发经过该象素的光线,求出与环境中物体的交点。在交点处光线分为两支,分别沿镜面反射方向和透明体的折射方向进行跟踪,形成一个递归的跟踪过程。光线每经过一次反射或折射,由物体材质决定的反射、折射系数都会使其强度衰减,当该光线对原象素光亮度的贡献小于给定的阈值时,跟踪过程即停止。光线跟踪的阴影处理也很简单,只需从光线与物体的交点处向光源发出一条测试光线,就可以确定是否有其他物体遮挡了该光源(对于透明的遮挡物体需进一步处理光强的衰减),从而模拟出软影和透明体阴影的效果。
光线跟踪很自然地解决了环境中所有物体之间的消隐、阴影、镜面反射和折射等问题,能够生成十分逼真的图形,而且算法的实现也相对简单。但是,作为一种递归算法其计算量十分巨大。尽量减小求交计算量是提高光线跟踪效率的关键,常用的方法有:包围盒(entents)、层次结构(hierarchies)及区域分割(spatial partitioning)等技术。
光线跟踪是一个典型的采样过程,各个屏幕象素的亮度都是分别计算的,因而会产生走样,而算法本身的计算量使得传统的加大采样频率的反走样技术难以实用。
象素细分是一种适用于光线跟踪的反走样技术,具体方法是: 首先对每一象素的角点用光线跟踪计算亮度;然后比较各角点的亮度,若差异较大,则将象素细分为4个子区域,并对新增的5个角点用光线跟踪计算亮度;重复比较与细分,直到子区域各角点亮度差异小于给定的阀值为止;最后加权平均求出象素点的显示亮度。
与象素细分不同,Cook、Porter和Carpenter 提出的分布式光线跟踪是一种随机采样的方法,在交点处镜面反射方向和折射方向所夹的立体角内,按照一定的分布函数同时跟踪若干根光线,然后进行加权平均。Cook等人还提出了利用分布式随机采样技术模拟半影、景深和运动模糊等效果的方法。
光线跟踪的另一个问题是,光线都是从视点发出的,阴影测试光线则需另外处理,因而无法处理间接的反射或折射光源,例如镜子或透镜对光源所产生的作用就难以模拟。为解决这一问题,可以从光源和视点出发对光线进行双向跟踪。但是,大量从光源出发的光线根本不可能到达屏幕,这使得双向光线跟踪的计算量显著增大,难以实用。Heckbert和Hanrahanr提出的解决方法是只将从光源出发的光线跟踪作为常归光线跟踪的补充;Arvo方法则是对从光源发出进入环境的光线进行预处理;邵敏之和彭群生等人也提出了基于空间线性八叉树结构的对光源所发出光线进行优化的双向光线跟踪算法。
4 漫反射和辐射度方法
常规光照模型假设物体间的漫反射是一个恒定的环境光,即使双向光线跟踪也只能处理物体间的反射与折射,而不能处理物体间的漫反射。最初由Goral等人于1984年及Nishita等人于1985年提出的辐射度方法是一种基于热能工程的方法,用光辐射的产生和反射代替环境光,从而能够精确处理对象之间的光反射问题。
辐射度方法将景物和光源视为一个封闭的系统,在系统中光能量是守衡的;并假定构成景物的曲面都是理想的漫反射面。所谓辐射度,是指单位时间内从曲面上单位面积反射出去的光能量,记为B。在理想情况下,可以近似认为逼近曲面的面片上的光强是均匀的,即漫反射各向均匀。根据能量守衡定律,每个面片上的辐射度为:
其中 Bi面片i上微分元dAi的辐射度;Ei为面片i本身作为光源向空间均匀辐射出的光能;ρi为dAi的漫反射率;BjFij为面片j向dAi辐射的光能,Fij为其他面片上微分元dAj对于dAi的形状因子。环境中的每一个面片都存在以上关系,对于具有n个面片的场景可以得到如下联立方程:
其中Ei只当面片i本身为发光体的表面时才不为零,代表了系统中光能量的来源;形状因子Fij只与景物的几何位置有关。
通过上述线性方程组不难解出各面片的辐射度Bi,也就等于解出了面片的光亮度Ii。利用双线性插值;以这组亮度作为初值,就可计算出面片各顶点的亮度;最后针对特定视点插值求得屏幕各象素点的亮度值,生成最终的图象。
辐射度方法的主要计算量在于计算形状因子。Cohen和Greenberg提出的半立方体方法是一种近似计算封闭面形状因子的高效方法。首先以面片i的中心为原点,法向量为Z轴建立一个半立方体,将其五个表面划分成均匀的网格,每个网格单元的微形状因子可以预先求得;然后将场景中所有其他面片都投影到半立方体上,对于多个面片投影到同一个网格单元的情况需在投影方向上进行深度比较,网格单元只保留最近的面片,这一过程相当于Z-Buffer算法;最后将半立方体中所有与面片j相关的网格单元的微形状因子累加,即可得到面片i相对于面片j的形状因子Fij。
辐射度方法的优点在于算法与视点无关、计算和绘制可以分别独立进行、能够模拟颜色渗透效果等,但无法处理镜面反射与折射。
在辐射度方法中,面片向特定方向辐射出的光能量仅总辐射度有关,而与所接受能量的方向无关。Immel、Cohen和Greenberg推广了这一方法,每个面片不只计算唯一的辐射度,而是将面片半球空间分割成有限个空间立体角的区域,在每个区域内分别计算输入输出的光能量,通过双向辐射函数计算向某一方向辐射能量的概率,每个顶点的光强可以通过对与视点方向最为接近的若干方向上的辐射度进行插值得到,并最终完成图形生成。这种改进方法可以处理包含镜面和透明物体的复杂场景,但要付出巨大的时间开销和空间开销。
另一种方案是将辐射度与光线跟踪相结合,仅仅将两种方法的计算结果相加是不够的,必须同时处理漫反射面和镜面之间的光照关系。Wallace、Cohen和Greenberg提出了一种两步方法:第一步执行与视点无关的辐射度方法,辐射度的计算必须考虑镜面,这可以通过镜象法(mirror-world approach)予以模拟;第二步执行基于视点的光线跟踪算法,处理整体镜面反射和折射,并生成图形。算法效率的关键在于第一步,其中镜象法只需处理理想镜面的反射作用,并据此对形状因子加以修正,形状因子的计算量将随镜面数量的增加而显著增加。Sillon和Puech进一步扩展了上述两步法,在第一步时不采用镜象法,而是用递归的光线跟踪来计算形状因子,可以处理具有任意数量镜面及透明体的场景。
5 纹理映射
纹理映射(Texture Mapping)是通过将数字化的纹理图象覆盖或投射到物体表面,从而为物体表面增加表面细节的过程。纹理图象可以通过采样得到,也可以通过数学函数生成。物体的很多表面细节多边形逼近或其他几何建模的方法是难以表现的,因此纹理映射技术能够使得计算机生成的物体看起来更加逼真自然。
纹理映射技术最早由Catmull提出,经Blinn和Newell改进后得到广泛应用,成为计算机图形学中的一种重要方法。将纹理映射到物体表面,可以看作是将一个屏幕象素投影到纹理空间的对应区域并计算该区域的平均颜色,以求得真正象素颜色的最佳近似值。具体地说,纹理图象存在于独立的纹理空间中,映射分为两步进行,先将屏幕象素通过四个角点坐标映射到三维物体表面,再进一步映射到纹理空间,形成一个四边形区域,即对屏幕象素映射到三维物体表面上所形成的复杂曲面片的近似。屏幕象素的纹理映射结果可以通过对纹理空间中四边形区域进行累加得到。也可以采用相反的映射方式,即从纹理空间到三维物体再到屏幕象素进行映射,但这种映射方式需要占用更大的存储空间,更易产生走样,并且无法应用于扫描线算法。
物体表面的纹理可分为两类:颜色纹理和几何纹理。颜色纹理主要是指同一表面各处呈现出不现的花纹和颜色;几何纹理主要指物体表面在微观上呈现出的起伏不平。上述纹理映射方法只能处理颜色纹理,所生成的物体表面仍然是光滑的。Blinn在纹理映射基础上提出的Bump Mapping方法是一种模拟物体表面粗糙纹理的技术,可以不用对物体的粗糙表面在几何上进行建模就可以改善物体表面的微观结构,如大理石纹理表面雕刻的文字、混凝土墙面等效果。此外,更高级的真实感图形效果如人脸上流淌的汗水也可以通过随时间变化的Bump mapping来模拟。Bump Map是一个二维数组,数组中每个元素是物体表面上一点比其实际位置略高或略低的偏移向量。这些微小偏移被映射到物体表面一点后修正该点处的法向量,通过修正后的法向量进行光照计算。
纹理图象和屏幕象素都是离散的采样系统,很容易产生走样,即丢失纹理细节,使表面边界产生锯齿。纹理映射中常用的反走样方法是卷积滤波法。屏幕象素是一个矩形区域,映射到纹理空间上为一任意四边形,卷积滤波法就是取四边形所覆盖区域的纹理函数的卷积作为屏幕象素的光亮度,可以采用盒形、三角形、高斯分布及样条函数等作为滤波函数。在实际应用中为简化计算,常用正方形、矩形或椭圆等形状近似表示屏幕象素所覆盖的任意四边形区域。卷积滤波法是非线性的,计算量较大,并且不适用于Bump Mapping,因为Bump Mapping的纹理函数与象素的光亮度之间不是线性关系,此时可以使用前置滤波法。前置滤波是在纹理空间中按照不同的分辨率将一定区域内的纹理平均值预先算好,执行映射时只需按照屏幕象素所覆盖的区域大小选取一定的分辨率查表,并作适当线性插值即可。
以上二维映射在很多情况下都能得到很好的效果,但有时会产生失真,如在三维曲面上仍会呈现出二维效果,以及产生纹理接缝问题等。Peachey和Perlin提出了一种基于实体纹理的方法,用物体上点在三维空间的位置的函数作为纹理,从而更精确地表现木材或大理石等的雕刻效果。
其他一些材质的表面也可以用适当的方法模拟,如Gardner的透明映射方法可以用简单的形状模拟云彩。此外,很多基于物理模型、随机过程和分形几何等的方法也被用来生成自然纹理。
参考文献
[1] Donald Hearn, M. Pauline Baker. Computer Graphics C Version, 2nd Edition, 清华大学出版社, 1998
[2] Alan Watt. 3D Computer Graphics, 2nd Edition. Addison-Wesley, 1993
[3] 唐荣锡, 汪嘉业, 彭群生等. 计算机图形学教程. 科学出版社, 1994
[4] 唐泽圣, 周嘉玉, 李新友. 计算机图形学基础. 清华大学出版社, 1995
作者会员名:dipper