计算机图形学消隐算法
消隐算法

一般平面物体的消隐算法(凹多面体)
• 消隐算法可以按以下的步骤实现: • ①包含性检测(边界盒检测法)* • 边界盒:是指包含平面正投影的两对边分别 平行于坐标轴的最小外接矩形,也称为最小 投影矩形。 • 如果空间两平面图形的最小投影矩形没有重 叠部分,则这两个图形相互之间不存在消隐 问题。
一般平面物体的消隐体)
• 关于潜在可见面: • 对于单个凸多面体,它的表面不是全部 可见,就是全部不可见。其棱线的可见 性也只有这两种状况。 • 对于凹多面体则不同,它的棱线除了全 部可见、全部不可见外,还有部分可见、 部分不可见的情况 • 如根据外法线向量与视线向量夹角关系 判断得出的可见边9、10、11、12构成的 平面上,9—10全部可见;10—11全部不 可见,而11—12则部分可见 • 因此对凹多面体上经判断后得出的可见 面只能看作为潜在可见面,它上面的每 一条棱线最终的可见情况,还需作进一 步的判定。
消隐算法
• 利用立体表面外法线的方向可判断物体表 面的可见性,从而对物体作消隐处理,这 种方法对凸多面体的消隐处理特别简单有 效。 • 其它消隐算法 • 有些已被固化到硬件中,但消隐算法至今 还没有很完善地被解决,它仍在吸引人们 在不断地探索,作更深入的研究。 • 这方面的研究围绕着:正确的算法、节省 内存空间及加快运算速度(特别是实时 Real-time的速度)等目标而进行的。
• 由向量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
《计算机图形学》08消隐技术

A B
D
C
投影方向
其夹角为锐角,则为后向面或背面。
剔除依据: 物体表面是封闭的,背面总是被前向面所遮挡,从 而始终是不可见的。
4. 将透视投影转换成平行投影 消隐与透视关系密切,体现有: 1)消隐必须在投影之前完成; 2)物体之间的遮挡关系与投影中心(视点)的选 取有关; 3)物体之间的遮挡关系与投影方式有关
ai + bj + d c
若 c = 0,则多边形Fk的法线方向与 Z 轴垂直, Fk在投影面
上的投影为一条直线,可不予考虑。
4. 算法的特点 ① 简单 不需要将所有的多边形按离视点的远近排序,其算法的复
杂度只与多边形的个数成正比。
② 需要有一个较大容量的 Z—Buffer 。
5. 算法的改进
① 采用包围框技术,提高算法的效率。 ② 采用硬件 Z—Buffer 来实现。
视点位置
视线方向
z值
视点
按观察方向上离视点(投影参考点) 的远近(通常用 z 值来表示)排序。
u(x)
2. 测试 用以判断点与面、线与面、面与面之间的关系。
包含测试: 测试空间点的投影是否在某个空间多边形的投影内,若在, 则可能存在遮挡关系;若不在,则不存在遮挡关系。 测试方法: 从空间点的投影开始向与 -y 轴平行的方向作射线,计算 该射线与空间多边形的投影的交点个数,若为奇数,则点的投
假定场景中有 k 个物体,平均每个物体的表面由 h 个多 边形构成,其计算复杂度为 O((kh)2)。
算法描述如下:
for (场景中的每一个物体) { 将该物体与场景中的其它物体进行比较,确定其表面的可 见部分; 显示该物体表面的可见部分;
}
第二种方法是以窗口内的每个像素为处理单元,确定在每
计算机图形学——隐藏线和隐藏面的消除(消隐算法)

