计算机图形学(孙家广第三版)-第2章.ppt

  1. 1、本文档共131页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
计算机图形学(孙家广第三版)-第2章

光线投射算法 基本思想: 考察由视点出发穿过观察屏幕的一象素而射入场景的一条射线,则可确定出场景中与该射线相交的物体。 在计算出光线与物体表面的交点之后,离象素最近的交点的所在面片的颜色为该象素的颜色; 如果没有交点,说明没有多边形的投影覆盖此象素,用背景色显示它即可。 将通过屏幕各象素的投影线与场景中的物体表面求交 算法过程: for屏幕上的每一象素 { 形成通过该屏幕象素(u,v)的射线; for 场景中的每个物体 { 将射线与该物体求交; if 存在交点 以最近的交点所属的颜色显示象素(u,v) else 以背景色显示象素(u,v) } } 光线投射算法与Z缓冲器算法相比,它们仅仅是内外循环颠倒了一下顺序,所以它们的算法复杂度类似。 区别在于光线投射算法不需要Z缓冲器。 为了提高本算法的效率可以使用包围盒技术,空间分割技术以及物体的层次表示方法等来加速。 研究内容 发展历史 应用领域 图形设备 * * * 2.7.3消除隐藏面 画家算法(列表优先算法) 先把屏幕置成背景色, 再把物体的各个面按其离视点的远近进行排序,排序结果存在一张深度优先级表中。 然后按照从远到近的顺序逐个绘制各个面。 关键是如何对场景中的物体按深度排序 对场景中的物体按深度排序 深度重叠测试. Zmin(P)Zmin(Q),若Zmax(P)Zmin(Q),则P肯定不能遮挡Q。 投影重叠判断 P和Q在oxy平面上投影的包围盒在x方向上不相交 P和Q在oxy平面上投影的包围盒在y方向上不相交 P和Q在oxy平面上的投影不相交 P在Q之后。P的各顶点均在Q的远离视点的一侧 Q在P之前。Q的各顶点均在P的靠近视点的一侧 精确的重叠测试 以上测试失败,须作进一步判断。计算时不必具体求出重叠部分。在交点处进行深度比较,只要能判断出前后顺序即可。 若遇到多边形相交或循环重叠的情况(如图f),还必须在相交处分割多边形,然后进行判断。 P不遮挡Q的各种情况(ab,c,d,e) 及互相遮挡f P不遮挡Q的各种情况(ab,c,d,e) 及互相遮挡f Z缓冲区算法 采用z缓冲区算法的原因 帧缓存来存放每个象素的颜色值 初值可放对应背景颜色的值。 深度缓存来存放每个象素的深度值。 初值取成z的极小值 算法过程 在把显示对象的每个面上每一点的属性(颜色或灰度)值填入帧缓冲器相应单元前,要把这点的z坐标值和z缓冲器中相应单元的值进行比较。只有前者大于后者时才改变帧缓冲器的那一单元的值,同时z缓冲器中相应单元的值也要改成这点的z坐标值。 如果这点的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算法在象素级上以近物取代远物。形体在屏幕上的出现顺序是无关紧要的。 这种取代方法实现起来远比总体排序灵活简单,有利于硬件实现。 缺点:占用空间大,没有利用图形的相关性与连续性。 只用一个深度缓存变量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; indexp = k; } } } If(zb

您可能关注的文档

文档评论(0)

kabudou + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档