计算机图形学-第十三章-隐藏面的消除

上传人:suns****4568 文档编号:93422485 上传时间:2019-07-22 格式:PPT 页数:33 大小:359KB
返回 下载 相关 举报
计算机图形学-第十三章-隐藏面的消除_第1页
第1页 / 共33页
计算机图形学-第十三章-隐藏面的消除_第2页
第2页 / 共33页
计算机图形学-第十三章-隐藏面的消除_第3页
第3页 / 共33页
计算机图形学-第十三章-隐藏面的消除_第4页
第4页 / 共33页
计算机图形学-第十三章-隐藏面的消除_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《计算机图形学-第十三章-隐藏面的消除》由会员分享,可在线阅读,更多相关《计算机图形学-第十三章-隐藏面的消除(33页珍藏版)》请在金锄头文库上搜索。

1、Lecture 13 隐藏面的消除,概述,在生成具有真实感的景物时,要考虑的一个重要问题是如何由选定的视向把画面的不可见部分消去,即隐藏线及隐藏面的消除问题。目前,存在解决此问题的若干方法,并建立了若干有效的消隐算法。,消隐算法及其分类,人不能一眼看到一个三维物体的全部表面。从一个视点去观察一个三维物体时,必然只能看到该物体表面上的部分点、线、面,而其余部分则被这些可见部分遮挡住。如果观察的是若干个三维物体,则物体之间还可能彼此遮挡而部分不可见。,消隐算法及其分类,按照操作对象的不同表达,消隐算法可以分为两大类 对象空间方法(Object Space Methods) 图像空间方法(Image

2、 Space Methods),对象空间方法和图像空间方法,对象空间是对象三维空间,即对象被定义时所处的坐标空间。 对象空间方法是对要显示的各个对象及对象的各个部分进行相互比较,分析对象的三维特性之间的关系,以确定不可见的表面或者线条的方法。 图像空间是对象投影后所在的二维空间,即设备坐标系 图像空间方法是将对象投影后分解为像素,按照一定的规律,比较像素之间的深度(z)值,从而确定其是否可见的方法。,消隐算法及其分类,虽然各种消隐方法具体的实现方法不同,但这些方法中大都采用分类及连贯两种基本方法改进算法效率。 分类方法主要用于深度比较,即按照景物中各个线、面、体与取景平面的距离分类,以决定取舍

3、。 连贯方法是指利用显示景物具有某些相关特性,可以用来简化计算。,消隐算法及其分类,从消隐对象角度来看,消隐算法可分为两类:线消隐和面消隐。 线消隐的消隐对象是物体上的边,消除的是物体上不可见的边。 面消隐的消隐对象是物体上的面,消除的是物体上不可见的面。,画家算法,画家算法是把对象空间方法与图像空间方法结合在一起来消除隐藏面的方法。 画家算法的原理: 先把屏幕置成背景色,再把物体的各个面按其离视点的远近进行排序,离视点远者在表头,离视点近者在表尾,排序结果存在一张深度优先级表中。 然后按照从表头到表尾的顺序逐个绘制各个面。由于后显示的图形取代先显示的画面,而后显示的图形所代表的面离视点更近,