计算机图形学——隐藏线和隐藏⾯的消除(消隐算法)⼀、概述由于投影变换失去了深度信息,往往导致图形的⼆义性。
要消除⼆义性,就必须在绘制时消除被遮挡的不可见的线或⾯,习惯上称作消除隐藏线和隐藏⾯(或可见线判定、可见⾯判定),或简称为消隐。
经过消隐得到的投影图称为物体的真实感图形。
下⾯这个图就很好体现了这种⼆义性。
消隐后的效果图:消隐算法的分类所有隐藏⾯消隐算法必须确定:在沿透视投影的投影中⼼或沿平⾏投影的投影⽅向看过去哪些边或⾯是可见的两种基本算法1、以构成图像的每⼀个像素为处理单元,对场景中的所有表⾯,确定相对于观察点是可见的表⾯,⽤该表⾯的颜⾊填充该像素.适于⾯消隐。
算法步骤:a.在和投影点到像素连线相交的表⾯中,找到离观察点最近的表⾯;b.⽤该表⾯上交点处的颜⾊填充该像素;2、以三维场景中的物体对象为处理单元,在所有对象之间进⾏⽐较,除去完全不可见的物体和物体上不可见的部分.适于⾯消隐也适于线消隐。
算法步骤:a.判定场景中的所有可见表⾯;b.⽤可见表⾯的颜⾊填充相应的像素以构成图形;提醒注意1.假定构成物体的⾯不能相互贯穿,也不能有循环遮挡的情况。
2.假定投影平⾯是oxy平⾯,投影⽅向为z轴的负⽅向。
如果构成物体的⾯不满⾜该假定,可以把它们剖分成互不贯穿和不循环遮挡的情况。
例如,⽤图b中的虚线便可把原来循环遮挡的三个平⾯,分割成不存在循环遮挡的四个⾯。
⼆、可见⾯判断的有效技术1、边界盒指能够包含该物体的⼀个⼏何形状(如矩形/圆/长⽅体等),该形状有较简单的边界。
边界盒技术⽤于判断两条直线是否相交。
进⼀步简化判断2、后向⾯消除(Back-face Removal)思路:把显然不可见的⾯去掉,减少消隐过程中的直线求交数⽬如何判断:根据定义寻找外(或内)法向,若外法向背离观察者,或内法向指向观察者,则该⾯为后向⾯。
注意:如果多边形是凸的,则可只取⼀个三⾓形计算有向⾯积sp。
如果多边形不是凸的,只取⼀个三⾓形计算有向⾯积sp可能会出现错误,即F所在的⾯为前向⾯也可能出现sp≥0的情况,因此,需按上式计算多边形F的有向⾯积。
计算机图形学-消隐

计算机图形学 施智平
shizhiping@
第八章
图形的数据结构 消隐算法分类 隐线算法
隐面算法
图形的数据结构
W.K.Giloi在其著作 Interactive Computer Graphics中提出: Computer Graphics=Data Structure +Graphics Algorithms+Language
N z EFx EG y EFy EGx
外法矢量表示为: N N xiቤተ መጻሕፍቲ ባይዱ N y j N z k
给定视点位置球面坐标表示为:
( R sin cos , R sin sin , R cos ) 0 2 其中:R为视径, 0
隐线算法
线框模型消隐一般在物空间中进行 物空间消隐算法是根据边界线的可见性检测条 件,判断哪些边界线是可见的,哪些边界线是
不可见的,在屏幕上只绘制可见边界线。
凸多面体消隐算法
凸多面体消隐是最简单和最基本的情形 凸多面体的性质: 连接立体上不同表面的任意两点的直线完全 位于该凸多面体之内
由凸多边形构成,其表面要么完全可见,要 么完全不可见
凸多面体消隐算法的关键是给出测试其表面边 界线可见性的判别式
对于凸多面体的任一个面,其外法矢量和视矢 量的夹角θ可进行可见性检测 θ < 90°时,可见; θ > 90°时,不可见
D 法向向量N
<90°
F
E N
可见
>90°
视线向量V
E7 E8
E9 E10 E11 E12
P7 P8
P1 P2 P3 P4
计算机图形学-消隐

共四十四页
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)“消隐”?
将三维场景绘制在计算机二维显示屏上必须经过投影变换,投影 变换将三维信息变换到二维平面上,这个过程中深度信息被丢失, 生成的图形往往具有二义性。
第5讲 计算机图形学消隐算法

