收藏 分享(赏)

常用的消隐算法及总结.doc

上传人:j35w19 文档编号:6763055 上传时间:2019-04-22 格式:DOC 页数:9 大小:76KB
下载 相关 举报
常用的消隐算法及总结.doc_第1页
第1页 / 共9页
常用的消隐算法及总结.doc_第2页
第2页 / 共9页
常用的消隐算法及总结.doc_第3页
第3页 / 共9页
常用的消隐算法及总结.doc_第4页
第4页 / 共9页
常用的消隐算法及总结.doc_第5页
第5页 / 共9页
点击查看更多>>
资源描述

1、1 1常用的消隐算法及总结数学 092 邹继瑶 090064摘要:用计算机生成三维物体的真实图形是计算机图形学研究的重要内容。真实图形在仿真模拟、几何造型、广告影视、指挥控制和科学计算的可视化等许多领域都有广泛应用。经过消隐得到的投影图称为物体的真实图形。较常用的消隐算法有画家算法、Z-Buffer 算法及其它一些改进算法。消隐算法从算法基本思想、算法描述和算法步骤等方面对画家算法、Z-Buffer 算法和其它改进算法进行了分析,并得出了它们相关的特点。关键词:计算机图形学 消隐 景物空间消隐 图像空间消隐 算法引言: 近年来,产生真实的虚拟环境是计算机图形学孜孜以求的目标。在虚拟对象或场景的

2、创建中要用到许多综合处理过程,每一种都非常令人感兴趣也非常重要。计算机辅助设计、科学可视化、模拟训练、医疗成像、娱乐、广告等等,所有的这些,都要依赖于当今最前沿的计算机图形技术。伴随着计算机硬件、软件的飞速发展,计算机图形学技术也得到了质的飞跃。特别是面向对象技术和多媒体技术取得的成功,使得图形学成为计算机软件业中一个重要的分支。而程序设计方法、数据库系统和人工智能等新技术渗入到计算机图形学领域,又为计算机图形学提供了更加宽阔的发展空间和强劲动力。计算机图形学是研究通过计算机将数据转换成图形,并在专用显示设备上显示的原理、方法和技术的学科。主要介绍了计算机图形系统的基本知识,图形生成与显示的算

3、法,图形的表示与图形的数据结构,图形的几何变换与投影变换,图形的裁剪技术,图形消隐处理,真实感图形的生成等内容。面消隐作为图形学中一个分支是本文的一个重要的研究内容。一消隐的基本概念由于屏幕上的一些图元被另一些图元挡住所造成的。例如,当需要描绘一个由多边形面组成的三维物体时,那么它的一部分必然要被挡住,要在屏幕上显示的必须是可见的东西。打个比方,对于一个立方体,无论从哪个方向进行透视处理,最多只能看到其中的三个面。这样,就要想出一种方法来决定哪些面是所能看到的。如果使用从屏幕到世界的视处理方法,那么很自然的就能保证只有图元上正确的部分才显示在屏幕上。在这种视处理中,可见性在屏幕的每一个像素上进

4、行判断。从人眼发出一条射线,穿过一个给定的像素,那么首先与这条射线相交的表面在这一个像素上就是可见的。从这个表面反射的光线能够进入我们的眼睛。 用计算机生成三维物体的真实图形,是计算机图形学研究的重要内容。真实图形在仿真模拟、几何造型、广告影视、指挥控制和科学计算的可视化。等许多领域都有广泛应用。在用显示设备描述物体的图形时,必须把三维信息经过某种投影变换,在二维的显示表面上绘制出来。由于投影变换失去了深度信息,往往导致图形的二义性。要消除二义性,就必须在绘制时消除被遮挡的不可见的线或面,习惯上称作消除隐藏线和隐藏面,或简称为消隐。经过消隐得到的投影图称为物体的真实图形。消隐算法是把线框图变成

