计算机图形学_第十三章_隐藏面的消除
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
glPolygonMode(GLenum face,GLenum mode)
功能:该函数控制多边形反面或正面的绘图模式。 参数说明:
face : 指 定 多 边 形 的 面 。 face 可 能 的 值 是 GL_FRONT 、 GL_BACK 和 GL_FRONT_AND_BACK 。其中 GL_GL_FRONT 指定多边形的正面, GL_BACK 指定多 边形的反面,GL_FRONT_AND_BACK指定多边形的正面和反面。
用 g1Enable ( GL_CULL_FACE ) 启 动 消 除 多 边 形 , 用 g1Disable(GL_CULL_FACE)关闭消除多边形。
OpenGL中的多边形的消除与消隐
void glClearDepth(GLclmpd depth)
功能:指定在刷新深度缓冲器时,所用的深度值。也就是刷新 深度缓冲器后,深度缓冲器中为窗口中的每一个像素点设置的 深度值。
a. Q z m in Pz m a x
多边形的画家算法
b. Q z < P z m in m ax
多边形的画家算法
c.所有测试失败:
必须对两个多边形在Oxy平面上的投影作求交运算。 计算时不必具体求出重叠部分,在交点处进行深度比较 ,只要能判断出前后顺序即可。
深度缓冲算法
Z缓冲区(Z-Buffer)算法。在这个算法里,不仅需要有
消隐算法及其分类
按照操作对象的不同表达,消隐算法可以分为两大类
•对象空间方法(Object Space Methods) •图像空间方法(Image Space Methods)
对象空间方法和图像空间方法
•对象空间是对象三维空间,即对象被定义时所处的坐标
空间。 对象空间方法是对要显示的各个对象及对象的各个 部分进行相互比较,分析对象的三维特性之间的关系, 以确定不可见的表面或者线条的方法。
深度缓冲算法描述
Z-Buffer算法() {
帧缓存全置为背景色 深度缓存全置为最小z值 for (每一个多边形) {扫描转换该多边形 for (该多边形所覆盖的每个像素(x,y) )
{
计算该多边形在该像素的深度值d(x,y); if (d(x,y)大于Z缓存在(x,y)的值)
{
把d(x,y)存入Z缓存中(x,y)处 把多边形在(x,y)处的颜色值存入帧缓存的(x,y)处
void glDepthFunc(Glenum Func)
功能:在消隐操作中设置比较函数。 参数说明:
Lecture 13
隐藏面的消除
概述
在生成具有真实感的景物时,要考虑的一个重要问题 是如何由选定的视向把画面的不可见部分消去,即隐藏 线及隐藏面的消除问题。目前,存在解决此问题的若干 方法,并建立了若干有效的消隐算法。
消隐算法及其分类
人不能一眼看到一个三维物体的全部表面。从一个视 点去观察一个三维物体时,必然只能看到该物体表面上 的部分点、线、面,而其余部分则被这些可见部分遮挡 住。如果观察的是若干个三维物体,则物体之间还可能 彼此遮挡而部分不可见。
mode:指定指定面的模式。
OpenGL中的多边形的消除与消隐
g1FrontFace()则用来定义多边形的哪一面被视为正面: g1FrontFace(Glenum mode)
功能:指定多边形的正面。 参数说明: 指定选择多边形的面。
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。
将射线与该物体求交;
if (存在交点)
以最近的交点所属的颜色显示像素(u,v)
else 以背景色显示像素(u,v); }
OpenGL中的多边形的消除与消隐
在OpenGL中,多边形分为正面和反面,在使用多边形的过程中可以对多边形的两个面 进行分别操作。缺省状态下OpenGL对多边形正反面是以相同的方式绘制的,要改变多 边形的绘制状态,必须调用函数glPolygonMode(),函数说明如下:
多边形的画家算法
(1)以每一多边形的 zmin作为排序关键码,建立初步的 深度排序表,表中第一个多边形是具有最小z值的多边形 ,记为 P 。设视点位于 z 轴方向的无穷远处,则 P 为离视 点最远的多边形,表中第二个多边形标为Q。
(2)检查表中每个多边形与P的关系。分为3种关系:
多边形的画家算法
与取景平面的距离分类,以决定取舍。
•连贯方法是指利用显示景物具有某些相关特性,可以用来简
化计算。
消隐算法及其分类
从消隐对象角度来看,消隐算法可分为两类:线消 隐和面消隐。
•线消隐的消隐对象是物体上的边,消除的是物体上不
可见的边。
•面消隐的消隐对象是物体上的面,消除的是物体上不
可见的面。
画家算法
画家算法是把对象空间方法与图像空间方法结合在一起来消 除隐藏面的方法。
} } }
深度缓冲算法
该算法的最大优点在于简单。它可轻而易举地处理隐藏面 以及显示复杂曲面之间的交线。画面可以任意复杂。由于画面 元素可按任意次序写入帧缓冲器和Z缓冲器,故无需按深度优 先级排序,可省去深度排序时间。
扫描线算法
如果只对一条扫描线进行Z缓冲器算法,则可以得到扫描线 Z缓冲器算法 。 扫描线Z缓冲器算法做了两点改进。 ①将整个绘图窗口内的消隐问题分解到一条条扫描线上解决, 使所需的Z缓冲器大大减少。 ②计算深度值时,利用了面连贯性,只用了一个加法。
帧缓存来存放每个像素的颜色值,还需要一个深度缓存 来存放每个像素的深度值。
深度缓冲算法
Z缓冲器的深度值越大,说明该点越接近视点。
在把显示对象的每个面上每一点的属性(颜色或灰 度)值填入帧缓冲器相应单元前,要把这点的z坐标值和 Z缓冲器中相应单元的值进行比较。只有前者大于后者 时才改变帧缓冲器的那一单元的值,同时Z缓冲器中相 应单元的值也要改成这点的z坐标值。
画家算法的原理:
先把屏幕置成背景色,再把物体的各个面按其离视点的远近进 行排序,离视点远者在表头,离视点近者在表尾,排序结果存在 一张深度优先级表中。 然后按照从表头到表尾的顺序逐个绘制各个面。由于后显示 的图形取代先显示的画面,而后显示的图形所代表的面离视点更 近,所以由远及近的绘制各面,就相当于消除隐藏面。 该算法习惯上称为画家算法或深度排序算法。
} }
BSP树算法
二叉空间剖分(BSP,Binary Space-Partitioning)树 算法是一种判别物体可见性的有效算法。它类似于画家 算法,将面片由后往前地在屏幕上绘出 。
构造BSP树
BSP树取场景中的一个多边形作为分割面,递归地将
空间分为两个子空间。这两个子空间再分别选一个多边 形作分割面递归地子分下去,直到每个子空间只剩一个 多边形为止。
BSP树遍历
BSP树可见面算法的基本思想是先将离视点最远的多
百度文库
边形写入帧缓存或进行显示,即按从后到前的顺序对多 边形绘制。 如果视点在根结点多边形后侧,最终的显示顺序依次 为3、2a、1、2b、5、4。
区域子分算法
区域子分算法又称为Warnack算法 。 基本思想是:把物体投影到绘图窗口上,然后递归 分割窗口,直到窗口内目标足够简单,可以显示为止。 而在显示时进行深度探索。
该算法充分利用了区域的连贯性,提高了计算速度。
区域子分算法
算法步骤:
•初始窗口取作屏幕坐标系的矩形,将场景中的多边形投
影到窗口内。如果窗口内没有物体则按背景色显示;
•若窗口内只有一个面,则把该面显示出来; •否则,窗口内含有两个以上的面,则把窗口等分成4个
子窗口。对每个小窗口再做上述同样的处理。
光线投射算法
区间扫描线算法
可以将区间分为三类: ①区间为空 ,区间 [0, a1],此时只要按背景属性显示即 可; ②区间中只包含一个区段即一条交线或交线的一部分 .如 图中的区间[a1, a2]和[a3, a4],此时按该区段所在多边 形的显示属性进行显示; ③区间中有多条分别属于不同多边形的区段,如图中的区 间[a2, a3],此时必须计算该区间中每个区段的深度,具 有最大z值的区段为该区间中的可见段,按此可见段所在 多边形的属性进行显示
区间扫描线算法
扫描线Z缓冲器中,被多个多边形覆盖的像素区处还 要进行多次计算,计算量仍然很大。 区间扫描线算法克服了这一缺陷,可利用连贯性提 高算法效率,使得在一条扫描线上每个区间只计算一次 深度值,并且不需要Z缓冲器。 它是把当前扫描线与各多边形在投影平面的投影的交 点进行排序后,使扫描线分为若干子区间。
参数说明:
depth:指定刷新深度缓冲器时所用的深度值。
在实际操作中,使用消隐要先启动深度测试,即调用函数:
glEnable(GL_Depth_Test) 取消自动实现三维场景的消隐 要调用函数:glDisable(GL_Depth_Test)
OpenGL中的多边形的消除与消隐
在特殊的环境中,对深度的比较会有特殊的要求OpenGL中提供了深度比 较的控制函数。
•图像空间是对象投影后所在的二维空间,即设备坐标系
图像空间方法是将对象投影后分解为像素,按照一 定的规律,比较像素之间的深度(z)值,从而确定其是 否可见的方法。
消隐算法及其分类
虽然各种消隐方法具体的实现方法不同,但这些方法中大 都采用分类及连贯两种基本方法改进算法效率。
•分类方法主要用于深度比较,即按照景物中各个线、面、体
区间扫描线算法
• 区间
算法描述
for (绘图窗口内的每一条扫描线) { 求投影与当前扫描线相交的所有多边形;
求上述多边形中投影与当前扫描线相交的所有边,将它们记录在活化边表AEL中; 求AEL中每条边的投影与扫描线的交点; 按交点的u坐标将AEL中各边从左到右排序两两配对组成一个区间; for (AEL中每个区间) { 求覆盖该区间的所有多边形,将它们记入活性多边形表APL中; 在区间上任取一点,计算APL中各多边形在该点的深度值, 记值最大者为P; 用多边形P的颜色填充该区间;
光线投射算法的思想是:考察由视点出发穿过观察屏幕的一个像素而 射入场景的一条射线,则可确定出场景中与该射线相交的物体 。
在计算出光线与物体表面的交点之后,离像素最近的交点的所在面片 的颜色为该像素的颜色;如果没有交点,说明没有多边形的投影覆盖此 像素,用背景色显示它即可。
算法描述
for(屏幕上的每一像素) {形成通过该屏幕像素(u,v)的射线; for (场景中的每个物体)
功能:该函数控制多边形反面或正面的绘图模式。 参数说明:
face : 指 定 多 边 形 的 面 。 face 可 能 的 值 是 GL_FRONT 、 GL_BACK 和 GL_FRONT_AND_BACK 。其中 GL_GL_FRONT 指定多边形的正面, GL_BACK 指定多 边形的反面,GL_FRONT_AND_BACK指定多边形的正面和反面。
用 g1Enable ( GL_CULL_FACE ) 启 动 消 除 多 边 形 , 用 g1Disable(GL_CULL_FACE)关闭消除多边形。
OpenGL中的多边形的消除与消隐
void glClearDepth(GLclmpd depth)
功能:指定在刷新深度缓冲器时,所用的深度值。也就是刷新 深度缓冲器后,深度缓冲器中为窗口中的每一个像素点设置的 深度值。
a. Q z m in Pz m a x
多边形的画家算法
b. Q z < P z m in m ax
多边形的画家算法
c.所有测试失败:
必须对两个多边形在Oxy平面上的投影作求交运算。 计算时不必具体求出重叠部分,在交点处进行深度比较 ,只要能判断出前后顺序即可。
深度缓冲算法
Z缓冲区(Z-Buffer)算法。在这个算法里,不仅需要有
消隐算法及其分类
按照操作对象的不同表达,消隐算法可以分为两大类
•对象空间方法(Object Space Methods) •图像空间方法(Image Space Methods)
对象空间方法和图像空间方法
•对象空间是对象三维空间,即对象被定义时所处的坐标
空间。 对象空间方法是对要显示的各个对象及对象的各个 部分进行相互比较,分析对象的三维特性之间的关系, 以确定不可见的表面或者线条的方法。
深度缓冲算法描述
Z-Buffer算法() {
帧缓存全置为背景色 深度缓存全置为最小z值 for (每一个多边形) {扫描转换该多边形 for (该多边形所覆盖的每个像素(x,y) )
{
计算该多边形在该像素的深度值d(x,y); if (d(x,y)大于Z缓存在(x,y)的值)
{
把d(x,y)存入Z缓存中(x,y)处 把多边形在(x,y)处的颜色值存入帧缓存的(x,y)处
void glDepthFunc(Glenum Func)
功能:在消隐操作中设置比较函数。 参数说明:
Lecture 13
隐藏面的消除
概述
在生成具有真实感的景物时,要考虑的一个重要问题 是如何由选定的视向把画面的不可见部分消去,即隐藏 线及隐藏面的消除问题。目前,存在解决此问题的若干 方法,并建立了若干有效的消隐算法。
消隐算法及其分类
人不能一眼看到一个三维物体的全部表面。从一个视 点去观察一个三维物体时,必然只能看到该物体表面上 的部分点、线、面,而其余部分则被这些可见部分遮挡 住。如果观察的是若干个三维物体,则物体之间还可能 彼此遮挡而部分不可见。
mode:指定指定面的模式。
OpenGL中的多边形的消除与消隐
g1FrontFace()则用来定义多边形的哪一面被视为正面: g1FrontFace(Glenum mode)
功能:指定多边形的正面。 参数说明: 指定选择多边形的面。
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。
将射线与该物体求交;
if (存在交点)
以最近的交点所属的颜色显示像素(u,v)
else 以背景色显示像素(u,v); }
OpenGL中的多边形的消除与消隐
在OpenGL中,多边形分为正面和反面,在使用多边形的过程中可以对多边形的两个面 进行分别操作。缺省状态下OpenGL对多边形正反面是以相同的方式绘制的,要改变多 边形的绘制状态,必须调用函数glPolygonMode(),函数说明如下:
多边形的画家算法
(1)以每一多边形的 zmin作为排序关键码,建立初步的 深度排序表,表中第一个多边形是具有最小z值的多边形 ,记为 P 。设视点位于 z 轴方向的无穷远处,则 P 为离视 点最远的多边形,表中第二个多边形标为Q。
(2)检查表中每个多边形与P的关系。分为3种关系:
多边形的画家算法
与取景平面的距离分类,以决定取舍。
•连贯方法是指利用显示景物具有某些相关特性,可以用来简
化计算。
消隐算法及其分类
从消隐对象角度来看,消隐算法可分为两类:线消 隐和面消隐。
•线消隐的消隐对象是物体上的边,消除的是物体上不
可见的边。
•面消隐的消隐对象是物体上的面,消除的是物体上不
可见的面。
画家算法
画家算法是把对象空间方法与图像空间方法结合在一起来消 除隐藏面的方法。
} } }
深度缓冲算法
该算法的最大优点在于简单。它可轻而易举地处理隐藏面 以及显示复杂曲面之间的交线。画面可以任意复杂。由于画面 元素可按任意次序写入帧缓冲器和Z缓冲器,故无需按深度优 先级排序,可省去深度排序时间。
扫描线算法
如果只对一条扫描线进行Z缓冲器算法,则可以得到扫描线 Z缓冲器算法 。 扫描线Z缓冲器算法做了两点改进。 ①将整个绘图窗口内的消隐问题分解到一条条扫描线上解决, 使所需的Z缓冲器大大减少。 ②计算深度值时,利用了面连贯性,只用了一个加法。
帧缓存来存放每个像素的颜色值,还需要一个深度缓存 来存放每个像素的深度值。
深度缓冲算法
Z缓冲器的深度值越大,说明该点越接近视点。
在把显示对象的每个面上每一点的属性(颜色或灰 度)值填入帧缓冲器相应单元前,要把这点的z坐标值和 Z缓冲器中相应单元的值进行比较。只有前者大于后者 时才改变帧缓冲器的那一单元的值,同时Z缓冲器中相 应单元的值也要改成这点的z坐标值。
画家算法的原理:
先把屏幕置成背景色,再把物体的各个面按其离视点的远近进 行排序,离视点远者在表头,离视点近者在表尾,排序结果存在 一张深度优先级表中。 然后按照从表头到表尾的顺序逐个绘制各个面。由于后显示 的图形取代先显示的画面,而后显示的图形所代表的面离视点更 近,所以由远及近的绘制各面,就相当于消除隐藏面。 该算法习惯上称为画家算法或深度排序算法。
} }
BSP树算法
二叉空间剖分(BSP,Binary Space-Partitioning)树 算法是一种判别物体可见性的有效算法。它类似于画家 算法,将面片由后往前地在屏幕上绘出 。
构造BSP树
BSP树取场景中的一个多边形作为分割面,递归地将
空间分为两个子空间。这两个子空间再分别选一个多边 形作分割面递归地子分下去,直到每个子空间只剩一个 多边形为止。
BSP树遍历
BSP树可见面算法的基本思想是先将离视点最远的多
百度文库
边形写入帧缓存或进行显示,即按从后到前的顺序对多 边形绘制。 如果视点在根结点多边形后侧,最终的显示顺序依次 为3、2a、1、2b、5、4。
区域子分算法
区域子分算法又称为Warnack算法 。 基本思想是:把物体投影到绘图窗口上,然后递归 分割窗口,直到窗口内目标足够简单,可以显示为止。 而在显示时进行深度探索。
该算法充分利用了区域的连贯性,提高了计算速度。
区域子分算法
算法步骤:
•初始窗口取作屏幕坐标系的矩形,将场景中的多边形投
影到窗口内。如果窗口内没有物体则按背景色显示;
•若窗口内只有一个面,则把该面显示出来; •否则,窗口内含有两个以上的面,则把窗口等分成4个
子窗口。对每个小窗口再做上述同样的处理。
光线投射算法
区间扫描线算法
可以将区间分为三类: ①区间为空 ,区间 [0, a1],此时只要按背景属性显示即 可; ②区间中只包含一个区段即一条交线或交线的一部分 .如 图中的区间[a1, a2]和[a3, a4],此时按该区段所在多边 形的显示属性进行显示; ③区间中有多条分别属于不同多边形的区段,如图中的区 间[a2, a3],此时必须计算该区间中每个区段的深度,具 有最大z值的区段为该区间中的可见段,按此可见段所在 多边形的属性进行显示
区间扫描线算法
扫描线Z缓冲器中,被多个多边形覆盖的像素区处还 要进行多次计算,计算量仍然很大。 区间扫描线算法克服了这一缺陷,可利用连贯性提 高算法效率,使得在一条扫描线上每个区间只计算一次 深度值,并且不需要Z缓冲器。 它是把当前扫描线与各多边形在投影平面的投影的交 点进行排序后,使扫描线分为若干子区间。
参数说明:
depth:指定刷新深度缓冲器时所用的深度值。
在实际操作中,使用消隐要先启动深度测试,即调用函数:
glEnable(GL_Depth_Test) 取消自动实现三维场景的消隐 要调用函数:glDisable(GL_Depth_Test)
OpenGL中的多边形的消除与消隐
在特殊的环境中,对深度的比较会有特殊的要求OpenGL中提供了深度比 较的控制函数。
•图像空间是对象投影后所在的二维空间,即设备坐标系
图像空间方法是将对象投影后分解为像素,按照一 定的规律,比较像素之间的深度(z)值,从而确定其是 否可见的方法。
消隐算法及其分类
虽然各种消隐方法具体的实现方法不同,但这些方法中大 都采用分类及连贯两种基本方法改进算法效率。
•分类方法主要用于深度比较,即按照景物中各个线、面、体
区间扫描线算法
• 区间
算法描述
for (绘图窗口内的每一条扫描线) { 求投影与当前扫描线相交的所有多边形;
求上述多边形中投影与当前扫描线相交的所有边,将它们记录在活化边表AEL中; 求AEL中每条边的投影与扫描线的交点; 按交点的u坐标将AEL中各边从左到右排序两两配对组成一个区间; for (AEL中每个区间) { 求覆盖该区间的所有多边形,将它们记入活性多边形表APL中; 在区间上任取一点,计算APL中各多边形在该点的深度值, 记值最大者为P; 用多边形P的颜色填充该区间;
光线投射算法的思想是:考察由视点出发穿过观察屏幕的一个像素而 射入场景的一条射线,则可确定出场景中与该射线相交的物体 。
在计算出光线与物体表面的交点之后,离像素最近的交点的所在面片 的颜色为该像素的颜色;如果没有交点,说明没有多边形的投影覆盖此 像素,用背景色显示它即可。
算法描述
for(屏幕上的每一像素) {形成通过该屏幕像素(u,v)的射线; for (场景中的每个物体)