4、所以由远及近的绘制各面,就相当于消除隐藏面。 该算法习惯上称为画家算法或深度排序算法。,多边形的画家算法,(1)以每一多边形的zmin作为排序关键码,建立初步的深度排序表,表中第一个多边形是具有最小z值的多边形,记为P。设视点位于z轴方向的无穷远处,则P为离视点最远的多边形,表中第二个多边形标为Q。 (2)检查表中每个多边形与P的关系。分为3种关系:,多边形的画家算法,a.,多边形的画家算法,b.,多边形的画家算法,c.所有测试失败: 必须对两个多边形在Oxy平面上的投影作求交运算。计算时不必具体求出重叠部分,在交点处进行深度比较,只要能判断出前后顺序即可。,深度缓冲算法,Z缓冲区(Z-Buf

5、fer)算法。在这个算法里,不仅需要有帧缓存来存放每个像素的颜色值,还需要一个深度缓存来存放每个像素的深度值。,深度缓冲算法,Z缓冲器的深度值越大,说明该点越接近视点。 在把显示对象的每个面上每一点的属性(颜色或灰度)值填入帧缓冲器相应单元前,要把这点的z坐标值和Z缓冲器中相应单元的值进行比较。只有前者大于后者时才改变帧缓冲器的那一单元的值,同时Z缓冲器中相应单元的值也要改成这点的z坐标值。,深度缓冲算法描述,Z-Buffer算法() 帧缓存全置为背景色 深度缓存全置为最小z值 for (每一个多边形) 扫描转换该多边形 for (该多边形所覆盖的每个像素(x,y) ) 计算该多边形在该像素的

6、深度值d(x,y); if (d(x,y)大于Z缓存在(x,y)的值) 把d(x,y)存入Z缓存中(x,y)处 把多边形在(x,y)处的颜色值存入帧缓存的(x,y)处 ,深度缓冲算法,该算法的最大优点在于简单。它可轻而易举地处理隐藏面以及显示复杂曲面之间的交线。画面可以任意复杂。由于画面元素可按任意次序写入帧缓冲器和Z缓冲器,故无需按深度优先级排序,可省去深度排序时间。,扫描线算法,如果只对一条扫描线进行Z缓冲器算法,则可以得到扫描线Z缓冲器算法 。 扫描线Z缓冲器算法做了两点改进。 将整个绘图窗口内的消隐问题分解到一条条扫描线上解决,使所需的Z缓冲器大大减少。 计算深度值时,利用了面连贯性,

7、只用了一个加法。,区间扫描线算法,扫描线Z缓冲器中,被多个多边形覆盖的像素区处还要进行多次计算,计算量仍然很大。 区间扫描线算法克服了这一缺陷,可利用连贯性提高算法效率,使得在一条扫描线上每个区间只计算一次深度值,并且不需要Z缓冲器。 它是把当前扫描线与各多边形在投影平面的投影的交点进行排序后,使扫描线分为若干子区间。,区间扫描线算法,可以将区间分为三类: 区间为空 ,区间 0, a1,此时只要按背景属性显示即可; 区间中只包含一个区段即一条交线或交线的一部分 .如图中的区间a1, a2和a3, a4,此时按该区段所在多边形的显示属性进行显示; 区间中有多条分别属于不同多边形的区段,如图中的区

8、间a2, a3,此时必须计算该区间中每个区段的深度,具有最大z值的区段为该区间中的可见段,按此可见段所在多边形的属性进行显示,区间,区间扫描线算法,算法描述,for (绘图窗口内的每一条扫描线) 求投影与当前扫描线相交的所有多边形; 求上述多边形中投影与当前扫描线相交的所有边,将它们记录在活化边表AEL中; 求AEL中每条边的投影与扫描线的交点; 按交点的u坐标将AEL中各边从左到右排序两两配对组成一个区间; for (AEL中每个区间) 求覆盖该区间的所有多边形,将它们记入活性多边形表APL中; 在区间上任取一点,计算APL中各多边形在该点的深度值, 记值最大者为P; 用多边形P的颜色填充该

9、区间; ,BSP树算法,二叉空间剖分(BSP,Binary Space-Partitioning)树算法是一种判别物体可见性的有效算法。它类似于画家算法,将面片由后往前地在屏幕上绘出 。,构造BSP树,BSP树取场景中的一个多边形作为分割面,递归地将空间分为两个子空间。这两个子空间再分别选一个多边形作分割面递归地子分下去,直到每个子空间只剩一个多边形为止。,BSP树遍历,BSP树可见面算法的基本思想是先将离视点最远的多边形写入帧缓存或进行显示,即按从后到前的顺序对多边形绘制。 如果视点在根结点多边形后侧,最终的显示顺序依次为3、2a、1、2b、5、4。,区域子分算法,区域子分算法又称为Warn