5、实体图必要的算法。通过看相关的报道知道,地面勘测卫星,气象卫星等要不断的向地面的工作站发送图片资料来帮助技术人员进行研究。而那个量是非常庞大的,因而接收到图像时往往是已经过压缩和消隐后得到的图片。由于最普通的图元就是多边形,所以讨论的许多技术都是只针对多边形模型的。由此将重点讨论用于多边形地形、体素模型的一些技术,为了能够更深入的了解消隐有关的基本知识,做了如下的2 2一些介绍和研究。二 常用的消隐算法消隐算法按其实现方式可分为图像空间消隐算法和景物空间消隐算法两大类。图像空间(屏幕坐标系)消隐算法以屏幕像素为采样单位,确定投影于每一像素的可见景物表面区域,并将其颜色作为该像素的显示颜色。景物

6、空间消隐算法直接在景物空间(观察坐标系)中确定视点不可见的表面区域,并将它们表达成同原表面一致的数据结构。图像空间消隐算法有深度缓存器算法、A 缓存器算法、区间扫描线算法等;景物空间消隐算法则包含 BSP 算法、多边形区域排序算法等;介于二者之间的有深度排序算法、区域细分算法、光线投射算法等。 (1)深度缓存器算法深度缓存器算法最早由 Catmull 提出,是一种典型的,也是最简单的图像空间面消隐算法,但其所需的存储容量较大,不仅要有帧缓存器来存放每个像素的颜色值,还需要有深度缓存器来存放画面上每一像素对应的可见表面采样点的深度值。由于通常选择 z 轴的负向为观察方向,因此算法沿着观察系统的

7、z 轴来计算各景物距离观察平面的深度,故该算法也称为 Z-buffer 算法。Z-buffer 算法的原理是:先将待处理的景物表面上的采样点变换到图像空间(屏幕坐标系),计算其深度值,并根据采样点在屏幕上的投影位置,将其深度值与已存贮在 Z 缓存器中相应像素处的原可见点的深度值进行比较。如果新的采样点的深度(z 值)大于原可见点的深度,表明新的采样点遮住了原可见点,则用该采样点处的颜色值更新帧缓存器中相应像素的颜色值,同时用其深度值更新 Z 缓存器中的深度值;否则,不做更改。深度缓存器算法最大的优点是算法原理简单,不过算法的复杂度为 O(N),N 为物体表面采样点的数目。另一优点是便于硬件实现

8、。现在许多中高档的图形工作站上都配置有硬件实现的 Z-buffer 算法,以便于图形的快速生成和实时显示。深度缓存器算法的缺点是占用太多的存储单元,假定屏幕分辨率为 1024768,则需要 21024768 个存储单元,即使每一存储单元只占一个字节,也需要超过 100 万个字节。不过,若采用扫描线 Z-buffer 算法时,可以每次只对一条扫描线进行处理,这样深度缓存器所需的存储量仅为 1屏幕水平显示分辨率深度存储位数,当然需要增加边表和多边形表的存储量。深度缓存器算法的其它缺点还有它在实现反走样、透明和半透明等效果方面的困难。同时,在处理透明或半透明效果时,深度缓存器算法在每个像素点处只能找

9、到一个可见面,即它无法处理多个多边形的累计颜色值。(2)区间扫描线算法每一条扫描线被物体中多边形的边界在屏幕的投影分割成若干相互邻接的子区间,每一子区间上只有一个可见面,如图 9-3。因此,只要在每一个子区间内任一点处,在投影于该处的各多边形中找出在该处深度(z 值)最大的多边形(最近的多边形),则这一多边形为该扫描线子区间内的唯一可见面,可按这一多边形的光照属性和几何位置计算确定子区间内各像素的显示颜色。这就是所谓的区间扫描线算法。区间扫描线算法也是一种图像空间消隐算法。3 3区间扫描线算法原理算法首先为各多边形建立一张边表和一张多边形表。边表需包含的内容有:进行消隐的场景中所有线段的端点坐

