第二章 光栅图形学 2
7 消隐 消除隐藏面 Z 缓 冲区(Z-Buffer)算法 画家算法中,深度排序计算量大,而且排序后,还需再检查相邻的面,以确保在深度优先级表中前者在前,后者在后
若遇到多边形相交,或多边形循环重叠的情形,还必须分割多边形
为了避免这些复杂的运算,人们发明了 Z 缓冲区(Z-Buffer)算法
在这个算法里,不仅需要有帧缓存来存放每个象素的颜色值,还需要一个深度缓存来存放每个象素的深度值
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 算法在象素级上以近物取代远物
形体在屏幕上的出现顺序是无关紧要的