10、ack算法 。 基本思想是:把物体投影到绘图窗口上,然后递归分割窗口,直到窗口内目标足够简单,可以显示为止。而在显示时进行深度探索。 该算法充分利用了区域的连贯性,提高了计算速度。,区域子分算法,算法步骤: 初始窗口取作屏幕坐标系的矩形,将场景中的多边形投影到窗口内。如果窗口内没有物体则按背景色显示; 若窗口内只有一个面,则把该面显示出来; 否则,窗口内含有两个以上的面,则把窗口等分成4个子窗口。对每个小窗口再做上述同样的处理。,光线投射算法,光线投射算法的思想是:考察由视点出发穿过观察屏幕的一个像素而射入场景的一条射线,则可确定出场景中与该射线相交的物体 。 在计算出光线与物体表面的交点之后

11、,离像素最近的交点的所在面片的颜色为该像素的颜色;如果没有交点,说明没有多边形的投影覆盖此像素,用背景色显示它即可。,算法描述,for(屏幕上的每一像素) 形成通过该屏幕像素(u,v)的射线; for (场景中的每个物体) 将射线与该物体求交; if (存在交点) 以最近的交点所属的颜色显示像素(u,v) else 以背景色显示像素(u,v); ,OpenGL中的多边形的消除与消隐,在OpenGL中,多边形分为正面和反面,在使用多边形的过程中可以对多边形的两个面进行分别操作。缺省状态下OpenGL对多边形正反面是以相同的方式绘制的,要改变多边形的绘制状态,必须调用函数glPolygonMode

12、(),函数说明如下: glPolygonMode(GLenum face,GLenum mode) 功能:该函数控制多边形反面或正面的绘图模式。 参数说明: face:指定多边形的面。face可能的值是GL_FRONT、GL_BACK和GL_FRONT_AND_BACK。其中GL_GL_FRONT指定多边形的正面,GL_BACK指定多边形的反面,GL_FRONT_AND_BACK指定多边形的正面和反面。 mode:指定指定面的模式。,OpenGL中的多边形的消除与消隐,g1FrontFace()则用来定义多边形的哪一面被视为正面: g1FrontFace(Glenum mode) 功能:指定多

13、边形的正面。 参数说明: 指定选择多边形的面。 mode可以为GL_CCW或GL_CW。GL_CCW是OpenGL的缺省状态,有序顶点按逆时针方向出现的为多边形的正面。GL_CW指定所绘制的多边形的顶点按顺时针方向排列的面是多边形的正面。,OpenGL中的多边形的消除与消隐,glCullFace(Glenum mode) 功能:指出在转换成屏幕坐标之前,哪些多边形应该被消除。 参数说明: mode:可以是GL_FRONT、GL_BACK和GL_FRONT_AND_BACK。从而指定正向、反向或所有的多边形。缺省状态是GL_BACK。 用g1Enable(GL_CULL_FACE)启动消除多边形

14、,用g1Disable(GL_CULL_FACE)关闭消除多边形。,OpenGL中的多边形的消除与消隐,void glClearDepth(GLclmpd depth) 功能:指定在刷新深度缓冲器时,所用的深度值。也就是刷新深度缓冲器后,深度缓冲器中为窗口中的每一个像素点设置的深度值。 参数说明: depth:指定刷新深度缓冲器时所用的深度值。 在实际操作中,使用消隐要先启动深度测试,即调用函数: glEnable(GL_Depth_Test)取消自动实现三维场景的消隐要调用函数:glDisable(GL_Depth_Test),OpenGL中的多边形的消除与消隐,在特殊的环境中,对深度的比较会有特殊的要求OpenGL中提供了深度比较的控制函数。 void glDepthFunc(Glenum Func) 功能:在消隐操作中设置比较函数。 参数说明:,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号