10、标、线段斜率的倒数、指向多边形表中对应多边形的指针。多边形表需包含的内容有:各多边形的平面方程系数、各多边形的颜色值、指向边表的指针。在消隐算法执行的过程中,从边表和多边形表中提取信息,构造一张有效边表。有效边表中包含与当前扫描线相交的边,按 x 的升序进行排列。排列后这些边将扫描线分成一个个的子区间xi, xi+1,如图 9-2,可将扫描线上的子区间分为三种类型:图 扫描线子区间(1)子区间为空,如图中的子区间 1 和 5。(2)子区间中只包含一个多边形,如图(a)中的 2 和 4,图(b) 中的 2 和 4,图(c) 中的 4。(3)子区间中包含多个多边形,如图(a)中的 3,图(b) 中

11、的 3,图(c)中的 2 和 3。若这些多边形在子区间内不相互贯穿,如图(a)中的 3,则仅需计算这些多边形在子区间任一端点处的深度,深度(z 值)大的平面为可见面。若两多边形交于子区间一端点但不贯穿,如图(b) 中的 3,则只要计算它们在区间另一端点处的深度,深度大者为可见面。为了使算法能处理互相贯穿的多边形,如图(c),扫描线上的分割点不仅应包含各多边形的边与扫描线的交点,而且应包含这些贯穿边界与扫描线的交点,如图(c)中增加了一个分割点,从而形成了子区间 2 和 3,否则算法不能处理多边形相互贯穿的情形。当然还有另外一种难以处理的情形就是循环遮挡(实际上贯穿也可看作循环遮挡的一种),若存

12、在这种情况,则需将多边形进行划分以消除循环遮挡。在形成了子区间后,只要取其投影覆盖该子区间的各多边形,计算它们在区间端点处采样点的 z 值(深度),深度最大的平面为可见面。于是,需要在有效边表的每个分割点对应的数据结点中增加一类信息:为每个多边4 4形建立一个标志位,以表示扫描线上每一子区间所对应的覆盖多边形。(3)深度排序算法排序算法(Depth-Sorting Method)是介于图像空间消隐算法和景物空间消隐算法之间的一种算法,它在景物空间中预先计算物体上各多边形可见性的优先级,然后再在图像空间中产生消隐图。深度排序算法可分为两步进行:(1)将多边形按深度进行排序:距视点近的优先级高,距

13、视点远的优先级低。(2)由优先级低的多边形开始,逐个对多边形进行扫描转换。其中步骤(1)是关键。假定沿 z 轴的负向进行观察,因而 z 值大的距观察者近,多边形 A 上各点 z 坐标的最小值和最大值分别记作 zmin(A)、zmax(A)。将多边形按深度进行排序的算法步骤为:(1)对场景中的所有多边形按 zmin(多边形)由小到大的顺序存入一个先进先出队列中,记为 M,同时初始化一空的先进先出队列 N(N 中存放已确定优先级的多边形,优先级低的先进,扫描转换时也先处理)。(2)若 M 中的多边形个数为 1,则将 M 中的多边形直接加入到 N 中,算法结束;否则按先进先出的原则从 M 中取出第一

14、个多边形 A 进行处理(A 是 M 中 zmin 值最小的多边形),同时将 A 从 M 中删除。(3)从当前 M 中任意选择一多边形 B,对 A 与 B 进行判别。若对 M 中任意的 B 均有 zmin(B)zmax(A),则说明 A 是 M 中所有多边形中深度最深的,它与其它多边形在深度方向上无任何重叠,不会遮挡别的多边形。将 A 按先进先出原则加入 N 中,转(2);否则继续。否则说明存在某一多边形 B,A 与 B 有深度重叠,则需要依次进行以下判别:a. 判别多边形 A 和 B 在 xoy 平面上投影的包围盒有无重叠,若无重叠,则 A、B 在队列中的顺序无关紧要,将 A 按先进先出原则加

