Z缓冲区(Z-Buffer)算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第二章光栅图形学

2.7 消隐

消除隐藏面

Z缓冲区(Z-Buffer)算法

画家算法中,深度排序计算量大,而且排序后,还需再检查相邻的面,以确保在深度优先级表中前者在前,后者在后。若遇到多边形相交,或多边形循环重叠的情形,还必须分割多边形。为了避免这些复杂的运算,人们发明了Z缓冲区(Z-Buffer)算法。在这个算法里,不仅需要有帧缓存来存放每个象素的颜色值,还需要一个深度缓存来存放每个象素的深度值。

图2.7.11 Z缓冲区示意图

Z缓冲器中每个单元的值是对应象素点所反映对象的z坐标值。Z缓冲器中每个单元的初值取成z的极小值,帧缓冲器每个单元的初值可放对应背景颜色的值。图形消隐的过程就是给帧缓冲器和Z缓冲器中相应单元填值的过程。在把显示对象的每个面上每一点的属性(颜色或灰度)值填入帧缓冲器相应单元前,要把这点的z坐标值和z缓冲器中相应单元的值进行比较。只有前者大于后者时才改变帧缓冲器的那一单元的值,同时z缓冲器中相应单元的值也要改成这点的z坐标值。如果这点的z坐标值小于z缓冲器中的值,则说明对应象素已经显示了对象上一个点的属性,该点要比考虑的点更接近观察点。对显示对象的每个面上的每个点都做了上述处理后,便可得到消除了隐藏面的图。

Z-Buffer算法

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算法在象素级上以近物取代远物。形体在屏幕上的出现顺序是无关紧要的。这种取代方法实现起来远比总体排序灵活简单,有利于硬件实现。然而

Z-Buffer算法存在缺点:占用空间大,没有利用图形的相关性与连续性。Z-Buffer 算法以算法简单著称,但也以占空间大而闻名。一般认为,Z-Buffer算法需要开一个与图象大小相等的缓存数组ZB,实际上,可以改进算法,只用一个深度缓存变量zb。

多面体消隐的改进深度缓存算法

Z-Buffer()

{ 帧缓存全置为背景色

//扫描整个屏幕

for(屏幕上的每个象素(i,j))

{ 深度缓存变量zb置最小值MinValue

for(多面体上的每个多边形Pk)

{ if(象素点(i,j)在pk的投影多边形之内)

{ 计算Pk在(i,j)处的深度值depth;

if(depth大于zb)

{ zb = depth;

indexp = k;

}

}

}

If(zb != MinValue) 计算多边形Pindexp在交点(I,j) 处的光照颜色并显示

}

}

上面的算法要求点与多边形的包含性检测,实际上是判断一个给定的点是在一个多边形内、在多边形外,还是在多边形边界上。可采用射线法或弧长法。

(1)射线法

边形内部,否则,在多边形外部。若射线正好经过多边形的顶点,则采用“左开右闭”的原则来实现。即:当射线与某条边的顶点相交时,若边在射线的左侧,交点有效,计数;若边在射线的右侧,交点无效,不计数。

(a)奇数交点(b)偶数交点

图2.7.12 射线法交点计数

(a)射线与边重合(b)射线穿过交点相邻的边

(c)射线在交点邻边的一侧

图2.7.13 射线与顶点相交时的计数

实际上,我们只关心交点个数,没必要真正求出射线与边的交点。改进的射

若(y

若(x>x i)且(x>x i+1), 点在边的右侧,射线与边无交。

若(x<=x i)且(x<=x i+1), 点在边的左侧,射线与边无交。

若(y<=y i)AND(y<=y i+1))AND(((x i

边在被测点P的下方且射线与边相交。

(2)弧长法

弧长法要求多边形是有向多边形,即规定沿多边形的正向,边的左侧为多边形的内域。以被测点为圆心,作单位圆,将全部有向边向单位圆作径向投影,并计算其在单位园上弧长的代数和。代数和为0,点在多边形外部;代数和为2p ,点在多边形内部;代数和为p ,点在多边形边上。弧长法的最大优点就是算法的稳定性高,计算误差对最后的判断没有多大的影响。

(a)被测点p在多边形外(b)被测点p在多边形内

图2.7.14 弧长法测试点的包含性

图2.7.15弧长累加方法

真正计算边的弧长是很费时的。其实可以利用多边形的顶点符号,以及边所跨越的象限计算弧长代数和。这里,我们给出一种以顶点符号为基础的弧长累加方法。这种方法简单、快速。如图所示,将坐标原点移到被测点P。于是,新坐标系将平面划分为四个象限,各象限内的符号对分别为(+,+),(-,+),(-,-),(+,-)。算法规定:若顶点P i的某个坐标为0,则其符号为+。若顶点P i的x、y坐标都为0,则说明这个顶点为被测点,我们在这之前予以排除。于是弧长变化如下表。

值得注意的是,当边的终点P i+1在起点P i的相对象限时,弧长变化可能增加或减少p。设(x i,y i)和(x i+1,y i+1)分别为边的起点和终点坐标。计算

f=y i+1x i-x i+1y i

若f=0.则边穿过坐标原点。若f>0,则弧长代数和增加p,若f<0,则弧长代数和减少p。

表2.7.1 符号对变化与弧长变化的关系

(sx

i , sy

i

) (sx

i+!

, sy

I+1

) 弧长变化象限变化

(+ +) (+ + ) 0 I →I (+ +) (- + ) π/2 I →II (+ +) (- - ) ±πI →III (+ +) (+ - ) -π/2 I →IV

相关文档
最新文档