当前位置:文档之家› 计算机图形学第5讲图形消隐

计算机图形学第5讲图形消隐

45
区间扫描线算法
如何获得区间上最大深度的面?
区间上没有任何多边形:用背景色显示。 区间上只有一个多边形:用对应多边形在该处的颜色显示 区间上存在两个或两个以上的多边形?
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
相关主题