15、入 N 中,转(2);否则继续。b. 判别平面 A 是否完全位于 B 上 A 与 B 的重叠平面之后,若是,将 A 按先进先出原则加入 N 中,转(2);否则继续。c. 判别 B 上平面 A 与 B 的重叠平面是否完全位于 A 之前,若是,将 A 按先进先出原则加入 N 中,转(2);否则继续。d. 判别多边形 A 和 B 在 xoy 平面上的投影有无重叠,若无重叠,则 A、B 在队列中的顺序无关紧要,将 A 按先进先出原则加入 N 中,转(2);否则在 A 与 B 投影的重叠区域中任取一点,分别计算出 A、B 在该点处的 z 值,若 A 的 z 值小,说明 A 距视点远,优先级低,将 A 按

16、先进先出原则加入 N 中,转(2);若 A 的 z 值大,则交换 A 和 B 的关系,即将 B 看作是当前处理对象,转(3)进行 M 中其它多边形的判别。排序完成后得到队列 N,由于 N 是按优先级由低到高顺序排列的多边形先进先出队列,因此只需从 N 中逐个取出多边形进行扫描转换即可。(4)区域细分算法区域细分算法的出发点是投影平面上一块足够小的区域可以被至多一个多边形所覆盖。因此,可以这样来构造算法:考察投影平面上的一块区域,如果可以很“容易”地判断覆盖该区域中的哪个或哪些多边形是可见的,则可按这些多边形的光照属性和几何位置计算确定子区域内各像素的显示颜色;否则就将这块区域细分为若干较小的区

17、域,并把上述推5 5断原则递归地应用到每个较小的区域中去。当区域变得越来越小时,每块区域上所覆盖的多边形就越来越少,最终的区域会易于分析判断。这显然是图像空间消隐算法的一种,它利用了区域相关性。在循环细分过程的每一阶段,可将每个多边形根据其投影与所考察的区域之间的关系分为 4 类:(1)围绕多边形:多边形的投影完全包含了考察的那块区域;(2)相交多边形:多边形的投影与该区域相交;(3)被包含多边形:多边形的投影完全落在该区域之中;(4)分离多边形:多边形的投影完全落在该区域之外。根据这 4 种类别可以进行多边形的可见性测试。若以下条件之一为真,则可不必再对区域进一步加以细分而直接处理:(1)所

18、有多边形均是该区域的分离多边形,于是可直接将该区域中的所有像素点置为背景颜色。(2)针对该区域,仅存在一个相交多边形,或仅存在一个被包含多边形,或仅存在一个围绕多边形。则可先将该区域中的所有像素点置为背景颜色,再将相应多边形的颜色值填入对应像素点的帧缓存中。(3)针对该区域,有多于一个的相交多边形、被包含多边形或围绕多边形,则计算所有围绕的、相交的、以及被包含的多边形在该区域 4 个顶点处的 z 坐标,如果存在一个围绕多边性,它的 4 个 z 坐标比其它任何多边性的 z 坐标都大(最靠近视点),那么,可将该区域中的所有像素点置为该多边形的颜色值。区域细分方式有两种,一种是将区域简单地分割为四块

19、大小相等的矩形;另一种是自适应细分,即沿多边形的边界对区域进行细分,这样可以减少分割次数,但在区域细分和测试多边形与区域的关系方面处理更为复杂。(5)光线投射算法光线投射算法是建立在几何光学基础上的一种算法,它模拟人的视觉效果,沿视线的路径跟踪场景的可见面。其基本思想是:由视点出发通过投影窗口(屏幕)的任一像素位置构造一条射线(投影线),将射线与场景中的所有多边形求交,如果有交点,就将该像素点的颜色置为深度(z 值)最大的交点(最近的交点)所属的多边形的颜色;如果没有交点,就将该像素点的颜色置为背景颜色。算法步骤可简单描述如下:(1)通过视点和投影平面(显示屏幕)上的所有像素点作一入射线,形成

