计算机图形学第5讲图形消隐
计算机图形学消隐算法
图9-1 区间扫描线算法原理
算法首先为各多边形建立一张边表和一张多边形表。边表需包含的内容有:进行消隐的场景中所有线段的端点坐标、线段斜率的倒数、指向多边形表中对应多边形的指针。多边形表需包含的内容有:各多边形的平面方程系数、各多边形的颜色值、指向边表的指针。在消隐算法执行的过程中,从边表和多边形表中提取信息,构造一张有效边表。有效边表中包含与当前扫描线相交的边,按x的升序进行排列。排列后这些边将扫描线分成一个个的子区间[xi, xi+1],如图9-2,可将扫描线上的子区间分为三种类型:
递归进行上述空间剖分和景物分类过程,直至每一子空间中所含景物少于给定的阈值为止,可表示成一棵BSP树,图9-14(b)示出了图9-14(a)的分割过程和形成的分类景物。对于由多边形组成的场景,常选择与某一多边形重合的平面作为分割平面。一旦构造完BSP树,即可依据当前视点所在的位置,对场景中每一分割平面所生成的两个子空间进行分类,其中包含视点的子空间标记为“front”,位于分割平面另一侧的子空间标记为“back”。然后,递归搜索场景的BSP树,优先绘制标识为“back”的子空间中所含景物。
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按先进先出原则加入N中,转(2);若A的z值大,则交换A和B的关系,即将B看作是当前处理对象,转(3)进行M中其它多边形的判别。
深度缓存器算法最大的优点是算法原理简单,不过算法的复杂度为O(N),N为物体表面采样点的数目。另一优点是便于硬件实现。现在许多中高档的图形工作站上都配置有硬件实现的Z-buffer算法,以便于图形的快速生成和实时显示。
(完整word版)实验四图形消隐(完结版)
《计算机图形学》实验报告2011年1月实验四图形综合运用4.1实验目的1、通过本次实验,掌握三维图形的旋转等变换和消隐的基本概念和相关算法。
2、掌握凸多面体的消隐算法和实现。
3、进一步熟练和掌握编程环境中三维图形的绘制和消隐的程序设计方法。
4.2实验内容4.2.1绘制一个三维几何图形简单光照例程"light 0. cpp"利用openGL绘制模型#i nclude "glos.h"#i nclude <GL/gl.h>#i nclude <GL/glu.h>#i nclude <GL/glaux.h>void myi ni t(void);void CALLBACK myReshape(GLsizei w, GLsizei h);void CALLBACK display(void);void myi ni t(void){GLfloat light_positio n[] = { 1.0, 1.0, 1.0, 0.0 };glLightfv(GL_LIGHTO, GL_POSITION, light_positio n);glE nable(GL_LIGHTING);glE nable(GL_LIGHTO);glDepthFu nc(GL_LESS);glE nable(GL_DEPTH_TEST);}void CALLBACK display(void){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);auxSolidSphere(1.0);glFlush();}void CALLBACK myReshape(GLsizei w, GLsizei h){glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIde ntity();if (w <= h)glOrtho (-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w,-10.0, 10.0);elseglOrtho (-1.5*(GLfloat)w/(GLfloat)h,1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0);4.2.1绘制一个三维几何图形简单光照例程"light 0. cpp"glMatrixMode(GL_MODELVIEW);glLoadIde ntity();void mai n(void){auxl ni tDisplayMode (AUX_SINGLE | AUX_RGBA);auxl ni tPositio n (0, 0, 500, 500);auxI nitWin dow ("Simple Lighti ng");myi ni t();auxReshapeF unc (myReshape); auxMa in Loop(display);程序运行结果:显示一个具有灰色光影的球。
消隐算法
3.消隐中主要考虑的基本问题
• (2)相关性correlativity(连贯性) • 所谓相关性问题是指形体之间或一个 形体的各部分之间引起隐藏现象改变 的相互关系。即场景的可见性在局部 区域内保持不变的倾向 • 通常利用连贯性,来提高排序过程的 效率。
连贯性问题:
• 扫描线的连贯性:
相邻两条扫描线上,可见面的分布情况相似。
一般平面物体的消隐算法 (凹多面体)
• 关于潜在可见面: • 对于单个凸多面体,它的表面不是全部 可见,就是全部不可见。其棱线的可见 性也只有这两种状况。 • 对于凹多面体则不同,它的棱线除了全 部可见、全部不可见外,还有部分可见、 部分不可见的情况 • 如根据外法线向量与视线向量夹角关系 判断得出的可见边9、10、11、12构成的 平面上,9—10全部可见;10—11全部不 可见,而11—12则部分可见 • 因此对凹多面体上经判断后得出的可见 面只能看作为潜在可见面,它上面的每 一条棱线最终的可见情况,还需作进一 步的判定。
• 深度连贯性:
同一表面上的相邻部分深度是相近的,而占据屏幕上同 一区域的不同表面的深度不同。这样在判断表面间的遮挡关系 时,只需取其上一点计算出深度值,比较该深度值即可得到结 果。
• 区域连贯性:区域指屏幕上一组相邻的像素,它们通常为同
一个可见面所占据,可见性相同。区域连贯性表现在一条扫描 线上即为扫描线上的每个区间内只有一个面可见。
• 由向量N和V的数量积得:
N V N V cosθ N V cosθ N V
, 其正、负号与N V一致
(5)表面可见性判断
• 显然表面可见性取决于表 面外法线向量N与视线向 量V之间的夹角θ • 若为0°≤θ≤90°,则该表面 可见 • 若为90°<θ≤180°,则该 表面不可见 • 可得表面可见性判断依据 为: N V N V cosθ • 若N·V≥0,则该表面可见 • 若N· V<0,则该表面不可见 N V cosθ N V
计算机图形学——隐藏线和隐藏面的消除(消隐算法)
计算机图形学——隐藏线和隐藏⾯的消除(消隐算法)⼀、概述由于投影变换失去了深度信息,往往导致图形的⼆义性。
要消除⼆义性,就必须在绘制时消除被遮挡的不可见的线或⾯,习惯上称作消除隐藏线和隐藏⾯(或可见线判定、可见⾯判定),或简称为消隐。
经过消隐得到的投影图称为物体的真实感图形。
下⾯这个图就很好体现了这种⼆义性。
消隐后的效果图:消隐算法的分类所有隐藏⾯消隐算法必须确定:在沿透视投影的投影中⼼或沿平⾏投影的投影⽅向看过去哪些边或⾯是可见的两种基本算法1、以构成图像的每⼀个像素为处理单元,对场景中的所有表⾯,确定相对于观察点是可见的表⾯,⽤该表⾯的颜⾊填充该像素.适于⾯消隐。
算法步骤:a.在和投影点到像素连线相交的表⾯中,找到离观察点最近的表⾯;b.⽤该表⾯上交点处的颜⾊填充该像素;2、以三维场景中的物体对象为处理单元,在所有对象之间进⾏⽐较,除去完全不可见的物体和物体上不可见的部分.适于⾯消隐也适于线消隐。
算法步骤:a.判定场景中的所有可见表⾯;b.⽤可见表⾯的颜⾊填充相应的像素以构成图形;提醒注意1.假定构成物体的⾯不能相互贯穿,也不能有循环遮挡的情况。
2.假定投影平⾯是oxy平⾯,投影⽅向为z轴的负⽅向。
如果构成物体的⾯不满⾜该假定,可以把它们剖分成互不贯穿和不循环遮挡的情况。
例如,⽤图b中的虚线便可把原来循环遮挡的三个平⾯,分割成不存在循环遮挡的四个⾯。
⼆、可见⾯判断的有效技术1、边界盒指能够包含该物体的⼀个⼏何形状(如矩形/圆/长⽅体等),该形状有较简单的边界。
边界盒技术⽤于判断两条直线是否相交。
进⼀步简化判断2、后向⾯消除(Back-face Removal)思路:把显然不可见的⾯去掉,减少消隐过程中的直线求交数⽬如何判断:根据定义寻找外(或内)法向,若外法向背离观察者,或内法向指向观察者,则该⾯为后向⾯。
注意:如果多边形是凸的,则可只取⼀个三⾓形计算有向⾯积sp。
如果多边形不是凸的,只取⼀个三⾓形计算有向⾯积sp可能会出现错误,即F所在的⾯为前向⾯也可能出现sp≥0的情况,因此,需按上式计算多边形F的有向⾯积。
消隐技术与真实感图形
7
第五章 消隐技术与真实感图形
5.1 消除隐藏线
凹多面体的隐藏线消除
平面多边形对直线段的遮挡判断算法
(1) 若线段的两端点与视点在给定平面的同一侧,则线段位于给定平面的前面, 是可见的,转(9)。 (2) 求线段与相应的无限平面的交。若无交点,转(4);否则,转(3)。 (3) 交点将该线段分成两段,与视点同侧的一段是可见的,它没有被遮挡;另一 段的可见性还不能确定,转(4),继续测试。 (4) 若线段的投影与给定平面的投影的包围盒不相交,则线段可见,它不被该平 面遮挡,转(9)。 (5)求所剩线段的投影与平面边界投影的所有交点。 (6)将线段的投影在交点处依次分成若干段,根据交点在原直线参数方程中的参 数值的大小对线段进行排序。 (7)求出第一投影线段的中点,若第一段的中点在多边形的投影内,则相应的线 段被遮挡,否则不被遮挡。 (8)其它各段的遮挡关系可依次按"遮挡/可见"交替地取值,如图4所示。例如: 如果第一段被遮挡,则后面线段的可见性依次为"可见,遮挡,可见,…";若 第一段可见,则后面的线段依次为"遮挡,可见,遮挡,…"。 (9)结束。
11
第五章 消隐技术与真实感图形
5.2 消除隐藏面
扫描线算法 在多边形填充算法中,活性边表的使用获得 了节省运行空间的效果。用这种思想改造 Zbuffer算法,就产生了扫描线算法。
12
第五章 消隐技术与真实感图形
5.3 光照模型
环境光 环境光是光线在物体和周围环境之间经过多 次反射后,最终达到平衡时形成的一种光, 又称为背景光。
I d I p Kd cos
其中, 是漫反射系数(0~1之间的常数),与 物体表面性质有关; 是入射光(光源)的光强; θ是入射光的入射角,即入射光与物体表面法向 量之
06-消隐
点与多边形的包含性检测: (1)射线法
P P1 P2 P3 P P1 P2
由被测点P处向 y = - 方向作射线 交点个数是奇数,则被测点在多边形内部。否则,偶数 表示在多边形外部。
若射线正好经过多边形的顶点 ,则采用“左开右闭”的原则来 实现。即:当射线与某条边的顶 点相交时,若边在射线的左侧, 交点有效,计数;若边在射线的 右侧,交点无效,不计数。 用射线法来判断一个点是否 在多边形内一是计算量大,二 是不稳定。原因是射线在经过 多边形顶点时,由于计算机本 身的误差(也许多了0.00001), 把本该无效的交点变成有效的 交点了。所以这种算法是不稳 定的。
上图所画的仅仅是一个简单的立方体,如果一个物体是由多 个形体所组成的,或者整个三维场景是由多个物体构成的,情 况就更为复杂了。 因此,要绘制出意义明确的、富有真实感的立体图形,首 先必须消去形体中的不可见部分,而只在图形中表现可见部 分。这就要去寻求解决显示三维物体的图形中消去不可见部 分的方法,也就是所谓的“消隐”问题。消隐包括消除“隐 藏线”和“隐藏面”两个问题。
消 隐
三维物体的显示和真实感图形是当今计算机图形学研究的 一个焦点。在二维显示设备上显示三维图像, 必须对三维图像 进行消隐处理, 通过消隐处理的物体才能很好的表现三维立体 效果, 但是这种物体明显缺乏真实感, 还需要对物体进行真实 感的处理, 这样才能逼真的显示物体。
主要讲述的内容:
消隐的分类,如何消除隐藏线、隐藏面,主要介绍以 下几个算法:
Z-Buffer算法() { 帧缓存全臵为背景色
深度缓存全臵为最小Z值(比如赋一个10-8次方)
for(每一个多边形)
{扫描转换该多边形
for(该多边形所覆盖的每个象素(x,y) )
5消隐面
5.1 可见面判断的有效技术
• 可见线( 可见线(面)的判断是一个计算量很大的工作。例如, 的判断是一个计算量很大的工作。例如, N个面的两两相交的工作量是 (N2)。减少这个工作 个面的两两相交的工作量是O( )。减少这个工作 个面的两两相交的工作量是 量是非常重要的事。 量是非常重要的事。 常用的技术有: 常用的技术有: – 边界盒 – 后向面消除 – 非垂直面投影转换成垂直投影
扫描线算法
• 设平面Ax+By+Cz+D=0. (x,y)处的深度是 z = [-Ax-By-D]/C • 首先计算各多边形的y的范围。 自上而下递归地计算多边形的 左边界y=mx+b的x坐标和z深度。
y y-1 x x′
x =y/m-b/m, x′ = (y-1)/m–b/m = x –1/m, z = [-Ax-By-D]/C, z′ = [-Ax′-B(y-1)-D]/C ′ ′ = [-A(x-1/m)-B(y-1)-D]/C = z+(A/m+B)/C. 当左边界是垂直边时, x′ = x, z′ = z + B/C.
5.4 z缓冲器算法和扫描线算法
• 对投影平面上每个像素所对应的表面深 度进行比较,显示较近的表面上的属性。 • 需要两个缓冲器:深度缓冲器(Z-缓冲器) 和刷新缓冲器,分别保存各像素所对应 的三维点的深度和像素属性。缺点是它 需要很大的存储空间。 • 优点是算法简单:首先,缓冲器初始化, 即初始化每个像素的深度和颜色。 其次,计算多边形面上各像素点的深度 值, 若距离投影面较近,则记下深度和 颜色。
消隐
提高消隐算法效率的常见方法4
F N J G H I A E B D
V
n
V
n
C V
前向面
后向面
多面体的隐藏线消除
图中的JEAF、HCBG和DEABC所在的面均为后向面。 其它为前向面。
提高消隐算法效率的常见方法5
• 物体分层表示 表示形式:模型变换中的树形表示方式 原理:减少场景中物体的个数,从而降 低算法复杂度。
Z-Buffer算法-算法描述
{ 帧缓存全置为背景色 深度缓存全置为最小Z值 for(每一个多边形) { for(该多边形所覆盖的每个象素(x,y) ) { 计算该多边形在该象素的深度值Z(x,y); if(Z(x,y)大于Z缓存在(x,y)的值) { 把Z(x,y)存入Z缓存中(x,y)处 把多边形在(x,y)处的颜色值存入帧缓 存的(x,y)处 } 需要计算的像素深度值次数 } =多边形个数 多边形平均 多边形个数*多边形平均 多边形个数 } 占据的像素个数 }
扫描线Z-buffer算法
for ( v= 0;v<vmax;v++) { for (u= 0; u<umax; u++) 将帧缓冲器的第(u,v)单元置为背景色; (u,v)单元置为背景色 { 将帧缓冲器的第(u,v)单元置为背景色; 缓冲器的第u 将Z缓冲器的第u单元置为最小值 } (每个多边形 每个多边形) for (每个多边形) { 求出多边形在投影平面上的投影与当前扫描线的相交区间 该区间内的每个像素(u,v) for (该区间内的每个像素(u,v) ) 计算多边形在该像素处的深度值d { 计算多边形在该像素处的深度值d; Z缓冲器的第 单元的值) 缓冲器的第u if (d > Z缓冲器的第u单元的值) 置帧缓冲器的第(u,v)单元值为当前多边形颜色; (u,v)单元值为当前多边形颜色 { 置帧缓冲器的第(u,v)单元值为当前多边形颜色; 缓冲器的第u单元值为d; 置Z缓冲器的第u单元值为d; } } } //处理下一条扫描线 //处理下一条扫描线 }
计算机图形学-消隐
共四十四页
1. 消除 自隐线、面 (xiāochú)
对于多面体的任一个面,可以根据其外法向
E
n和视矢量E的夹角θ来进行可见性检测。
法向n:规定每个多边形的法向都是指向物 体外部(wàibù)的。
前向面: θ∈(-90°,90°)时,表示该表 E 面可见,称为前向面。
后向面: θ∈[90°, -90°]时,表示该表 面不可见,称为后向面 。
θn
n 前向面 n
后向面
剔除依据:后向面总是被前向面所遮挡,从而不可见。不会 由于后向面的遮挡,而使别的棱成为不可见的。因此计算时, 可以把这些后向面全部去掉,这并不影响消隐结果。
17
共四十四页
1. 消除 自隐线、面 (xiāochú)
图中的JFAE、HCBG和 DEABC所在(suǒzài)的面均 为后向面。其它为前向 J
也称表优先级算法。
30
共四十四页
1. 画家 算法 (huàjiā)
关键:如何对场景中的物体表面按深度(远近(yuǎnjìn))排序,建立深 度优先级表?
先讨论在深度优先级排序中两个多边形P和Q之间的关系。多边形可以 按其最大或最小z值徘序,不妨假设按多边形的最大z值进行预排序,即
zmax(P)>zmax(Q)。
消隐(xiāo yǐn)
1
共四十四页
消隐(xiāo yǐn)
1 概述(ɡài shù) 2 线消隐 3 提高消隐算法的效率 4 面消隐
2
共四十四页
1 概述(ɡài shù)
什么叫做“消隐”?为什么要进行(jìnxíng)“消隐”?
将三维场景绘制在计算机二维显示屏上必须经过投影变换,投影 变换将三维信息变换到二维平面上,这个过程中深度信息被丢失, 生成的图形往往具有二义性。
图形的消隐技术
两个多边形不重叠的条件:
A在左 XAmax ≤ Xbmin A在右 XAmin ≥ XBmax
A在下 YAmax ≤ YBmin A在上 YAmin ≥ YBmax
外接矩形
Y Ymax
Ymin X Xmin Xmax
重叠测试的几种典型情况
y
(a)
(b)
O
(c)
(d) x
包含性测试 测试点与多边形的包含关系有两 种方法: 1.射线交点数算法 2.夹角求和算法
射线交点数算法
B’ D’ E’
A’ A’
(图B)
C’
B’
C’
P’
D’ E’
P’
(图A)
由 P’ 向任意方向作一条射线,求射线与多边形的交点数。 交点为偶数则 P’在多边形之外,交点为奇数则 P’在多边形之内。 通常,射线作成与坐标轴平行,例如平行于 Y 轴。
射线过顶点(内、外部) 射线与多边形的边重合
夹角求和算法
1 P’分别与 A’B’C’D’E’连 线 2 令α1 α2 α3 α4 α5 ∠ A’P’B’ ∠ B’P’C’ ∠ C’P’D’ ∠ D’P’E’ ∠ E’P’A’
图形的消隐技术
机自6班 艾纯财 20112496
消隐的概念与作用
在使用显示设备描绘物体的图形时, 必须把三维信息经过某种投影变换, 在二维的显示表面上绘制出来。例如, 轴测图和透视图,就是通过轴测变换 或透视变换,求出所有顶点的投影点, 再把各点连结起来。
下图中第一个图形代表的是后边哪一 个呢?
计算机图形学消隐
for(v=0;v<vmax;v++) {
本算法中有两个缓存:
Z-Buffer算法的原理
Z-Buffer算法步骤:
1. 初始化:把Z-Buffer中各(x,y)单元置为z的 最小值,而帧缓存中各(x,y)单元置为背静色。
2. 在把物体表面相应的多边形扫描转换成帧缓 存中的信息时,对于多边形内的每一个采样 点(x,y)进行以下几步处理:
(a). 计算采样点(x,y)的深度z(x,y); (b). 如z(x,y)>zbuffer(x,y),则把z(x,y)存入z缓存,
再把多边形在z(x,y)处的颜色存入帧缓存的 (x,y)地址中。
算法描述
for(v=0;v<vmax;v++) for(u=0;u<umax;u++) { 将帧缓冲器的第(u,v)单元置为背景色; 将Z缓冲器的第(u,v)单元置为最小深度值; }
若对于窗口的每一个顶点,所得判别函 数值的符号相同,则所有顶点位于该直 线的同侧,窗口与此棱无交。若符号不 同,则多边形与窗口相交。
相交多边形判别示例
F y mx b y 5x 36 F (8,8) 8 5 *8 36 4 F (8,32) 32 5 *8 36 28 F (32,32) 32 5 * 32 36 92 F (32,8) 8 5 * 32 36 116
for(u=0;u<umax;u++) { 将帧缓冲器的第(u,v)单元置为背景色; 将Z缓冲器的第u单元置为最小深度值; } for(每个多边形) {
图形学第5章隐藏线
=zi平面上的曲线y=f(x,zi),在区间x∈[a,b]上只
有两种情况是可见的。
(1) f(x,zi)>max f(x,zj) x∈[a,b] (i<j) (2) f(x,zi)<min f(x,zj) x∈[a,b] (i<j) 其余线段上应当消隐,。
改进的曲面隐藏线消除
上述方法对下图的曲面是不适用的,图中的c点附近的虚线 部分应是可见的,但按上述算法却成了不可见了。
个面与其他每个面比较,求出所有点、边、面遮挡关系。
• 图像空间的消隐算法 (Z-buffer、扫描线、Warnock):
对屏幕上每个象素进行判断,决定哪个多边形在该象素 可见。 • 物体空间和图像空间的消隐算法 (画家算法):在物体空间 中预先计算面的可见性优先级,再在图像空间中生成消
隐图。
5.1
投影到屏幕上,近的后投的,覆盖了远的先投的,结果相当 于消除了隐藏面。 算法特点:画家算法的优点是简单,容易实现,可以作为
实现更复杂算法的基础。它的缺点是只能处理互不相交
的面,而且,深度优先级表中面的顺序可能出错。
画家算法的关键技术:对多边形进行深度排序
设每个多边形有一些顶点,这些顶点各有一个Z坐标,取
说明:
(1)上面五项中有一项成立,则P就不遮挡Q。
(2)如果上述五项都不成立,则说明Q有部分被P遮挡了。
于是要对P,Q两多边形在xoy平面的投影进行求交运算,在 交点处进行深度比较,判断出前后顺序便可。 (3)若遇到多边形相交或循环重叠(如图5-11(f))情况, 还需要在相交处分割多边形,再进行判断。
(d)包围
在窗口和每个多边形的关系确定以后,分下列三种情况。
⑴所有多边形都和窗口分离,这时只要把窗口内所有的象素
计算机图形学消隐算法
隐藏线(面)的消除的两种基本算法
第一种是物空间算法。 • 它以三维场景中的物体对像作为处理单元的,在所
有的对像之间进行比较,除去完全不可见的的物体 和物体上不可见的部分。常用于线框表示立体的线 隐藏,也用于面隐藏。
• 特点是:算法精度低,只能达到屏幕精度为止,但速度往
往更高。 其算法是对每一个像素:
在和投影点到像素的连线相交的表面中找到离观察点最近 的表面
用该表面上交点处的颜色填充该像素。
for (窗口内的每一个像素) { 确定距视点最近的物体,以该物体表 面的颜色来显示像素}
算法复杂度
假设场景中有k个物体,平均每个物体表面 由h个多边形构成,显示区域中有m x n个像素, 则:
2
<=
<=
N . V时<0 不可见
、空间分割技术
依据:场景中的物体,它们的投影在投影平面上 是否有相互遮挡的重叠部分? 对于根本不存在相互遮挡关系的物体,应 避免这种不必要的测试。
9
象空间消隐算法: 这类算法对屏幕上的每个象素进行判断,以决有 m×n个象素点,每个物体表面上有h个多边形,则该 类消隐算法计算量正比于mnh。
则: k个物体的算法复杂度为: O(mnkh) 。
10
算法排序
各种消隐算法均采用一定形式的几何排序。通过排序 ,可搜查出位置上靠近观察者的几何元素,确定几何元 素之间在位置上的遮挡关系,解决消隐计算的主要问题 。各种算法都有各自的排序方法和排序次序。排序次序 影响算法的效率。
二、 消隐基本技术
消隐
深度缓存算法 ( Z—Buffer算法)
Z—Buffer ---- 用于存放与屏幕上像素点对应的物体上点的深度值。
y
投影面
z
视线方向
视点位置
x
屏幕像素
F — Buffer
Z—Buffer
Z-buffer算法的步骤如下:
⑴ 初始化ZB和CB,使得ZB(i, j)=Zmax,CB(i, j)=背景色。其中, i=1, 2, …, m,j=1, 2, …, n。 ⑵ 对多边形,计算它在点(i, j)处的深度值zi, j。 ⑶ 若zijZB(i, j),则ZB(i, j)=zij,CB(i, j)=多边形的颜色。 ⑷ 对每个多边形重复⑵、⑶两步。最后,在CB中存放的就是 消隐后的图形。
背面剔除算法
• 背面剔除算法
法向向量N
<90°
cos N V
视线向量V
可见
>90°
法向向量N
<90°
可见
不可见
法向向量N
8.1 消隐基础
8.1.1 消隐的分类
• 线消隐 (Hidden-line)-景物空间消隐 对象:线框模型
•面消隐 (Hidden-surface)-图像空间消隐
对象:填色图
问题: ① 对于线画图形会出现多义性,要增强图形的真实感必须进 行消隐处理。 ②对于光栅扫描着色的面图形则会导致图形错误。
基本概念
二.消隐涉及的算法:
• 排序 • 连贯性
是指所考察的物体或画面的性质在局部区域内保持不变的一种 倾向。
例如:
棱边的连贯性是指:棱边的可见性在它与其他棱边相交时才发生
变换;
for (场景中的每一个物体)
{ 将该物体与场景中的其它物体进行比较,确定其表面的 可见部分;
虚拟地理环境 第五章 虚拟环境的绘制技术 第三节 图形消隐
Z-Buffer算法() { 帧缓存全置为背景色 深度缓存全置为最小Z值 for(每一个多边形) { 扫描转换该多边形 for(该多边形所覆盖的每个象素(x,y) ) { 计算该多边形在该象素的深度值Z(x,y); if(Z(x,y)大于Z缓存在(x,y)的值) { 把Z(x,y)存入Z缓存中(x,y)处 把多边形在(x,y)处的颜色值存入帧缓存的(x,y)处 } } } }
二、算法: 下面给出了一种建立深度优先级表方法。先 可根据每个多边形顶点z坐标的极小值Zmin的大 小把多边形作一初步的排序。设Zmin最小的多边 形为P,它暂时成为优先级最低的一个多边形。 把多边形序列中其它多边形记为Q。 现在先来确定P和其它多边形Q的关系: Zmin(P)<Zmin(Q)若Zmax(P)<Zmin(Q),则P肯定 不能遮挡Q。
优点: 简单,易于处理隐藏面以及显示曲面之间的交贯线。要被显 示的画面可以任意复杂,因为图像空间的大小是固定的,最 坏情况下,计算量随画面复杂程度线性增长。由于要被显示 的元素可按任意顺序写入帧缓冲器和Z缓冲器,所以不需要 进行深度排序,节省了排序时间。 缺点: 需要占用大量存储空间的Z缓冲器。若要被显示的画面经变 换和剪取后,Z值便在一定范围内变化,则可采用固定精度 的Z缓冲器。本算法结合光照,透明等相关算法后,可产生 较佳效果。
上图给出另外几个更复杂的情况,无法直接建立真确的深度
优先表。解决方法是沿多边形所在平面间的交线循环分割这 些多边形,至最后可完全确定其优先级表。见虚线所示
1. 上面的五项只要有一项成立,P就不遮挡Q。如 果所有测试失败,就必须对两个多边形在XY平 面上的投影作求交运算。计算时不必具体求出 重叠部分,在交点处进行深度比较,只要能判 断出前后顺序即可。若遇到多边形相交或循环 重叠的情况(如图f),还必须在相交处分割多 边形,然后进行判断。 2.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
区间扫描线算法
如何获得区间上最大深度的面?
区间上没有任何多边形:用背景色显示。 区间上只有一个多边形:用对应多边形在该处的颜色显示 区间上存在两个或两个以上的多边形?
24
提高消隐算法效率的常用方法
物体的分层表示
表示形式:模型变换中的树形表示方式 原理:减少场景中物体的个数,从而降低算法复杂度
25
10.2 提高消隐算法效率的常用方法
方法:将父节点所代表的物体看成子节点所代表物体的包 围盒,当两个父节点之间不存在遮挡关系时,就没有必 要对两者的子节点做进一步测试。父节点之间的遮挡关 系可以用它们之间的包围盒进行预测试
图形消隐
地球科学与信息物理学院GIS中心
1
图形消隐
基本概念 提高消隐算法效率的常用方法 画家算法 Z缓冲器算法 扫描线Z缓冲器算法 OpenGL相关函数
2
基本概念
问题
投影变换失去了深度信息,往往导致图形的二义性及失去 遮挡关系
失去遮挡关系
3
基本概念
要消除二义性和保持遮挡关系,就必须在绘 制(投影)时消除被遮挡的不可见的线或面, 习惯上称作 消除隐藏线(Hidden Line Removal) 消除隐藏面(Hidden Surface Removal) 简称为消隐
40
扫描线Z缓冲区算法
主要思想
开一个一维数组作为当前扫描线的Z-buffer 找出与当前扫描线相关的多边形,及每个多边形中相关
的边对 计算边对之间的深度
增量算法
若当前扫描像素可见
计算像素颜色,写帧缓存 更新深度缓存
41
扫描线Z缓冲区算法
数据结构(加速结构)
单个多边形扫描转换算法
P0 P1 P2 P3 P4 P5
13
(5)以上所求得的各交点将线段的投影分成若干段, 求出第一段中点。
(6)若第一段中点在平面的投影内,则相应的段被遮 挡,否则不被遮挡;其他段的遮挡关系可依次交替 取值进行判断。
P0 P1 P2 P3 P4 P5
14
消除隐藏线
HiddenLineRemove() { 坐标变换; for(对每个面Fj)
原因:物体在场景中分散,有些物体的投影相距甚远, 不会存在遮挡关系
方法:将投影平面上的窗口分成若干小区域;为每个 小区域建立相关物体表,表中物体的投影与该区域有 相交部分;则在小区域中判断那个物体可见时,只要 对该区域的相关物体表中的物体进行比较
23
提高消隐算法效率的常用方法
将投影平面上的窗口分成若干小区域
主要包围盒
长方体 正方体 球
19
提高消隐算法效率的常用方法
作用—避免盲目求交
两个空间多边形A、B在投影平面上的投影分别为A’,B’ , 因为A’ 、B’ 的矩形包围盒不相交,则A’、B’ 不相交,无 须进行遮挡测试
一般情况下,判断两物体是否遮挡时,前一种情况大量存 在,避免了物体间的复杂相交测试
相邻物体的属性之间有一定的连贯性,其属性值通常是平 缓过渡的,如颜色值、空间位置关系等
包括:
物体连贯性 面的连贯性 区域连贯性 扫描线连贯性 深度连贯性
18
提高消隐算法效率的常用方法
包围盒技术
定义:一个形体的包围盒指的是包围它的简单形体 两个条件
包围盒充分紧密包围着形体 对其的测试比较简单
计算N次深度值 N为投影到该像素的多边形的个数
44
区间扫描线算法
进一步利用扫描线上的区间连贯性
每个扫描线区间只计算一次深度值 无需Z-Buffer
思想
要绘制深度最大多边形 扫描线的上深度最大多边形在区间上是连贯的 每个区间:找出深度最大的面 区间的划分:由扫描线与多边形边界的交点确定
剔除依据:背面总是被前向面所遮挡,从而不可见
前向面
后向面
n
V
V
n
F N J
G H
I
A
E
B
C
D
V
JEAF、 HCBG、 JIHGF为 后向面
22
提高消隐算法效率的常用方法
空间分割技术
遮挡判断依据:场景中的物体,它们的投影在投影平 面上是否有重叠部分?
对于根本不存在相互遮挡关系的物体,应避免这种不 必要的测试
38
Z缓冲区算法
改进的Z缓冲区算法
只用一个深度变量,无需深度缓存图像 阅读
点在多边形内
39
扫描线Z缓冲区算法
由来
一般Z 缓冲器算法中所需要的 Z 缓冲器容量较大
扫描线Z缓冲器
一般Z 缓冲器算法未利用连续性
计算深度 多边形包含性测试
多边形扫描转换
扫描线算法 避免包含性测试 深度计算(增量算法) 降低深度缓存空间
26
画家算法
背景
画家作画:先画远景后画近景 画家的作画顺序暗示出所画物体之间的相互遮挡关系
27
画家算法
算法基本思想:
1)先把屏幕置成背景色 2)将场景中的物体按其距观察点的远近进行
排序,结果放在一张线性表中
线性表构造:距观察点远的称优先级低,放在 表头;距观察点近的称优先级高,放在表尾
3)然后按照从远到近(从表头到表尾)的顺 序逐个绘制物体
34
Z缓冲区算法
深度缓存 depth-buffer
35
Z缓冲区算法
算法
(1)先将 Z -Buffer中个单元的初始值置为最小
最小值代表无穷远
(2)多边形扫描转换中,当要改变某个像素的颜色 值时,首先检查当前多边形的深度值是否大于该 像素原来的深度值
如果大于
说明当前多边形更靠近观察点,用它的颜色替 换像素原来的颜色;同时保存深度值
1 0 0 0
T1
0 0
1 0
0 0 1 0
x0 y0 z0 1
旋转变换,将u,v,n分别对应到x,y,z
即绕x轴旋转角,绕y轴旋转角,绕z轴旋转角
1 0
0 0 cos 0 sin 0 cos sin 0 0
T2
0 0
cos sin
sin cos
0
•
0
区算法
特点
Z-Buffer算法是所有图像空间算法中最简单的一种隐藏面 消除算法。在像素级上以近物取代远物,与形体在屏幕 上的出现顺序无关。
优点 简单稳定,利于硬件实现
缺点 需要一个额外的 Z -Buffer,占用一定存储空间 每个多边形占据的每个像素处都要计算深度值,计算 量大
cos
0 • sin cos 0 0
0 0
0 1 0
0
0
0
1
0
0
0
1
0
0 0 1
8
消除隐藏线
体=n个面 基本运算
线线间求交运算 线面间求交运算
9
消除隐藏线
平面对直线段的遮挡判断算法
思路:先做简单判断,将计算量较大的判断留到后面做
10
消除隐藏线
(1)若线段的两端点及视点在给定平面的同侧,线段 不被给定平面遮挡
29
画家算法
(A)若P, Q的投影 P’, Q’ 的包围盒不相 交,则P, Q 在表中的次序不重要,不 存在遮挡
(B)对P, Q投影P’, Q’求交,若P’, Q’不 相交,则P, Q在表中的次序不重要
30
画家算法
(C)若Q的所有顶点位于 P 所在平面的 可见的一侧,则P, Q关系正确
(D)若 P 的所有顶点位于 Q 所在平面的 不可见的一侧 ,则P, Q关系正确
20
提高消隐算法效率的常用方法
背面剔除
外法向:规定每个多边形的外法向都是指向物体外部的
前向面:若多边形的外法向与投影方向(观察方向)的夹角为钝 角,称为前向面
后向面:若多边形的外法向与投影方向(观察方向)的夹角为锐 角,称为后向面(背面)
投影方向
夹角为180-u
21
10.2 提高消隐算法效率的常用方法
边表(新边表、活性边表)
扫描线Z-Buffer算法(多个多边形)
边表 活化边对表(AET) 加入右边对信息,考虑扫描区间 加入深度及其增量信息,用于增量算法
活化多边形表 考虑多个多边形
多边形Y表 存储多边形扫描线最大Y坐标
42
扫描线Z缓冲区算法
算法步骤
与扫描线算法相似 不同之处
求每条边上的遮挡 While(栈不空){
<Ei ,j0> = 栈顶;
for(Fj的每一条边Ei) 将二元组< Ei ,j>压入堆栈
for(j!= j0的每一个面Fj) {
While(栈不空){ <Ei ,j0> = 栈顶; for(j!= j0的每一个面Fj) { if ( Ei 被Fj 全部遮挡) {将Ei清空; break; }
}
16
基本概念
面消隐算法分类(续)
场景中的物体为处理单元——物体上的面是否最近 for (场景中的每一个物体) 物体空间-object-space
{ 将其与场景中的其它物体比较,确定其表面的可见部分; 显示该物体表面的可见部分;
}
17
提高消隐算法效率的常用方法
主要技术
1. 利用连贯性(Spatial Coherence)
将其它段及相应的j压栈; } } } if(Ei段不为空)
} } } if(Ei段不为空)
分治策略
显示Ei ;
显示Ei ;
} }
}
15
基本概念
面消隐算法分类
投影窗口内的像素为处理单元——确定最近点
for (窗口内的每一个像素) {
图像空间-image-space
确定距视点最近的物体,以该物体表面的颜色来显示像素
(2)若线段的投影与平面投影的包围盒无交,线段不 被给定平面遮挡,转7