1、第9章 消隐,问题场景中哪些物体的表面是可见的,哪些是被遮挡不可见的(隐藏面或线)?如何在投影过程中消除隐藏面或线?,两类消隐算法:,图象空间消隐算法:以屏幕象素为采样单位,确定投影于每一象素的可见景物表面区域,并将其颜色作为该象素的显示颜色。 景物空间消隐算法:直接在景物空间(观察坐标系)中确定视点不可见的表面区域,并将它们表达成同原表面一致的数据结构。,9.1 深度缓存器算法,算法的原理: 使用两块缓冲区: Z缓存:存深度 帧缓存:存颜色。,Z-buffer算法,算法步骤:,1初始化:把Z缓存中各(x,y)单元置为z的最小值,而帧缓存各(x,y)单元置为背景色。2在把物体表面相应的多边形扫
2、描转换成帧缓存中的信息时,对于多边形内的每一采样点(x,y)进行处理:计算采样点(x,y)的深度z(x,y);把大于Z缓存中在(x,y)处的z(x,y)值存入Z缓存中的(x,y)处,再把多边形在z(x,y)处的颜色值存入帧缓存的(x,y)地址中。,Z-buffer,帧缓存,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,80,问题:计算采样点(x,y)的深度z(x,y)。 假定多边形的平面方程为:Ax+By+Cz+D=0。,利用连贯性加速深度的计算:,扫描线上所有后继点的深度值:,当处理下一条扫描线y=y-1时,该扫描线上与多边形相交的最左边(x最小)交点
3、的x值可以利用上一条扫描线上的最左边的x值计算:,可采用边表和有效边表来提高算法效率扫描线深度缓存器算法,算法特点:算法简单。需较大的存储空间。处理反走样、透明和半透明效果困难。对于 ,可以使用A缓冲器算法克服。,9.2 区间扫描线算法,算法原理:避免对被遮挡区域的采样是进一步提高扫描线算法计算效率的关键。,算法: 三张表:边表、多边形表、有效边表。 算法关键:分割子区间,确定子区间上的唯一可见面。 特殊情形:贯穿情形、循环遮挡情形。,贯穿情形:为了使算法能处理互相贯穿的多边形,扫描线上的分割点不仅应包含各多边形的边与扫描线的交点,而且应包含这些贯穿边界与扫描线的交点。,循环遮挡:将多边形进行
4、划分以消除循环遮挡。,例:,9.3 深度排序算法(画家算法),算法原理:若场景中任何多边形在深度上均不贯穿或循环遮挡,则各多边形的优先级顺序可完全确定,扫描转换就可以按从优先级低的多边形到优先级高的多边形的顺序进行。,算法步骤:1.将多边形按深度进行排序:距视点近的优先级高,距视点远的优先级低。2.由优先级低的多边形开始逐个对多边形进行扫描转换。其中的关键是将多边形按深度进行排序。,排序步骤: 1.将所有多边形按Zmin由小到大的顺序存入队列M中,并初始化一空队列N。 2.取M中第一个多边形(A)与其他多边形进行深度重叠比较,若无重叠关系,A入N;否则作重叠处理。 3.将已处理的多边形从M中删
5、除,转2.,直到M为空。,队列M,队列N,初步排序队列,最终排序队列,深度重叠比较:最小包围盒 Zmin(B)Zmax(A) 重叠处理:A位于重叠之后: A入N,B上重叠平面在A之前:A入N在重叠区域任取一点计算A和B的Z值,若A的Z值小,则A入N,否则交换A和B的关系。,9.4 区域细分算法,算法原理按四叉树方法将区域分割为四块大小相等的矩形 ,直到每个矩形区域只被一个多边形所覆盖。,四类多边形区域:,终止循环细分的条件: 所有多边形均是该区域的分离多边形:背景色。 仅存在一个多边形:先对区域填背景色,再填象素色。 存在Z值最大的围绕多边形:直接使用该多边形的颜色。,可见性测试,自适应细分,9.5 光线投射算法,算法原理:,算法步骤可简单描述如下: 1. 通过视点和投影平面(显示屏幕)上的所有象素点作一入射线,形成投影线。 2. 将任一投影线与场景中的所有多边形求交。 3. 若有交点,则将所有交点按z值的大小进行排序,取出最近交点所属多边形的颜色;若没有交点,则取出背景的颜色。 4. 将该射线穿过的象素点置为取出的颜色。,9.6 BSP树算法,算法原理 实例说明,9.7 多边形区域排序算法,算法思想:将多边形按深度值由小到大排序,用前面的可见多边形去切割位于其后的多边形,使得最终每一个多边形要么是完全可见的,要么是完全不可见的。,