20、投影线。(2)将任一投影线与场景中的所有多边形求交。(3)若有交点,则将所有交点按 z 值的大小进行排序,取出最近交点所属多边形的颜色;若没有交点,则取出背景的颜色。(6)BSP 树BSP 树与画家算法类似,BSP 算法也是从远到近往屏幕上覆盖景物的画面,BSP 算法在对场景进行消隐之前需建立场景的 BSP 树。实际上,建立场景 BSP 树的过程是对场景所含景物多边形递归地进行二叉分类的过程。先在场景中选取任意一剖分平面 P 将场景的整个空间分割成两个子空间(相对于视点,这6 6两个子空间一个位于 P 之前,一个位于 P 之后)。相应地,场景中的景物也被 P 分成两组。由于 C 与 P 相交,

21、因此 P 把 C 分割成两个物体 C 和 D。这样,用剖面 P 进行第一次分割后,形成两组景物 B、D 和 A、C(B、D 在 P 之前,A、C 在 P 之后)。然后再用剖分平面 Q 对第一次剖分生成的两个子空间进行分割,并对每一子空间中所含的景物进行分类,分为 D 和B,C 和 A(D、C 在 Q 之前,B、A 在 Q 之后)。递归进行上述空间剖分和景物分类过程,直至每一子空间中所含景物少于给定的阈值为止,可表示成一棵 BSP 树,图 9-14(b)示出了图 9-14(a)的分割过程和形成的分类景物。对于由多边形组成的场景,常选择与某一多边形重合的平面作为分割平面。一旦构造完BSP 树,即可

22、依据当前视点所在的位置,对场景中每一分割平面所生成的两个子空间进行分类,其中包含视点的子空间标记为“front”,位于分割平面另一侧的子空间标记为“back”。然后,递归搜索场景的 BSP 树,优先绘制标识为“back”的子空间中所含景物。BSP 算法非常适合在场景不变视点变化的场合对场景中各多边形作快速排序,是一种决定场景可见性的有效方法。目前已有许多系统借助硬件来完成 BSP 树的生成和处理。(7)多边形区域排序算法多边形区域排序算法是一种景物空间消隐算法。算法思想源于对隐藏面的观察:由于隐藏面是场景中位于场景可见面之后的多边形表面或表面的一部分,它们在投影面上的投影区域完全为可见面的投影

23、所覆盖,因此,可以将多边形按深度值由小到大排序,是完全不可见的。设场景内有 n+1 个多边形,且假定沿 z 轴的负向进行观察,记 zmin(P)为多边形 P上各顶点 z 坐标的的最小值。另外设定三个集合 M、N 和 L,集合 M 存放待处理的多边形,集合 N 存放可见的多边形,集合 L 中存放排好序的多边形。多边形区域排序算法可简单描述如下:(1)初始化:将场景中的多边形全部放入集合 M 中,集合 N、L 置为空。(2)若集合 M 中的多边形的个数为 1,则从集合 M 中取出该多边形放入 N 中,转(6)。否则对 M 中的所有多边形按 zmin(P)由大到小(由近到远)的顺序进行预排序,放入

24、L 中。(3)从 L 中取出当前深度(z 值)最大的多边形,即最近的多边形作为裁剪多边形PA,求出该多边形在 xoy 面上的投影多边形 A。且从集合 M 和 L 中去掉 PA。(4)若 L 为空,则将 PA 放入 N 中(可见面),转(2)。否则,从 L 中取出一个多边形 PB,并从集合 L 中去掉 PB,用 A 对 PB 的投影 B 进行裁剪,得到 Bin。(5)若 Bin 为空,即没有重叠部分,转(4);否则求出重叠多边形 PAin 和 PBin 各自顶点的 z 值,据此比较其深度,以确定 PA 是否是离视点较近的多边形。若是,将多边形PB 从 M 中去掉,将 PBout 加入到 M 中,

