第 9章 真实感图形技术
? 1,消隐技术
? 2,光照模型和明暗处理
? 3,颜色模型和处理技术
用计算机生成三维真实图形是计算机图形学研究的重要内
容之一。真实图形在计算机仿真模拟、几何造型、广告影视、
指挥控制和科学计算的可视化等方面都有广泛的应用。真实感
图形技术是指在使用显示设备绘制物体图形时,必须把三维信
息经过某种投影变换,在二维的显示表面上绘制出来,使其具
有立体真实地感觉。三维图形的表现形式有三种,第一种是线
框图,它是通过物体的棱边和轮廓线表示物体。用线框图表示
的三维图形具有二义性。第二种形式是消隐图,图中只保留形
体上能看见的部分,看不见或被遮挡的部分不画出来或用虚线
表示。第三种形式是用光照效果、图案纹理和颜色,使图形具
有立体真实地感觉。真实感图形技术包括消隐技术、光照模型、
明暗处理和表面纹理、颜色模型等。
9.1 消隐技术
9.1.1 基本概念
对于一个不透明的三维物体,选择不同的
视点观看物体时,由于物体表面之间的遮挡关
系,所以无法看到物体上所有的线和面。正确
判断哪些线和面是可见的,哪些是不可见的,
对于准确和真实地绘出三维物体时至关重要的。
图 9-1-1(a)是一个立方体的线框图,如果不去掉
不可见的线段,就会产生图形理解上的二义性,
如图 9-1-1(b)和图 9-1-1(c)所示。
图 9-1-1 三维线框图理解的二义性
在显示三维物体时,不仅要决定物体上每条边在
视图区中的位置,而且要决定哪些边是可见的,必须
显示,哪些边是不可见,必须去掉活用虚线来表示。
找出并消除物体中不可见的部分,称为消隐。经过消
隐得到的图形称为消隐图。
消隐的对象是三维物体。三维物体在计算机中的
表示方法很多,最简单的表示方法是用其表面上的平
面多边形表示。如果物体的表面是曲面,则可以用多
个平面多边形作近似表示。多边形可以用其边界上的
边来表示,而边又可进一步用其两个端点来表示。根
据消隐对象的不同,消隐算法可分为两类:一是线消
隐,消除的是物体上不可见的线段;二是面消隐,消
除的是物体上不可见的面。一般来说,当用笔式绘图
仪或其它画线设备绘制图形时,采用线消隐,而当用
光栅图形显示器来显示图形时,采用面消隐。
几乎所有的消隐算法都涉及到排序问题。
消隐算法的基本思想是将物体上所有的点、线、
面,按照距视点的远近进行排序。一般来说,
离视点较远的物体,就有可能被离视点较近的
物体完全或部分遮盖。消隐算法的效率在很大
程度上取决于排序的效率,通常可以采用相关
性来提高排序的效率。所谓相关性是指考察物
体或视图区的图像局部保持不变的一种性质,
即相邻的点、线和区域有相似的性质。
下面主要介绍在光栅显示器上绘制物体真
实图形时,必须解决的面消隐的问题。这方面
的使用算法很多,包括:画家算法,Z缓冲区
算法、扫描线算法、区域采样算法等。
9.1.2 画家算法
画家算法的基本思想,先把屏幕置成背景色,再
把物体的各个面按其离视点的远近进行排序。离视点
远的在表头,离视点近的在表尾,构造深度优先表。
然后,从表头至表尾逐个取出多边形,投影到屏幕上,
显示多边形所包含的实心区域。由于后显示的图形取
代先显示的画面,而后显示的图形所代表的面离视点
更近,所以,由远及近地绘制各面,就相当于消除隐
藏面。这与油画家作画的过程类似,先画远景,再画
中景,最后画近景,因此将这种算法称为画家算法。
下面对画家算法实现中所用到的数据文件格式、
数据结构、算法流程图和主要的子程序功能作简单的
介绍。
物体采用边界表示模式存储。数据文件由
若干三元组和若干四元组组成。三元组表示物
体顶点的坐标。四元组表示物体的某个面由哪
些顶点构成。如图 9-1-2所示,表示一个立方体
的数据文件。
顶点的表
示
8
1 0 0
1 1 0
1 1 1
1 0 1
0 0 0
0 1 0
0 1 1
0 0 1
面的表示
6
1 2 3 4
2 6 7 3
6 5 8 7
5 1 4 8
4 3 7 8
5 6 2 1
图 9-1-2 画家算法中的数据表示
算法实现所需要的数据结构包括点记录( vertex)、
面记录( patch)和排序数组。点记录由五个域构成,
其中三个域用于存储点的空间坐标,另外两个域用于
存储点的投影(屏幕)坐标。面记录由四个域组成,
每个域存放对应的顶点号。排序数组的每个元素有两
个域,其中一个域存放面与视点的距离,另一个域存
放该面的面号。程序的流程图见图 9-1-3。
画家算法的优点是简单、易于实现,并且可以作
为实现更为复杂算法的基础。它的缺点是只能处理互
不相交的面,而且深度优先级表中的顺序可能出错,
如两个面相交或三个面相互重叠的情况,用任何方法
都不能排出正确的顺序。这时,只能把有关的面进行
分割后再排序。增加了算法的复杂度,因此,该算法
使用具有一定的局限性。
开始
readkeyboard:打开物体的边界表示数据文件, 从
键盘上读入旋转角和透视角, 物体表面的颜色参
数 ( 色彩和饱和度 ), 光源方向 。
vertices:读进顶点的空间坐标, 计算物体的包围球
半径, 把物体缩小到单位球中去, 计算物体各顶点
在屏幕上的投影坐标 。
patches:读进面定义数据, 求出各面与视点的距离,
把面号与距离放进排序数组 。 然后以面与视点的距
离为参照值, 对数组进行排序 。
gmode,使终端进入图形状态, 设备参数初始化 。
setpen,建立查色表
painting,从排好序的数组中依次取出一个面号, 计算对应
的法向量, 再计算该面的光强, 然后显示该面 。
amode,终端返回文字状态
结束
图 9-1-3 画家算法流程图
9.1.3 Z缓冲区算法
为了避免画家算法复杂的运算,人们提出了 Z缓
冲区算法。 Z缓冲区算法又称为深度缓存算法,是一
种简单的面消隐算法。它不仅需要一个帧缓冲区 (FB)
来存放每个像素的亮度值,而且还需要有一个 Z缓冲
区 (ZB)来存放每个像素的深度值,即 Z坐标。这正是 Z
缓冲区算法名称的来历。
如图 9-1-4,Z轴方向为观察方向。过屏幕上任一
像素点 (i,j)作平行于 Z轴的射线 R与物体表面交于 p1点
和 p2点。我们称 p1和 p2为多边形平面上对应像素 (i,j)的
点,p1和 p2的 Z值称为该点的深度值。
该算法的主要思想是以近物取代远物,即
对投影平面上每个像素所对应的 Z值进行比较,
将最小的 Z值存入深度缓冲区 ZB中,Z值所对应
的多边形颜色存入显示器帧缓存 FB中。帧缓存
FB为屏幕上每一个像素点保存显示的颜色。由
于屏幕上每一个像素点所对应的多边形平面上
点的深度值都要存入深度缓冲区 ZB中,若屏幕
分辨率为 m?n,则 ZB的大小也为 m?n。
Z缓冲区算法的流程如下:
帧缓冲区设置成背景色;
Z缓冲区设置成最小的 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)处;
}
}
}
算法结束后,显示器帧缓冲区 FB中存放的就是消隐后的图像。
多边形 Pk在点 (x,y)处的深度值 Zij的计算。对于一
个给定的多边形,设多边形 Pk的平面方程为:
ax + by + cz + d=0
则,可得到深度值 Zij,
Zij = ( - d – ax - by) / c
其中,c≠0。若 c=0,则说明多边形 Pk的法向量与 Z
轴垂直,Pk在 XOY平面上的投影为一直线,算法中不
考虑这种多边形。
Z缓冲区算法比画家算法排序灵活简单,有利于
硬件实现。在 Z缓冲区算法算法中,屏幕上哪个像素
点的颜色先计算,哪个后计算,其先后顺序是无关紧
要的,不影响消隐结果。因此,该算法不需要预先排
队,从而省去了各个方向的排序时间。
9.1.4 扫描线算法
扫描线算法的基本思想是:按照扫描线的
顺序处理一帧画面,在由视点和扫描线所决定
的扫描平面上解决消隐问题。具体步骤是,先
把物体各面投影到屏幕上,再计算扫描线与物
体各投影面的相交区间。当两个区间在深度方
向上重叠时,采用深度测试确定可见部分,扫
描线算法的典型实现由两种,即扫描线 Z缓冲
算法和扫描线间隔连贯性算法。
? 1,消隐技术
? 2,光照模型和明暗处理
? 3,颜色模型和处理技术
用计算机生成三维真实图形是计算机图形学研究的重要内
容之一。真实图形在计算机仿真模拟、几何造型、广告影视、
指挥控制和科学计算的可视化等方面都有广泛的应用。真实感
图形技术是指在使用显示设备绘制物体图形时,必须把三维信
息经过某种投影变换,在二维的显示表面上绘制出来,使其具
有立体真实地感觉。三维图形的表现形式有三种,第一种是线
框图,它是通过物体的棱边和轮廓线表示物体。用线框图表示
的三维图形具有二义性。第二种形式是消隐图,图中只保留形
体上能看见的部分,看不见或被遮挡的部分不画出来或用虚线
表示。第三种形式是用光照效果、图案纹理和颜色,使图形具
有立体真实地感觉。真实感图形技术包括消隐技术、光照模型、
明暗处理和表面纹理、颜色模型等。
9.1 消隐技术
9.1.1 基本概念
对于一个不透明的三维物体,选择不同的
视点观看物体时,由于物体表面之间的遮挡关
系,所以无法看到物体上所有的线和面。正确
判断哪些线和面是可见的,哪些是不可见的,
对于准确和真实地绘出三维物体时至关重要的。
图 9-1-1(a)是一个立方体的线框图,如果不去掉
不可见的线段,就会产生图形理解上的二义性,
如图 9-1-1(b)和图 9-1-1(c)所示。
图 9-1-1 三维线框图理解的二义性
在显示三维物体时,不仅要决定物体上每条边在
视图区中的位置,而且要决定哪些边是可见的,必须
显示,哪些边是不可见,必须去掉活用虚线来表示。
找出并消除物体中不可见的部分,称为消隐。经过消
隐得到的图形称为消隐图。
消隐的对象是三维物体。三维物体在计算机中的
表示方法很多,最简单的表示方法是用其表面上的平
面多边形表示。如果物体的表面是曲面,则可以用多
个平面多边形作近似表示。多边形可以用其边界上的
边来表示,而边又可进一步用其两个端点来表示。根
据消隐对象的不同,消隐算法可分为两类:一是线消
隐,消除的是物体上不可见的线段;二是面消隐,消
除的是物体上不可见的面。一般来说,当用笔式绘图
仪或其它画线设备绘制图形时,采用线消隐,而当用
光栅图形显示器来显示图形时,采用面消隐。
几乎所有的消隐算法都涉及到排序问题。
消隐算法的基本思想是将物体上所有的点、线、
面,按照距视点的远近进行排序。一般来说,
离视点较远的物体,就有可能被离视点较近的
物体完全或部分遮盖。消隐算法的效率在很大
程度上取决于排序的效率,通常可以采用相关
性来提高排序的效率。所谓相关性是指考察物
体或视图区的图像局部保持不变的一种性质,
即相邻的点、线和区域有相似的性质。
下面主要介绍在光栅显示器上绘制物体真
实图形时,必须解决的面消隐的问题。这方面
的使用算法很多,包括:画家算法,Z缓冲区
算法、扫描线算法、区域采样算法等。
9.1.2 画家算法
画家算法的基本思想,先把屏幕置成背景色,再
把物体的各个面按其离视点的远近进行排序。离视点
远的在表头,离视点近的在表尾,构造深度优先表。
然后,从表头至表尾逐个取出多边形,投影到屏幕上,
显示多边形所包含的实心区域。由于后显示的图形取
代先显示的画面,而后显示的图形所代表的面离视点
更近,所以,由远及近地绘制各面,就相当于消除隐
藏面。这与油画家作画的过程类似,先画远景,再画
中景,最后画近景,因此将这种算法称为画家算法。
下面对画家算法实现中所用到的数据文件格式、
数据结构、算法流程图和主要的子程序功能作简单的
介绍。
物体采用边界表示模式存储。数据文件由
若干三元组和若干四元组组成。三元组表示物
体顶点的坐标。四元组表示物体的某个面由哪
些顶点构成。如图 9-1-2所示,表示一个立方体
的数据文件。
顶点的表
示
8
1 0 0
1 1 0
1 1 1
1 0 1
0 0 0
0 1 0
0 1 1
0 0 1
面的表示
6
1 2 3 4
2 6 7 3
6 5 8 7
5 1 4 8
4 3 7 8
5 6 2 1
图 9-1-2 画家算法中的数据表示
算法实现所需要的数据结构包括点记录( vertex)、
面记录( patch)和排序数组。点记录由五个域构成,
其中三个域用于存储点的空间坐标,另外两个域用于
存储点的投影(屏幕)坐标。面记录由四个域组成,
每个域存放对应的顶点号。排序数组的每个元素有两
个域,其中一个域存放面与视点的距离,另一个域存
放该面的面号。程序的流程图见图 9-1-3。
画家算法的优点是简单、易于实现,并且可以作
为实现更为复杂算法的基础。它的缺点是只能处理互
不相交的面,而且深度优先级表中的顺序可能出错,
如两个面相交或三个面相互重叠的情况,用任何方法
都不能排出正确的顺序。这时,只能把有关的面进行
分割后再排序。增加了算法的复杂度,因此,该算法
使用具有一定的局限性。
开始
readkeyboard:打开物体的边界表示数据文件, 从
键盘上读入旋转角和透视角, 物体表面的颜色参
数 ( 色彩和饱和度 ), 光源方向 。
vertices:读进顶点的空间坐标, 计算物体的包围球
半径, 把物体缩小到单位球中去, 计算物体各顶点
在屏幕上的投影坐标 。
patches:读进面定义数据, 求出各面与视点的距离,
把面号与距离放进排序数组 。 然后以面与视点的距
离为参照值, 对数组进行排序 。
gmode,使终端进入图形状态, 设备参数初始化 。
setpen,建立查色表
painting,从排好序的数组中依次取出一个面号, 计算对应
的法向量, 再计算该面的光强, 然后显示该面 。
amode,终端返回文字状态
结束
图 9-1-3 画家算法流程图
9.1.3 Z缓冲区算法
为了避免画家算法复杂的运算,人们提出了 Z缓
冲区算法。 Z缓冲区算法又称为深度缓存算法,是一
种简单的面消隐算法。它不仅需要一个帧缓冲区 (FB)
来存放每个像素的亮度值,而且还需要有一个 Z缓冲
区 (ZB)来存放每个像素的深度值,即 Z坐标。这正是 Z
缓冲区算法名称的来历。
如图 9-1-4,Z轴方向为观察方向。过屏幕上任一
像素点 (i,j)作平行于 Z轴的射线 R与物体表面交于 p1点
和 p2点。我们称 p1和 p2为多边形平面上对应像素 (i,j)的
点,p1和 p2的 Z值称为该点的深度值。
该算法的主要思想是以近物取代远物,即
对投影平面上每个像素所对应的 Z值进行比较,
将最小的 Z值存入深度缓冲区 ZB中,Z值所对应
的多边形颜色存入显示器帧缓存 FB中。帧缓存
FB为屏幕上每一个像素点保存显示的颜色。由
于屏幕上每一个像素点所对应的多边形平面上
点的深度值都要存入深度缓冲区 ZB中,若屏幕
分辨率为 m?n,则 ZB的大小也为 m?n。
Z缓冲区算法的流程如下:
帧缓冲区设置成背景色;
Z缓冲区设置成最小的 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)处;
}
}
}
算法结束后,显示器帧缓冲区 FB中存放的就是消隐后的图像。
多边形 Pk在点 (x,y)处的深度值 Zij的计算。对于一
个给定的多边形,设多边形 Pk的平面方程为:
ax + by + cz + d=0
则,可得到深度值 Zij,
Zij = ( - d – ax - by) / c
其中,c≠0。若 c=0,则说明多边形 Pk的法向量与 Z
轴垂直,Pk在 XOY平面上的投影为一直线,算法中不
考虑这种多边形。
Z缓冲区算法比画家算法排序灵活简单,有利于
硬件实现。在 Z缓冲区算法算法中,屏幕上哪个像素
点的颜色先计算,哪个后计算,其先后顺序是无关紧
要的,不影响消隐结果。因此,该算法不需要预先排
队,从而省去了各个方向的排序时间。
9.1.4 扫描线算法
扫描线算法的基本思想是:按照扫描线的
顺序处理一帧画面,在由视点和扫描线所决定
的扫描平面上解决消隐问题。具体步骤是,先
把物体各面投影到屏幕上,再计算扫描线与物
体各投影面的相交区间。当两个区间在深度方
向上重叠时,采用深度测试确定可见部分,扫
描线算法的典型实现由两种,即扫描线 Z缓冲
算法和扫描线间隔连贯性算法。