1)消隐必须在投影之前完成;因为消隐需要物 体三维信息,投影后只有二维信息; 2)物体之间的遮挡关系与投影中心(视点) 的选取有关; 3)物体之间的遮挡关系与投影方式有关,在 平行投影时,其遮挡关系可通过深度值来确定。
三、凸多面体隐藏线的消除
凸多面体的每个面要么可见,要么 不可见;不可能出现一个面部分可 见,部分不可见。
N V
=
2
面的法向量 面上一点指向观察点的向量 cos-1(
2
0<= <
|N||V| ) .
N.V
N N
V >0 时 可见 V <0 时 不可见
<= <=
.
、空间分割技术
依据:场景中的物体,它们的投影在投影平面上 是否有相互遮挡的重叠部分? 对于根本不存在相互遮挡关系的物体,应 避免这种不必要的测试。
(z
i 1 m i 1
i
(x
i
式中:m为顶点号,若i≠n,则j=i+1;否则i=m,j=1。
• 为避免在程序中出现两种计算外法矢量的方 法,建议凸多边形也采用该算法进行计算。 多边形所在的平面方程可写成:
Ax By Cz D 0
D ( Ax0 By0 Cz 0 ) , • 其中:
要消除二义性,必须在绘制时消隐实际不可见得线和面, 即消隐。经过消隐的投影图称为物体的真实图形。
• 消隐不仅与消隐对象有关,还与观察者 的位置有关。如图所示,由于视点的位 置不同,物体的可见部分也不同:
C B
D
E2
A
E1
消隐与观察者的位置关系
• 按消隐的对象分类
线消隐(Hidden-line) 面消隐(Hidden-surface)
计算机图形学-第7章-消除隐藏线和隐藏面

可能的四种形体
隐藏线和隐藏面
不可见的线和面分别称为隐藏线和隐藏面。 隐藏线和面不仅仅有形体自身的,而且还 有形体之间互相遮挡的。消除它们即称为 消除隐藏线和消除隐藏面。
形体之间互相遮挡的隐藏线
当我们显示线条图或用笔式绘图仪或其 它线画设备绘制线条图形时,要解决的 主要是消除隐藏线的问题。而当用光栅 扫描显示器显示物体的明暗图形时,就 必须要解决消除隐藏面的问题。
设n={A,B,C},而
n
A ( y j )(zi z j ) i 1 n
B (zi z j )(xi x j ) i 1 n
C (xi x j )( yi y j ) i 1
式中若 i n,则j=i+1;否则i=n,j=1。 以上算法适合任何平面多边形。
非平面但接近平面的多边形的最佳逼近平面 的法矢量也可用此算法求出。为避免在程序 中出现两种计算平面外矢量的方法,建议凸 多边形也采用该算法计算外法矢量。多边形 所在平面的方程可写成
Ax By Cz D 0
其中 D ( Ax0 By0 Cz0 ,)
(x0 , y0 , z0 ) 为平面上任意一点。
7.2.2 深度检验
深度检验是比较位于同一条投射线的若干 个点的深度坐标(一般为z坐标),以确定 哪个点是可见的,将可见点表示出来。消 隐时必须进行深度检验。一般将需要比较 的各点的z坐标按递增或递减排序,也可从 中选出最大或最小的z坐标。至于选最大或 最小与所选的坐标系有关。
7.2.1 平面多边形的外法矢量
为了判别物体上各表面是朝前面还是朝后
面,需求出各表面(平面多边形)指向体外
的法矢量。设物体在右手坐标系中,多边
形顶点按逆时针排列。当多边形为凸多边
形时,则其法矢可取成多边形相邻两边矢
第九讲 消隐

2 . 遍历BSP树,优先绘制标为Back的区域;
P1
front
P2
back
P3
front
back
back front
A
B
C
D
绘制的顺序:D C
B
A
四. 深度缓冲器算法( Z-Buffer算法) 帧缓冲器:用来存储图像中每个象素属性(颜色); Z缓冲器:用来存储图像空间中每一个可见象素所对应 物体的深度(或Z坐标),是一个独立的深度缓冲器。
1. 将场景中的多边形序列按其z坐标的最小值zmin (物体上离视点最远的点)进行排序
2.当物体间 的z值范围不 x 重叠时:假设多边形P的 P zmin在上述排序中最小, Pzmax 如果多边形P的z值范围 与Q的z值范围不重叠, Qzmin Q 即Pzmax< Qzmin,此时 z 可以断定多边形P的优先 物体间的z值范围不重叠 级最低
3.当物体间的z值范围重叠时: 进一步判断多边形P是否遮挡场景中多边形Q
x P Q z
物体间的z值范围重叠
作如下5个判别步骤
• • • • • 多边形P和Q的x坐标范围是否不重叠 多边形P和Q的y坐标范围是否不重叠 从视点看去,多边形P是否完全位于Q的背面 从视点看去,多边形Q是否完全位于P的正面 多边形P和Q在xy平面上的投影是否不重叠
使用BSP树对场景中的对象进行排序
P3 C
D P1
P1
front
P2
back
P3
B P2 A
front
back
back front
A
B
C
D
1. 构建场景的BSP树 依据当前视点所在位置,对场景中的每个分割面 所生成的两个子空间进行分类 包含视点的标为Front,后面的标为Back 被分割面穿过的物体,被划分成两个部分,例如: 上图中的C物体被分割面P1划分成C,B两部分
图形学消隐

一、消隐当我们观察空间任何一个不透明的物体时,只能看到该物体朝向我们的那些表面,其余的表面由于被物体所遮挡我们看不到。
若把可见的和不可见的线都画出来,对视觉会造成多义性。
会有后边两种情况要消除二义性,就必须在绘制时消除被遮挡的不可见的线或面,习惯上称作消除隐藏线和隐藏面,简称为消隐。
消隐不仅与消隐对象有关,还与观察者的位置有关。
二、消隐的分类1.按消隐对象分类线消隐:消隐对象是物体的边面消隐:消隐对象是物体上的面2.按消隐空间分类客体(物体)空间的消隐算法:以场景中的物体为处理单位。
假设场景中有k个物体,将其中一个物体与其余k-1个物体逐一比较,仅显示它可见表面已达到消隐的目的。
(此类算法通常用于线框图的消隐!)图像空间的消隐算法:以屏幕窗口内的每个像素为处理单元。
对屏幕上每个像素进行判断,决定哪个多边形在该像素可见(这类算法是消隐算法的主流)三、图像空间的消隐算法:1.Z-buffer算法2.扫描线算法3.区域分割算法深度排序算法:画家算法:这两种算法即是客体空间算法也是图像空间算法原理:若场景中有许多物体,就是先画远的物体,再画近的物体。
这样一来,近的物体自然就会盖住远的物体。
但实际情况并不理想,在三维场景中,一个物体可能有些部分远,有些部分近,所以不管用什么顺序画,都无法得到正确的结果,所以画家算法只能解决简单场景的消隐问题。
Z-buffer算法1、也称Z缓冲区算法和深度缓冲器算法(能跟踪屏幕上每个像素深度的算法),让计算机生成复杂图形成为可能。
2、该算法有帧缓冲器和深度缓冲器,对应两个数组:Intensity(x,y)-属性数组(帧缓冲器),存储图像空间每个可见像素的光强或颜色Depth(x,y)-深度数组(Z-buffer),存放图像空间每个可见像素的Z坐标。
Z-buffer保存的是经过投影变换后的z坐标,距离眼睛近的地方z坐标的分辨率比较大,远处的分辨率小。
3、Z-buffer算法思想(开一个和帧缓存一样大小的存储空间,利用空间上的牺牲换取算法上的简洁)(1)先将z缓冲器中各单元的初始值置为最小值(2)当要改变某个像素的颜色值时,首先检查当前多边形的深度值是否大于该像素原来的深度值(3)如果大于原来的z值,说明当前多边形更靠近观察点,用它的颜色替换像素原来的颜色。
计算机图形学消隐

第7章 消 隐
第7章 消 隐
• • • • • • 消隐的概述 多面体的消隐算法 深度缓冲器算法 扫描线算法 画家算法 光线追踪算法(Ray Casting)
消隐概述
• 什么是消隐? • 消隐的分类有哪些? • 消隐的基本原则有哪些?
消隐的概述
• 绘制线框图时应消除隐藏线,绘制真实感图 形时应消除隐藏面。 • 未经消除隐藏线和隐藏面的立体图往往存在
图7-9 任意多面体的隐藏情况
深度缓冲器算法
• • • • 算法基本思想是什么? 算法是怎样描述的? 深度值如何计算? 深度缓冲器算法特点是什么?
多面体的消隐算法
• 算法实现的一般步骤 • 根据表面的数据结构,取顶点数据,计算表面 的外法线矢量。 • 计算外法线在投影方向上的分量的值。 • 根据分量的值判断表面的可见性。 • 若表面可见画出该表面,否则处理下一个表面。
多面体的消隐算法
• 任意多面体的消隐 • 对于任意平面立体必须寻求适当的消隐算法。 因为任意平面立体则不同,除了有全部可见和 全部不可见的棱边外,还有部分可见的棱边如 图7-9 。
消隐的概述
• 图像空间消隐算法 图像空间是物体显示时所在的屏幕坐标空 间。 • 算法描述如下: for(窗口中的每一个像素) { 确定距视点最近的物体,以该物体表面的 颜色来显示像素; }
消隐的概述
• 消隐基本原则
―排序
排序的目的主要是判别消隐对象的体、面、边和点与观察 点几何距离的远近。如果一个物体离观察点越远,越有可能被 离观察点近的物体所遮挡,如图7-4所示。但这不是绝对的,例 如,不在同一观察线方向的两个物体不会有遮挡关系,如图7-5 所示。
• 凸多面体消隐的基本原理是什么 • 凸多面体消隐的算法思想是什么 • 任意多面体的消隐算法是什么
计算机图形学消隐

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(每个多边形) {
计算机图形学消隐算法

隐藏线(面)的消除的两种基本算法
第一种是物空间算法。 • 它以三维场景中的物体对像作为处理单元的,在所
有的对像之间进行比较,除去完全不可见的的物体 和物体上不可见的部分。常用于线框表示立体的线 隐藏,也用于面隐藏。
• 特点是:算法精度低,只能达到屏幕精度为止,但速度往
往更高。 其算法是对每一个像素:
在和投影点到像素的连线相交的表面中找到离观察点最近 的表面
用该表面上交点处的颜色填充该像素。
for (窗口内的每一个像素) { 确定距视点最近的物体,以该物体表 面的颜色来显示像素}
算法复杂度
假设场景中有k个物体,平均每个物体表面 由h个多边形构成,显示区域中有m x n个像素, 则:
2
<=
<=
N . V时<0 不可见
、空间分割技术
依据:场景中的物体,它们的投影在投影平面上 是否有相互遮挡的重叠部分? 对于根本不存在相互遮挡关系的物体,应 避免这种不必要的测试。
9
象空间消隐算法: 这类算法对屏幕上的每个象素进行判断,以决有 m×n个象素点,每个物体表面上有h个多边形,则该 类消隐算法计算量正比于mnh。
则: k个物体的算法复杂度为: O(mnkh) 。
10
算法排序
各种消隐算法均采用一定形式的几何排序。通过排序 ,可搜查出位置上靠近观察者的几何元素,确定几何元 素之间在位置上的遮挡关系,解决消隐计算的主要问题 。各种算法都有各自的排序方法和排序次序。排序次序 影响算法的效率。
二、 消隐基本技术
计算机图形学 消隐PPT课件

可编辑课件PPT
11
提高消隐算法效率的常见方法 6
复杂度比较:
不妨假定每个小区域的相关物体表中平均有h个物 体,场景中有k个物体,由于物体在场景中的分布是分 散的,显然h远小于k。根据第二种消隐方法所述,其 算法复杂度为O(h*h),远小于O(k*k)。
可编辑课件PPT
14
画家算法
关键:如何对场景中的物体按深度(远 近)排序,建立深度优先级表? 一种针对多边形的排序算法如下:
假定在规范化投影坐标系uvn中,投影方向是n 轴的负向,因而n坐标大距观察者近。记nmin(P) nmax(P)分别为多边形P的各个顶点n坐标的最小 值和最大值,算法步骤如下:
可编辑课件PPT
25
区域子分算法
如何判别多边形与窗口的分离与包围关系?
编码方法:1)区域编码
2)多边形顶点编码 3)多边形边的编码 4)多边形的编码
可编辑课件PPT
26
光线投射算法
算法思路:将通过绘图窗口内每一个像 素的投影线与场景中的所有多边形求交。 如果有交点,用深度值最大的交点(最 近的)所属的多边形的颜色显示相应的 像素;如果没有交点,说明没有多边形 的投影覆盖此像素,用背景色显示即可。
step 3.2.2 若P的所有顶点位于Q所在平面的不可见的一侧,则P,Q关系 正确,令L = L – {P}, 返回step 2;否则进行下一步。
step 3.2.3 若Q 的所有顶点位于P所在平面的可见的一侧,则P,Q关系正 确,令L = L – {P}, 返回step 2;否则进行下一步。
计算机图形学课件:第9章消隐