25、转(4);否则,将多边形 PAout 放入 M 中,L 置空,转(2)。(6)扫描转换集合 N 中的多边形。多边形区域排序算法可适用于任意多边形构成场景的消隐处理,比如它可以正确消隐循环遮挡的情况。多边形剔除在多边形表面模型中,一个面包括正面和反面,通常正面会被观察着看见,而反面通常看不见,这种看不见的面,可以直接进行消隐处理,这种处理7 7可以使用 OpenGL 中的多边形剔除函数:glEnable(GL_CULL_FACE);glCullFace (mode);这里用 GL_CULL_FACE 符号常量调用 glEnable 函数表示开启多边形表面剔除功能。然后调用 glCullFace

26、函数指定多边形所要剔除的面,参数 mode 可以赋值为 GL_FRONT、GL_BACK和 GL_FRONT_AND_BACK,分别表示剔除多边形的前面、后面以及前后面。剔除操作可以影响从开启剔除功能开始绘制直至调用函数:glDisable(GL_CULL_FACE);关闭剔除功能为止的所有多边形。程序:多边形剔除#include #include void Initial()glEnable(GL_DEPTH_TEST);glFrontFace(GL_CW);glClearColor(1.0, 1.0, 1.0, 0.0);void ChangeSize(int w, int h)if(h

27、= 0) h = 1;glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w farNormalDepth。这样,通过 glDepthRange 函数可以在透视投影有限观察空间中的任意区域进行深度测试。另一个非常有用的函数是:glClearDepth (maxDepth);参数 maxDepth 可以是 0.0 到 1.0范围内的任意值。glClearDepth 用 maxDepth 对深度缓存进行初始化,而默认情况下,深度缓存用 1.0 进行初始化。由于在进行深度测试中,大于深度缓存初始值的多边形都不

28、会被绘制,因此 glClearDepth 函数可以用来加速深度测试处理。这里需要注意的是指定了深度缓存的初始化值之后,应调用:glClear(GL_DEPTH_BUFFER_BIT);完成深度缓存的初始化。9 9在深度测试中,默认情况是将需要绘制的新像素的 z 值与深度缓冲区中对应位置的 z值进行比较,如果比深度缓存中的值小,那么用新像素的颜色值更新帧缓存中对应像素的颜色值。这种比较测试的方式可以通过函数:glDepthFunc(func);进行修改。其中参数func 的值可以为 GL_NEVER(没有处理)、GL_ALWAYS(处理所有)、GL_LESS(小于)、GL_LEQUAL(小于等于

29、)、GL_EQUAL(等于)、GL_GEQUAL(大于等于)、GL_GREATER(大于)或 GL_NOTEQUAL(不等于),其中默认值是 GL_LESS。这些测试可以在各种应用中减少深度缓存处理的的计算。结论:景物空间算法是在物体被定以时所处的坐标系中实现的。这种算法精度高,通常只受限于所采用的显示设备的分辨率,生成的图形可以放大多倍仍让人满意。景物空间算法特别适用于要求精密的工程应用领域。图像空间算法是在物体先试试所在的屏幕坐标系中实现的,一旦达到屏幕的分标率,计算就不再进行下去,生成的画面放大后往往不能令人满意,但是由于它在光栅扫描过程中易于利用画面的连贯性,实现的效率往往更高。物体从简单到复杂有许多种不同的情况,所以没有一种绝对适合所有图形及图像的消隐算法。实际使用时,应根据模型对图像的要求、硬件配置、算法以及编程的难易程度等因素来综合考虑,选择最适合的方法。参考文献:1 王汝传,黄海平,林巧民计算机图形学教程(第二版).北京:人民邮电出版社.2009.82 夏小玲。三维消隐算法研究【J】东华大学学报(自然科学版) 。2002(28)2:1371423 靳海亮 高景祥 图像消隐算法综述第 34 卷(2006)第 9 期

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 工作总结

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报