首页 > 代码库 > 消隐算法的总结与展望

消隐算法的总结与展望

1 引言消隐(Hidden Surface Removal)是在一定观察方向下消除不可见的线和面。有时也称为可见性测试。虽然各种消隐算法在可见性测试和不可见面消除方法上区别不大.但这些消隐方法有时还可以一起被统称为不可见面的消除.简称消隐。在三维造型技术、真实感图形的显示、虑拟场景的显示、以及在地形.地图的绘制中.消隐都起到至关重要的作用。所以研究和实现消隐算法,并根据场景的复杂度和各个不同应用领域的场景来提高消隐算法的速度是很有必要的,它对整个三维图形显示.真实感图形的显示以及各种地形地貌图形的显示是很有意义的。就目前研究出的面消隐算法,按照它们对消隐算法加速的方法不同可分为两类:一类是致力于消隐方法的研究。(1) 现有的消隐算法研究。现有的常用的几种面消隐算法主要有:Z—buffer算法、扫描线算法、画家算法、BSP树算法等,其主要区别在于它们消隐空间不同、可见面测试方法和不可见消除方法不同,故它们所适用的范围也不同。本文将在第三部分从每种算法本身的特点、消隐空间、排序效率和对场景的限制上对这几种消隐算法来分析和比较。(2)由于消隐算法不同,它们适用的场景类型和复杂度也不同,所以有一些专门用于针对地形、地图的绘制 、凸多边体消隐、复杂形体消隐、对某一种形体表示的场景的消隐 、对曲面消隐等的算法研究。(3) 研究新的消隐方法或用不同方法对已有算法改进来提高消隐速度.如树结构的消隐算法、改进的扫描线算法、BSP树法在辐射度显示中的应用、BSP树法加入到层次遮挡图(HOM)算法、BSP树法结合Image cache(Sprite)算法等.可以在不同程度的提高图形绘制效率。对于BSP树加入到其它算法中可提高其它算法效率,本文也将在第三部分进行比较。另一类是致力于减少视域中的待处理的景物面片数,来达到加速消隐过程的目的。硬件Z—buffer算法是目前最为常用的实时图形绘制算法,尽管其线性复杂度为O(N)(N为面片数),但该算法由于不考虑景物的空间连贯性,需逐一绘制景物面片而不管它是否隐藏。 因而,对高度复杂的场景,硬件Z—buffer算法仍难以达到实时。解决这一个问题的关键是减少复杂场景中需实时绘制的景物面片数N。而减少视域中的待处理面片数目前有两种途径:(1)基于空间连贯性的快速消隐算法。这种算法并不简化场景几何,而是充分利用景物空间、图象空间和时间域上的可见性和不可见性连贯性来剔除被遮挡的景物面片。层次遮挡图算法和层次Z—buffer算法是这类算法的典型代表。这两个算法均将景物空间组织成层次结构,并把面片的可见性计算分解为深度排序和在屏幕卜的重叠测试两个过程。算法引入深度z锥来实现快速的保守排序,而图象锥则用来加速面片的重叠测试,这两个层次结构的引入使得快速剔除不可见面成为可能.从而极大地降低了后续硬件z—buffer算法的绘制复杂度。更进一步,时问域上可见性连贯性的使用保证了Z锥和图象锥具有一个极好的初始条件,为快速绘制提供了重要保障。由于着眼于开发不可见景物的空间连贯性,这类算法对高遮挡率的场景非常有效.但对遮挡复杂性不高的复杂场景却毫无优势,仍无法达到实时。(2)基于层次细节的图形绘制技术 。这种算法根据视觉特性.对离视点较远的景物进行几何简化,从而达到降低场景复杂性的目的.或利用其它几何方法对整个场景面片进行简化,来减少场景面片数。这种方法大大的减少了场景的复杂度.提高了绘制场景的速度,但对高度复杂的场景.经过几何简化后的场景可能仍无法实时绘制.直到九十年代中期发展起来的纹理简化技术较好地解决了这类问题。其典型代表是Shade的图象缓存(Image Cache)技术 ,该算法结合几何简化和基于图象的绘制技术的优点。算法首先将场景组织成一棵BSP树。漫游时,算法自动地决定BSP树中各个结点中的景物是否满足纹理简化的误差要求,若满足.则取图象缓存中对应图象作为纹理.将其映射到一空间四边形表面 :来取代结点中的几何来绘制域面:否则,直接采用几何来绘制。显然,这种动态图象简化技术大大减低了场景的复杂性.从而提高了图形的绘制效率。但由于该算法采用从后向前的绘制方式,不能利用前述的空问不可见性连贯性来加速消隐过程。为此,郑文庭,鲍虎军等结合了层次遮挡图和图象缓存算法.提出了基于时空连贯性和几何简化技术的复杂场景快速消隐绘制算法口 ,可以适合对各种复杂场景的实时绘制.提高了图形绘制效率,加速了消隐过程。2.研究消隐算法的方法2.1从消隐空间来分析:对消隐算法消隐空间的分析是对消隐算法的效率的分析的一个重要方面。因为这样可以对消隐算法进行归类,并为提高消隐算法的效率打好基础。根据消隐所在的空间分为消隐算法可以分为三大类:(a)物体空间法(光线投射Roberts):物体空问是用户来定义三维形体的三维空间.即所说的世界坐标系空间。它是三维形体还没有被投影到二维空间内所在的空间。物体空间法就是利用三维环境信息或三维视图(主要使用三维观察坐标,有时也使用三维世界坐标)来消除隐藏面.即根据空间中各物体三维模型的几何关系,来判断哪些表面可见,哪些表面不可见。(b)图象空间法(Z—buffer、扫描线、warnock):图象空间是把三维图形投影到的二维空间,即我们所说的屏幕空间。图象空间法是基于物体三维模型的二维显示图形(使用二维显示坐标)来确定物体或表面与观察点的远近关系,从而判断哪些表面遮挡了其它表面。(c) 物体空间和图像空间的消隐算法(画家算法):在物体空间中预先汁算面的可见性优先级,再在图像空间中生成消隐图。从理论上讲,对象空间方法即为一个对象必须和空间中其他对象进行比较,以确定其是否可见。若画面中有n个对象,那么,比较操作的计算量为n 次。图像空间方法则是将每个对象的投影分解为像素,像素之间进行比较。若每个对象投影后含有N个像素.则比较计算量为N~n次,N虽然很大,但像素之间比较简单。实用的消隐算法通常将对象空间方法和图像空间方法结合起来使用。首先.使用空间对象方法删除对象中一部分不可见的面;其次,对剩余的面用图像空问方法进行比较计算。这样才能提高消隐算法的效率。2.2要研究一种消隐算法.就要知道每种算法的基本组成元素.这样才能更透彻的理解这种算法,去研究这种算法。对于每种消隐算法,可以从它们共同拥有的五个方面着手来研究。因为每一个消隐算法可以看成是以下一个五元组的集合.即:HA=(I,O,D,P,S),其中:HA为一个消隐算法I为要进行消隐处理的三维对象的集合:O为经过消隐处理的二维对象的集合:D为进行消隐处理时所采用的数据结构;P为进行消隐处理所需基本操作过程的集合,主要包括:分类、排序,三维坐标变换,透视投影变换,基本图形元素间的求交计算,两个区域重叠判断,点与区域的包含测试,面的朝向测试S为消隐策略,即规定P中各基本操作过程被采用的先后次序。消隐算法不同,主要在于D,P,S,对于D(消隐处理时所采用的数据结构),如扫描线算法中的AET、APT可以加速扫描速度,BSP树算法就是利用了二叉树来分割和显示场景,都是为了加速消隐速度;对于P(分类、排序、包含性测试、可见性测试),算法不同.方法也不同;S(P中各基本操作过程被采用的先后次序),根据不同的应用需要,场景类型来设计。因此,设计消隐算法时应考虑上述五个要素及它们之间的相互关系,在改进这五个基本要素方面着手去提高算法的速度.并在应用领域也要考虑这五个基本要素去着手。3.几种常用面消隐算法的比较消隐的对象是三维形体,而消隐的结果不只与三维形体的形状有关,还有观察方向有关。消隐的效率有很多因素决定.除了算法本身外,还有:场景的复杂度、要显示物体的类型、可用设备、以及要显示画面是动态的还是静态的等等。这些因素决定了要选用的消隐的算法类型,也决定了这种消隐算法的效率。在设备相同,要显示画面是静态的情况下,下面就目前几种常用的消隐算法:Z—buffer算法,扫描线算法,画家算法,BSP树算法,从不同的场景复杂度、消隐空间、排序效率、对物体类型的限制引 阁这几方面来进行比较:3.1从算法特点来比较:Z—buffer算法像素级上以距离观察者近的物体替代远的物体,物体在屏幕上的出现顺序无关紧要,算法简单.以利于硬件实现。单初始值的多样性,有限的复杂度O(N),N为场景中所含面的数目.无需对场景中的多边形排序,而扫描线和画家算法运用了稍复杂的排序算法,排序算法比起Z-Buffer算法难实现。因此.Z—buffer算法硬件易实现,得到了广泛的应用。但Z—buffer算法需要大量的存贮空间,当画深度复杂度为:s=d,fl=a的物体时浪费时间,z精度的误差性高(这时必须要采样点)。它的最大缺点是两个缓存数组占用的存储单元太多。故改进Z— Buffer算法,只设置一个深度缓存变量ZB,帧缓存(CB数组)存放每个像素的颜色值,这样可以大大减少存储单元。也可以用用扫描线相关性和点相关性来改进。另外,Z—buffer算法速度依赖于场景中多边形面片数目。而不是场景中对于观察者可见多边形面片数目。与Z—bufer算法相比较。扫描线Z_buffer算法做了两点改进:(1)整个绘图窗口内的消隐问题分解到一条扫描线上解决,使所需的Z缓冲器大大减少。(2)计算深度值时,利用了面连贯性,只用了一个加法。但它在每个象素处都计算深度值,进行深度比较。扫描线算法中.被多个多边形覆盖的象素区处还要进行多次计算,计算量仍然很大。区间扫描线算法克服了这一缺陷,使得在条扫描线上每个区间只计算一次深度值,并且不需要z缓冲器。它是把当前扫描线与各多边形在投影平面的投影的交点进行排序后.使扫描线分为若干子区间。因此,只要在区间任一点处找出在该处Z值最大的一个面,这个区间上的每一个象素就用这个面的颜色来显示。画家算法它的缺点是只能处理互不相交的面.而且深度优先级表中面的顺序可能出错。在两个面相交,三个以上的面重叠的情形,用任何排序方法都不能排出正确的序。这时只能把有关的面进行分割后再排序。而且,在画家算法中,深度排序计算量大,而且排序后,还需再检查相邻的面,以确保在深度优先级表中前者在前,后者在后。若遇到多边形相交,或多边形循环重叠的情形,还必须分割多边形,然后进行排序,最后再进行显示。而Z—Buffer算法和扫描线算法可避免这个问题。但扫描线算法和Z—buffer算法的缺点是,对于不可见的多边形面片了同样画出,这样造成了绘制过程中不必要的费时。因为硬件加速Z—buffer算法太慢,故提出了BSP树算法。BSP树一个数据结构,它把空间分成更小的部分。只存储多边形面片在空间的相对位置,这样使得多边形在场景中排序后,你会一直从后向前的绘制,这就意味着最小z值的多边开最后画。用其它方式排序多边形时,离视点最近的多边形最后绘出,比如画家算法就是这样.但很少会象BSP树一样节省,便利。因为BSP树法中多边形排序是预先处理的,不需花费运行时间。BSP树法是画家算法的拓展。但由于画家算法的缺点是对于交叉多边形的情况,这时多边形不会被正确绘出。而且多边形排序计算很费时间,算法也比较复杂。所以BSP树算法利用它的存储结构可以优化多边形的排序过程,故它的排序速度比画家算法要快,尤其是复杂度高的场景。另外在BSP树的各层次结点里我们可以放置景物的包围盒数据.因而可以形成场景的层次包围盒结构,这对加速求交(如光线跟踪算法)和视域裁剪算法很有利。同时.BSP树算法在辐射度的计算中也起着重要的作用,把BSP树应用到辐射度算法或其它算法中可以达到加速这种算法本身,一般的辐射度算法中,最坏的情况是与每条光线与场景中相关多边形会被测O(n ).n是树中的面片数.而用BSP—tree算法进行优化处理后,会减少大量运行时间.至于要减少多少要看树的结构了。BSP—tree算法的这种效果,也可以引入到HOM 算法.Sprite算法中,这样可以对复杂度高的场景的绘制减少运行时间.加速了消隐过程。文中 试验了,对于复杂度为157542个三角面片的场景.在一台SGI Octane图形工作站,CPU是MIPS R10000处理器. 内存为128M.MIXI图形板,4M纹理内存,经过BSP分割后,有276708个面片.测试结果:BSP+H0M 0.657秒BSP+Sprite 0.642秒BSP+H0M+Sprite 0.581秒可见,BSP—tree由于它独特的结构,可以在其它算法中起到很好的加速效果。3.2从消隐空间来比较:物体空间算法复杂度依赖于多边形面片的数目,每一个多边形都有和其它多边形比较,复杂度是n^2(n为多边形面片数目)。图象空间法:检查图象的每个象素点去检测哪个面在这一点绘出,复杂度依赖于多边形面片的数目和象素点的个数,因此复杂度是nN,(n是多边形面片的个数,N是象素点的个数。)扫描线算法和Z—buffer算法一样,也是图象空间算法,它能用z—buffer同样的运行时间去产生一个图像,但扫描线算法在缓冲区中仅用了一条扫描线的存储量,这也是被容易接受的原因之一。扫描线算法是利用扫描线相关性和点相关性,根据参考文献,扫描线算法实际操作更优,而且Z—buffer算法速度更快,它的排序是以线性速度增长的。画家算法(列表优先算法),是介于图象空间与物体空间的算法。在面集优先的计算与相对于分割平面的视点位置有关,而面片优先计算则与视点无关,使得面集和面片的优先集的计算是相互独立的,这样减少了计算量。它的排序也可利用扫描线相关性和点相关性,但是它在遇到相互交叉多边形时要分割,这样比较费时,这与扫描线算法比较,这是它的不利之处。画家算法方法和扫描线方法在复杂场景中效果比Z—buffer算法好,z—buffer算法对于复杂度高的场景却效果不好。BSP 树建立一个预先处理过程.只适于特殊场景。它的运行时间用在对于给定视点方向下按优先顺序对多边形遍历的过程.遍历比较费时,无需重新计算,因为它的预处理是一个可视独立结构.存储多边形的相对位置,比如一个多边形.只记录它在其它的多边形的前或后,因此,BSP树和它的预处理都不能进行消隐处理,只有遍历可进行消隐处理。场景的特性是一系列多边形进行比较,比如多边形P,从多边形集中,观察者位于P的前(后),那么位于多边形P后(前)的其它多边形不会遮挡它,同样P不会遮挡其它位于它的前(后)的多边形。BSP的运行时间上,它很好的储存了多边形的相对位置,然后运行,这样可以节省时间,比如,给定多边形P,在树的一个结点中,也许遮挡了树中的多边形Q,此时,P是否遮挡多边形集 中其它多边形Q,则在它的孩子结点中。3.3从排序算法的效率上来比较:z—buffer算法易实现,无需对场景中的多边形排序,而扫描线和画家算法运用了稍复杂的排序算法.排序算法比起Z—buffer算法难实现。因此由于Z—buffer算法硬件易实现,得到了广泛的应用。根据参考文献扫描线对中高复杂度场景的排序耗时约为N.画家算法在低复杂度场景排序耗时也为N,树结构排序对于复杂度高的场景耗时为N,N为要处理的面片目。对多边形排序时,按每个多边形顶点的最小的图象坐标系中的z值 或对边排序,即用两点间的最小的Y坐标值来排序。排序是根据所选的对象不同来对一系列所要处理的多边形或边进行排序,排序效率依赖于所需处理对象的数目。对于排序的各种结构,可以减少查找、插入.归类等的时间,从而减少整个消隐算法的运行时间。对于文献可知 一个排序树,对于复杂度小的场景排序时间为logN,对于复杂度高的场景,排序列表的的排序耗时也为logN,因此,画家算法对于复杂度高的场景,它的排序时间和BSP树对于复杂度小的场景的耗时是一样的.即,BSP树的速度比画家算法快。但画家算法的深度排序计算量大,而且排序后,还需再检查相邻的面.以确保在深度优先级表中前者在前,后者在后。若遇到多边形相交 或多边形循环重叠的情形.还必须分割多边形。而Z—Buffer算法和BSP树算法都可以避免这个问题。3.4从对场景的限制来比较:在画家算法中要求场景中多边形要求是凸多边形:BSP虽然没有场景中的多边形都是是凸多边形,但在分割过程中选择分割面时,所选多边形必须是凸多边形;描线算法中除了R0MEY算法中要求所有多边形都是凸多边形、三角面片、不允许有洞,其它扫描线算法都没对场景有限制。

 

消隐算法的总结与展望