- 1、本文档共46页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
chapter02_7_面消隐_new
浙江大学计算机图形学 2.7 消隐 消除隐藏面 基本概念 Z缓冲区(Z-Buffer)算法 扫描线Z-buffer算法 区间扫描线算法 光线投射算法 基本概念 投影变换失去了深度信息,往往导致图形的二义性 要消除二义性,就必须在绘制时消除被遮挡的不可见的线或面,习惯上称作消除隐藏线和隐藏面,简称为消隐。 经过消隐得到的投影图称为物体的真实图形。 长方体线框投影图的二义性 基本概念 消隐的对象是三维物体。三维体的表示主要有边界表示和CSG(构造实体几何)表示等。 消隐结果与观察物体有关,也与视点有关。 线框图 消隐图 真实感图形 消隐的分类 按消隐对象分类 线消隐 消隐对象是物体上的边,消除的是物体上不可见的边。 面消隐 消隐对象是物体上的面,消除的是物体上不可见的面。 面消隐 面消隐算法的分类 Z缓冲器算法 扫描线Z缓冲器算法 区间扫描线算法 光线投射算法 面消隐算法的分类 消隐算法的分类 第一类(图像空间的消隐算法):以窗口内的每个像素为处理单元;如Z-buffer、扫描线算法 for (窗口内的每一个像素) { 确定距视点最近的物体,以该物体表面的颜色来显示像素} 第二类(物体空间的消隐算法):以场景中的物体为处理单元;如光线投射算法 for (场景中的每一个物体) { 将其与场景中的其它物体比较,确定其表面的可见部分; 显示该物体表面的可见部分; } 面消隐算法的分类 第一类(图像空间的消隐算法):以窗口内的每个像素为处理单元; for (窗口内的每一个像素) { 确定距视点最近的物体,以该物体表面的颜色来显示像素} 假设场景中有k个物体,平均每个物体表面由h个多边形构成,显示区域中有m x n个像素,则: 算法的复杂度为:O(mnkh) 面消隐算法的分类 第二类(物体空间的消隐算法 ):以场景中的物体为处理单元; for (场景中的每一个物体) { 将其与场景中的其它物体比较,确定其表面的可见部分; 显示该物体表面的可见部分; } 假设场景中有k个物体,平均每个物体表面由h个多边形构成,显示区域中有m x n个像素,则: 算法的复杂度为:O((kh)*(kh)) Z-Buffer算法 由来: 帧缓冲器 – 保存各像素颜色值 Z缓冲器 --保存各像素处物体深度值 Z缓冲器中的单元与帧缓冲器中的单元一一对应 Z-Buffer算法 思想:先将Z缓冲器中每个单元的初始值置为最小值。当要改变某个像素的颜色值时,首先检查当前多边形的深度值是否大于该像素原来的深度值(保存在该像素所对应的Z缓冲器的单元中),如果大于,说明当前多边形更靠近观察点,用它的颜色替换像素原来的颜色;否则说明在当前像素处,当前多边形被前面所绘制的多边形遮挡了,是不可见的,像素的颜色值不改变。 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缓冲器算法是所有图像空间算法中最简单的一种隐藏面消除算法。它在象素级上以近物取代远物,与形体在屏幕上的出现顺序无关。 优点:1)简单稳定,利于硬件实现 2)不需要整个场景的几何数据 缺点: 1)需要一个额外的Z缓冲器 2)在每个多边形占据的每个像素处都要计算深度值,计算量大 Z-Buffer算法-改进算法 只用一个深度缓存变量zb的改进算法。 一般认为,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; i
文档评论(0)