9.6 BSP树算法
算法原理 实例说明
Q back front
D C
B
投影线
P
front P
back
front
Q front
back Q front
A
back
back
DB
CA
(a) 空间剖分
(b) 形成的BSP树
图9-14 BSP算法原理
9.7 多边形区域排序算法
算法思想:
将多边形按深度值由小到大排序,用前面 的可见多边形去切割位于其后的多边形,使得最 终每一个多边形要么是完全可见的,要么是完全 不可见的。
Z-buffer
00 0 0 0 0 0 00 0 0 0 58000 0 0 00 0 0 0
帧缓存
问题:计算采样点(x,y)的深度z(x,y)。 假定多边形的平面方程为:Ax+By+Cz+D=0。
z(x, y) Ax By D C
利用连贯性加速深度的计算:
y 多边形
y
y-1
算法特点: ①算法简单。 ②需较大的存储空间。 ③处理反走样、透明和半透明效果困难。
对于③ ,可以使用A缓冲器算法克服。
9.2 区间扫描线算法
算法原理:
避免对被遮挡 区域的采样是 进一步提高扫 描线算法计算 效率的关键。
y B2 A2
0
A1 B1
AB
A3
B3
C2
扫描线1 C1
扫描线2 扫描线3
B4 C C4 C3 x
图9-3 区间扫描线算法原理
9.3 深度排序算法(画家算法)
算法原理:
若场景中任何多边形在深度上均不贯穿 或循环遮挡,则各多边形的优先级顺序可完 全确定,扫描转换就可以按从优先级低的多 边形到优先级高的多边形的顺序进行。
计算机图形学 第7章消隐 - 课程教学辅导资料

假设场景中有k个物体,平均每个物体表面由h个多 边形构成,显示区域中有m x n个像素,则: 算法的复杂度为:O((kh)*(kh))
计算机图形学
Z-Buffer算法
由来: 帧缓冲器 – 保存各像素颜色值 Z缓冲器 --保存各像素处物体深度值
Z缓冲器中的单元与帧缓冲器中的单元一一对应
屏幕 帧缓冲器 Z缓冲器
nu :当沿扫描线u递增一个像素时,多边形所在平面n坐标的增 量,对方程au+bv+cn+d=0来说,nu =-a/c nv :当沿扫描线v递增一个像素时,多边形所在平面n坐标的增 量,类似,nv =-b/c (c!=0) nextEP:指向下一个边对结构的指针。
计算机图形学
扫描线Z-buffer算法--活化边表对
扫描线Z-buffer算法--多边形分类表
多边形分类表(PT):对多边形进行分类的一维数 组,长度等于绘图窗口内扫描线的数目。若一个多 边形在投影平面上的投影的最小v坐标为v,则它属 于第v类。
计算机图形学
扫描线Z-buffer算法--活化多边形表
活化多边形表(APL): 记录投影与当前扫描线相 交的多边形。
计算机图形学
扫描线Z-buffer算法--边的分类表
边的分类表(ET):当一个多边形进入活化多边形表时,需为其建立 一个边分类表(ET)。这里,ET与其在扫描转换多边形的扫描线算 法中的含义相同,是对多边形的非水平边进行分类的一维数组,长度 等于绘图窗口内扫描线的数目。若一条边在投影平面上的投影的下端 点的v坐标为v,则将该边归为第v类。
计算机图形学
扫描线Z-buffer算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图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算法,以便于图形的快速生成和实时显示。
深度缓存器算法的缺点是占用太多的存储单元,假定屏幕分辨率为1024×768,则需要2×1024×768个存储单元,即使每一存储单元只占一个字节,也需要超过100万个字节。不过,若采用扫描线Z-buffer算法时,可以每次只对一条扫描线进行处理,这样深度缓存器所需的存储量仅为1×屏幕水平显示分辨率×深度存储位数,当然需要增加边表和多边形表的存储量。
实际上,建立场景BSP树的过程是对场景所含景物多边形递归地进行二叉分类的过程。先在场景中选取任意一剖分平面P将场景的整个空间分割成两个子空间(相对于视点,这两个子空间一个位于P之前,一个位于P之后)。相应地,场景中的景物也被P分成两组。由于C与P相交,因此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之后)。
(1)通过视点和投影平面(显示屏幕)上的所有像素点作一入射线,形成投影线。
(2)将任一投影线与场景中的所有多边形求交。
(3)若有交点,则将所有交点按z值的大小进行排序,取出最近交点所属多边形的颜色;若没有交点,则取出背景的颜色。
BSP树
BSP树与画家算法类似,BSP算法也是从远到近往屏幕上覆盖景物的画面,BSP算法在对场景进行消隐之前需建立场景的BSP树。
深度排序算法
Байду номын сангаас
排序算法(Depth-Sorting Method)是介于图像空间消隐算法和景物空间消隐算法之间的一种算法,它在景物空间中预先计算物体上各多边形可见性的优先级,然后再在图像空间中产生消隐图。深度排序算法可分为两步进行:
(1)将多边形按深度进行排序:距视点近的优先级高,距视点远的优先级低。
深度缓存器算法的其它缺点还有它在实现反走样、透明和半透明等效果方面的困难。同时,在处理透明或半透明效果时,深度缓存器算法在每个像素点处只能找到一个可见面,即它无法处理多个多边形的累计颜色值。
区间扫描线算法
每一条扫描线被物体中多边形的边界在屏幕的投影分割成若干相互邻接的子区间,每一子区间上只有一个可见面,如图9-3。因此,只要在每一个子区间内任一点处,在投影于该处的各多边形中找出在该处深度(z值)最大的多边形(最近的多边形),则这一多边形为该扫描线子区间内的唯一可见面,可按这一多边形的光照属性和几何位置计算确定子区间内各像素的显示颜色。这就是所谓的区间扫描线算法。区间扫描线算法也是一种图像空间消隐算法。
②否则说明存在某一多边形B,A与B有深度重叠,则需要依次进行以下判别:
a. 判别多边形A和B在xoy平面上投影的包围盒有无重叠,若无重叠,则A、B在队列中的顺序无关紧要,将A按先进先出原则加入N中,转(2);否则继续。
b. 判别平面A是否完全位于B上A与B的重叠平面之后,若是,将A按先进先出原则加入N中,转(2);否则继续。
排序完成后得到队列N,由于N是按优先级由低到高顺序排列的多边形先进先出队列,因此只需从N中逐个取出多边形进行扫描转换即可。
区域细分算法
区域细分算法的出发点是投影平面上一块足够小的区域可以被至多一个多边形所覆盖。因此,可以这样来构造算法:考察投影平面上的一块区域,如果可以很“容易”地判断覆盖该区域中的哪个或哪些多边形是可见的,则可按这些多边形的光照属性和几何位置计算确定子区域内各像素的显示颜色;否则就将这块区域细分为若干较小的区域,并把上述推断原则递归地应用到每个较小的区域中去。当区域变得越来越小时,每块区域上所覆盖的多边形就越来越少,最终的区域会易于分析判断。这显然是图像空间消隐算法的一种,它利用了区域相关性。
(2)由优先级低的多边形开始,逐个对多边形进行扫描转换。
其中步骤(1)是关键。
假定沿z轴的负向进行观察,因而z值大的距观察者近,多边形A上各点z坐标的最小值和最大值分别记作zmin(A)、zmax(A)。将多边形按深度进行排序的算法步骤为:
(1)对场景中的所有多边形按zmin(多边形)由小到大的顺序存入一个先进先出队列中,记为M,同时初始化一空的先进先出队列N(N中存放已确定优先级的多边形,优先级低的先进,扫描转换时也先处理)。
Z-buffer算法的原理是:先将待处理的景物表面上的采样点变换到图像空间(屏幕坐标系),计算其深度值,并根据采样点在屏幕上的投影位置,将其深度值与已存贮在Z缓存器中相应像素处的原可见点的深度值进行比较。如果新的采样点的深度(z值)大于原可见点的深度,表明新的采样点遮住了原可见点,则用该采样点处的颜色值更新帧缓存器中相应像素的颜色值,同时用其深度值更新Z缓存器中的深度值;否则,不做更改。
(2)若M中的多边形个数为1,则将M中的多边形直接加入到N中,算法结束;否则按先进先出的原则从M中取出第一个多边形A进行处理(A是M中zmin值最小的多边形),同时将A从M中删除。
(3)从当前M中任意选择一多边形B,对A与B进行判别。
①若对M中任意的B均有zmin(B)>zmax(A),则说明A是M中所有多边形中深度最深的,它与其它多边形在深度方向上无任何重叠,不会遮挡别的多边形。将A按先进先出原则加入N中,转(2);否则继续。
光线投射算法
光线投射算法是建立在几何光学基础上的一种算法,它模拟人的视觉效果,沿视线的路径跟踪场景的可见面。其基本思想是:由视点出发通过投影窗口(屏幕)的任一像素位置构造一条射线(投影线),将射线与场景中的所有多边形求交,如果有交点,就将该像素点的颜色置为深度(z值)最大的交点(最近的交点)所属的多边形的颜色;如果没有交点,就将该像素点的颜色置为背景颜色。算法步骤可简单描述如下:
深度缓存器算法
深度缓存器算法最早由Catmull提出,是一种典型的,也是最简单的图像空间面消隐算法,但其所需的存储容量较大,不仅要有帧缓存器来存放每个像素的颜色值,还需要有深度缓存器来存放画面上每一像素对应的可见表面采样点的深度值。由于通常选择z轴的负向为观察方向,因此算法沿着观察系统的z轴来计算各景物距离观察平面的深度,故该算法也称为Z-buffer算法。
(3)针对该区域,有多于一个的相交多边形、被包含多边形或围绕多边形,则计算所有围绕的、相交的、以及被包含的多边形在该区域4个顶点处的z坐标,如果存在一个围绕多边性,它的4个z坐标比其它任何多边性的z坐标都大(最靠近视点),那么,可将该区域中的所有像素点置为该多边形的颜色值。
区域细分方式有两种,一种是将区域简单地分割为四块大小相等的矩形;另一种是自适应细分,即沿多边形的边界对区域进行细分,这样可以减少分割次数,但在区域细分和测试多边形与区域的关系方面处理更为复杂。
图9-2 扫描线子区间
(1)子区间为空,如图9-2中的子区间1和5。
(2)子区间中只包含一个多边形,如图9-2(a)中的2和4,图9-2(b) 中的2和4,图9-2(c) 中的4。
(3)子区间中包含多个多边形,如图9-2(a)中的3,图9-2(b) 中的3,图9-2(c)中的2和3。
若这些多边形在子区间内不相互贯穿,如图9-2(a)中的3,则仅需计算这些多边形在子区间任一端点处的深度,深度(z值)大的平面为可见面。若两多边形交于子区间一端点但不贯穿,如图9-2(b) 中的3,则只要计算它们在区间另一端点处的深度,深度大者为可见面。为了使算法能处理互相贯穿的多边形,如图9-2(c),扫描线上的分割点不仅应包含各多边形的边与扫描线的交点,而且应包含这些贯穿边界与扫描线的交点,如图9-2(c)中增加了一个分割点,从而形成了子区间2和3,否则算法不能处理多边形相互贯穿的情形。
当然还有另外一种难以处理的情形就是循环遮挡(实际上贯穿也可看作循环遮挡的一种),若存在这种情况,则需将多边形进行划分以消除循环遮挡。
在形成了子区间后,只要取其投影覆盖该子区间的各多边形,计算它们在区间端点处采样点的z值(深度),深度最大的平面为可见面。于是,需要在有效边表的每个分割点对应的数据结点中增加一类信息:为每个多边形建立一个标志位,以表示扫描线上每一子区间所对应的覆盖多边形。