计算机图形学实验z-buffer算法
- 格式:docx
- 大小:17.69 KB
- 文档页数:21
计算机图形学——隐藏线和隐藏⾯的消除(消隐算法)⼀、概述由于投影变换失去了深度信息,往往导致图形的⼆义性。
要消除⼆义性,就必须在绘制时消除被遮挡的不可见的线或⾯,习惯上称作消除隐藏线和隐藏⾯(或可见线判定、可见⾯判定),或简称为消隐。
经过消隐得到的投影图称为物体的真实感图形。
下⾯这个图就很好体现了这种⼆义性。
消隐后的效果图:消隐算法的分类所有隐藏⾯消隐算法必须确定:在沿透视投影的投影中⼼或沿平⾏投影的投影⽅向看过去哪些边或⾯是可见的两种基本算法1、以构成图像的每⼀个像素为处理单元,对场景中的所有表⾯,确定相对于观察点是可见的表⾯,⽤该表⾯的颜⾊填充该像素.适于⾯消隐。
算法步骤:a.在和投影点到像素连线相交的表⾯中,找到离观察点最近的表⾯;b.⽤该表⾯上交点处的颜⾊填充该像素;2、以三维场景中的物体对象为处理单元,在所有对象之间进⾏⽐较,除去完全不可见的物体和物体上不可见的部分.适于⾯消隐也适于线消隐。
算法步骤:a.判定场景中的所有可见表⾯;b.⽤可见表⾯的颜⾊填充相应的像素以构成图形;提醒注意1.假定构成物体的⾯不能相互贯穿,也不能有循环遮挡的情况。
2.假定投影平⾯是oxy平⾯,投影⽅向为z轴的负⽅向。
如果构成物体的⾯不满⾜该假定,可以把它们剖分成互不贯穿和不循环遮挡的情况。
例如,⽤图b中的虚线便可把原来循环遮挡的三个平⾯,分割成不存在循环遮挡的四个⾯。
⼆、可见⾯判断的有效技术1、边界盒指能够包含该物体的⼀个⼏何形状(如矩形/圆/长⽅体等),该形状有较简单的边界。
边界盒技术⽤于判断两条直线是否相交。
进⼀步简化判断2、后向⾯消除(Back-face Removal)思路:把显然不可见的⾯去掉,减少消隐过程中的直线求交数⽬如何判断:根据定义寻找外(或内)法向,若外法向背离观察者,或内法向指向观察者,则该⾯为后向⾯。
注意:如果多边形是凸的,则可只取⼀个三⾓形计算有向⾯积sp。
如果多边形不是凸的,只取⼀个三⾓形计算有向⾯积sp可能会出现错误,即F所在的⾯为前向⾯也可能出现sp≥0的情况,因此,需按上式计算多边形F的有向⾯积。
《计算机图形学》实验报告实验十一真实感图形一、实验教学目标与基本要求初步实现真实感图形, 并实践图形的造型与变换等。
二、理论基础运用几何造型, 几何、投影及透视变换、真实感图形效果(消隐、纹理、光照等)有关知识实现。
1.用给定地形高程数据绘制出地形图;2.绘制一(套)房间,参数自定。
三. 算法设计与分析真实感图形绘制过程中, 由于投影变换失去了深度信息, 往往导致图形的二义性。
要消除这类二义性, 就必须在绘制时消除被遮挡的不可见的线或面, 习惯上称之为消除隐藏线和隐藏面, 或简称为消隐, 经过消隐得到的投影图称为物体的真实图形。
消隐处理是计算机绘图中一个引人注目的问题, 目前已提出多种算法, 基本上可以分为两大类:即物体空间方法和图象空间方法。
物体空间方法是通过比较物体和物体的相对关系来决定可见与不可见的;而图象空间方法则是根据在图象象素点上各投影点之间的关系来确定可见与否的。
用这两类方法就可以消除凸型模型、凹形模型和多个模型同时存在时的隐藏面。
1).消隐算法的实现1.物体空间的消隐算法物体空间法是在三维坐标系中, 通过分析物体模型间的几何关系, 如物体的几何位置、与观察点的相对位置等, 来进行隐藏面判断的消隐算法。
世界坐标系是描述物体的原始坐标系, 物体的世界坐标描述了物体的基本形状。
为了更好地观察和描述物体, 经常需要对其世界坐标进行平移和旋转, 而得到物体的观察坐标。
物体的观察坐标能得到描述物体的更好视角, 所以物体空间法通常都是在观察坐标系中进行的。
观察坐标系的原点一般即是观察点。
物体空间法消隐包括两个基本步骤, 即三维坐标变换和选取适当的隐藏面判断算法。
选择合适的观察坐标系不但可以更好地描述物体, 而且可以大大简化和降低消隐算法的运算。
因此, 利用物体空间法进行消隐的第一步往往是将物体所处的坐标系转换为适当的观察坐标系。
这需要对物体进行三维旋转和平移变换。
常用的物体空间消隐算法包括平面公式法、径向预排序法、径向排序法、隔离平面法、深度排序法、光线投射法和区域子分法。
《计算机图形学》题集一、选择题(每题2分,共20分)1.计算机图形学主要研究的是:A. 计算机硬件的设计B. 计算机软件的开发C. 图像的生成、处理与显示D. 计算机网络技术2.下列哪个不是计算机图形学的应用领域?A. 游戏开发B. 医学影像处理C. 文字编辑D. 三维动画制作3.在计算机图形学中,像素(Pixel)是:A. 图像的最小单位B. 显示器的大小C. 图像的分辨率D. 图像的颜色深度4.下列哪个是光栅图形显示器的特点?A. 直接使用矢量数据表示图像B. 图像由像素阵列组成C. 分辨率固定不变D. 不适用于动态图像显示5.在三维图形变换中,平移变换不会改变物体的:A. 形状B. 大小C. 方向D. 位置6.下列哪个算法常用于三维图形的消隐处理?A. 光线追踪算法B. Z-Buffer算法C. 纹理映射算法D. 反走样算法7.在计算机图形学中,下列哪个术语用于描述物体表面的明暗程度?A. 色彩B. 光照模型C. 纹理D. 透明度8.下列哪个不是计算机图形学中的基本图形生成算法?A. 中点画线算法B. Bresenham画圆算法C. 扫描线填充算法D. Cohen-Sutherland线段裁剪算法9.在计算机图形学中,下列哪个概念用于描述物体的三维形状?A. 像素B. 几何模型C. 色彩模型D. 光照模型10.下列哪个不是真实感图形生成的基本步骤?A. 几何建模B. 光照模型计算C. 纹理映射D. 数据压缩二、填空题(每题2分,共14分)1.计算机图形学中的“图形”主要分为两大类:和。
2.在三维图形变换中,旋转变换可以使用______矩阵来实现。
3.在计算机图形学中,______是指使用数学方法来模拟真实世界中光线与物体表面的相互作用。
4.在进行三维图形的消隐处理时,______算法是一种常用的方法,它通过维护一个深度缓冲区来实现。
5.在计算机图形学中,______是一种常用的图像滤波技术,可以用于图像的平滑处理。
计算机图形学作业及答案1、计算机图形系统的组成包括哪些?答:计算机图形系统由硬件和软件两部分组成,硬件包括:主计算机、图形显示器以及I/O 交互工具和存储设备;软件包括操作系统、高级语言、图形软件和应用软件。
现代计算机图形系统与一般计算机系统最主要的差别是具有图形的输入、输出设备以及必要的交互工具,在速度和存储容量上具有较高的要求。
另外,人也是这个系统的组成部分。
2、简述光栅扫描式显示器的性能指标?答:⑴分辨率:指显示器在屏幕水平(垂直)方向可显示多少像素,分辨率以象素点为基本单位。
表示方法为320×200、640×480等。
显示分辨率与显卡上的缓冲存储器的容量有关,容量越大,显示分辨率越高。
分辨率越高,显示的字符或图像越清晰。
⑵ 亮度等级数目和色彩:指单种颜色亮度可变化的数目,亮度等级范围的提升可使图像看 上去更柔和自然色彩包括可选择显示颜色的数目以及一帧画面可同时显示的颜色数。
⑶ 显示速度:指显示字符、图形,特别是动态图像的速度,可用最大带宽表示:水平像素 数*垂直像素数*最大刷新率。
3、具有相同分辨率的彩色光栅显示器与黑白光栅在结构上有何区别? 答:彩色:对于红、绿、蓝的三个原色有三个位面的帧缓存和三个电子枪,每个位面的帧缓冲对应一个电子枪即对应一种颜色;对每个颜色的电子枪可以通过增加帧缓存位面来提高颜色种类和灰度级,通过三种原色的组合可以产生不同种类的颜色。
彩色光栅显示器主要是有红、绿、蓝的三个原色所组成,每种原色电子枪有8个位面的帧缓存和8位的数模转换器,每种原色有256种亮度,三种原色组合可为16771216种颜色,也可以通过颜色查找表查找,故帧缓存位数至少24位。
黑白:黑白光栅显示器的帧缓存是一块连续的计算机存储器,每个像素需1位存储器,每个存储器只有0或1两个状态。
因此一个位面的帧缓存只能产生黑白图形。
可以增加象素点的位面数,通过多个位面显示出多种灰度级。
常用的消隐算法及总结数学092邹继瑶 090064摘要:用计算机生成三维物体的真实图形是计算机图形学研究的重要内容。
真实图形在仿真模拟、几何造型、广告影视、指挥控制和科学计算的可视化等许多领域都有广泛应用。
经过消隐得到的投影图称为物体的真实图形。
较常用的消隐算法有画家算法、Z-Buffer算法及其它一些改进算法。
消隐算法从算法基本思想、算法描述和算法步骤等方面对画家算法、Z-Buffer算法和其它改进算法进行了分析,并得出了它们相关的特点。
关键词:计算机图形学消隐景物空间消隐图像空间消隐算法引言:近年来,产生真实的虚拟环境是计算机图形学孜孜以求的目标。
在虚拟对象或场景的创建中要用到许多综合处理过程,每一种都非常令人感兴趣也非常重要。
计算机辅助设计、科学可视化、模拟训练、医疗成像、娱乐、广告等等,所有的这些,都要依赖于当今最前沿的计算机图形技术。
伴随着计算机硬件、软件的飞速发展,计算机图形学技术也得到了质的飞跃。
特别是面向对象技术和多媒体技术取得的成功,使得图形学成为计算机软件业中一个重要的分支。
而程序设计方法、数据库系统和人工智能等新技术渗入到计算机图形学领域,又为计算机图形学提供了更加宽阔的发展空间和强劲动力。
计算机图形学是研究通过计算机将数据转换成图形,并在专用显示设备上显示的原理、方法和技术的学科。
主要介绍了计算机图形系统的基本知识,图形生成与显示的算法,图形的表示与图形的数据结构,图形的几何变换与投影变换,图形的裁剪技术,图形消隐处理,真实感图形的生成等内容。
面消隐作为图形学中一个分支是本文的一个重要的研究内容。
一.消隐的基本概念由于屏幕上的一些图元被另一些图元挡住所造成的。
例如,当需要描绘一个由多边形面组成的三维物体时,那么它的一部分必然要被挡住,要在屏幕上显示的必须是可见的东西。
打个比方,对于一个立方体,无论从哪个方向进行透视处理,最多只能看到其中的三个面。
这样,就要想出一种方法来决定哪些面是所能看到的。
浅谈HiZ-buffer最近在做GPU-Driven Rendering Pipleline相关的技术,在整个pipeline中裁剪是其中⾮常重要的⼀环,基于GPU的遮挡裁剪也是众多裁剪算法的⼀种,它充分利⽤compute shader并⾏计算的威⼒,在加速遮挡查询的同时,可以降低查询的延迟。
在实现基于GPU的遮挡裁剪时,我们会使⽤到⼀种称为Hierarchical Z-buffer的技术,他是整个遮挡查询的关键所在。
那么什么是Hierarchical Z-buffer呢?它的优势⼜是什么呢?今天就简单解释⼀下HiZ-buffer的基本原理,在实际的使⽤过程中,虽然不同游戏使⽤了不同的优化⽅法,但是其核⼼的原理都是⼀样的。
我们假设如下图所⽰的场景,该图是横切⾯图,相机是从Z0看向Z1。
下⾯我们就通过该例⼦来看下,如何使⽤Hierarchical Z-Buffer来将绿⾊的物体判定为被遮挡,从⽽将其裁剪掉。
上图中z = 0是近裁剪⾯,z = 1是远裁剪⾯。
⾸先我们将遮挡物(红⾊和蓝⾊)进⾏光栅化,得到⼀个z-buffer,如下图竖着的那根灰⾊的线就代表了光栅化后的深度值。
接下来就是最重要的⼀步,下采样z-buffer,得到⼀串mipmap层级贴图(该mipmap层级图就称为Hierarchical Z-buffer,或者abbreviated HiZ-buffer)在下采样的过程中,我们使⽤的是max操作,也就是说两个相邻的像素下采样为⼀个像素时,使⽤两者中最⼤的那个的值作为下⼀层级的值。
如下图所⽰:由上图可以看出,每⼀次下采样,都是对上⼀层级的保守估计,到了第4级就只剩下⼀个深度值了。
由于下采样的时候⽤的是max操作,所以如果⼀个物体在level 2中深度值判定为被遮挡,那么它肯定在level 1中也是被遮挡的。
得到HiZ-buffer之后,我们就可以基于它来进⾏遮挡裁剪了:计算得到绿⾊物体的AABB包围盒,该包围盒的x-max/min和y-max/min⽤来决定采样哪⼀层级的HiZ-buffer(也就是看哪⼀层级的尺⼨能够涵盖包围盒的所有像素),在本例中该AABB包围盒符合level 2,所以我们选择采样level2,从⽽得到⼀个z-buffer的保守估计。
3D图像生成算法原理一、建齐次坐标二、着色模型三、Z缓存四、纹理映射在这些步骤中,显示部分(GPU)只负责完成第三、四步,而前两个步骤主要就是依靠CPU 来完成。
而且,这还仅仅只就是3D图象的生成,还没有包括游戏中复杂的AI运算。
场景切换运算等等……无疑,这些元素还需要CPU去完成,这就就是为什么在运行大型3D的时候,当场景切换时再强劲的显卡都会出现停顿的现象。
3D芯片的处理对象就是多边形表示的物体。
用多边形表示物体有两个优点:首先就是直接(尽管繁琐),多边形表示的物体其表面的分段线性特征除轮廓外可以通过明暗处理(shading)技术消除;其次就是仅存储多边形顶点的几何信息,多边形内部每个象素的明暗颜色计算所需的信息由这些顶点信息插值而来,这正就是易于用图形硬件支持的快速明暗处理技术。
支持多边形绘制的图形硬件同样也可以绘制由双三次曲面片表示的物体,通过对这种物体的表面进行三角剖分,用逼近的三角形网格代替原物体的曲面表示就可以做到这一点。
当然,用多边形表示物体也有其缺点,如增加了纹理映射与阴影生成的难度,当需要详细表示复杂物体时所需的三角形数量将变得非常庞大。
将多边形表示的物体显示到计算机屏幕上,这一过程涉及物体在计算机内部的表示方式即物体的数据结构,由物体组成的场景的组织结构,物体从场景到屏幕空间要经过的一系列变换,以及产生最终屏幕图象要经过的一系列光栅化处理。
这些方面都涉及到特定的处理算法,相应的算法又有许多不同的变种。
下面仅就3D芯片涉及的图形处理过程及相关算法做一简单分析介绍,这些就是理解3D图形处理及图形硬件的基础。
一、3D物体的表示法具有复杂外形的物体其表面可以由多边形面片来近似表示。
以图1的圆柱为例,其柱面可以由2N个三角形近似,其两端可以由两个N边形来近似。
多边形模型在其轮廓上的分段线性特征就是这一表示法主要的视觉缺陷,改进的唯一途径就是增加多边形的分辨率。
对于一个复杂形体来说,为了充分表示其细节,常常要用到十万个以上的多边形。
高级计算机图形学原理与实践智慧树知到课后章节答案2023年下西安科技大学第一章测试1.计算机图形学与计算几何之间的关系是( ) A:计算几何是计算机图形学的前身 B:两门毫不相干的学科 C:学术上的同义词 D:计算机图形学以计算几何为理论基础答案:计算机图形学以计算几何为理论基础2.Edwin Catmull首次提出了计算机图形学的概念。
()A:错 B:对答案:错3.计算机辅助设计与制造(CAD/CAM)的代表软件有哪些?()A:3D MaxB:Maya C:AutoCAD D:Unity 答案:3D Max;AutoCAD4.虚拟现实不属于计算机图形学的应用领域。
()A:错 B:对答案:错5.计算机图形显示器一般使用什么颜色模型?( ) A:RGB B:HLS C:CMY D:HSV 答案:RGB6.RGB三基色通过适当的混合能产生所有颜色。
()A:错 B:对答案:对第二章测试1.下面哪些方法可以减轻走样现象()。
A:非加权区域采样 B:降低空间分辨率 C:提高空间分辨率 D:加权区域采样答案:非加权区域采样 ;提高空间分辨率 ;加权区域采样2.利用数值微分算法进行直线的扫描转换不需要进行浮点数的加减法。
()A:对 B:错答案:错3.Brenham算法进行直线绘制, x为主方向,当中点误差项d>0时,y方向上应不走步。
()A:错 B:对答案:错4.走样是光栅扫描器的一种固有属性,不可避免,只能减轻。
()A:错 B:对答案:对5.有效边表算法中每一条扫描线交点的个数只能是偶数。
()A:错 B:对答案:对第三章测试1.n次B样条曲线中,更改一个控制顶点,最多影响()段曲线。
A:n+1 B:nC:1 D:所有答案:n+12.下面哪些性质是NURBS曲面不具备的()。
A:仿射变换不变性 B:局部修改性 C:凸包性 D:变差缩减小答案:变差缩减小3.曲线的插值拟合方法通过每个型值点。
()A:对 B:错答案:对4.B样条曲线曲面都可以精确的表示二次曲线弧或曲面。
Z-buffer算法1、Z缓冲区(Z-Buffer)算法1973年,犹他⼤学学⽣艾德·卡姆尔(Edwin Catmull)独⽴开发出了能跟踪屏幕上每个像素深度的算法 Z-buffer Z-buffer让计算机⽣成复杂图形成为可能。
Ed Catmull⽬前担任迪⼠尼动画和⽪克斯动画⼯作室的总裁Z缓冲器算法也叫深度缓冲器算法,属于图像空间消隐算法该算法有帧缓冲器和深度缓冲器。
对应两个数组:intensity(x,y)——属性数组(帧缓冲器)存储图像空间每个可见像素的光强或颜⾊depth(x,y)——深度数组(z-buffer)存放图像空间每个可见像素的z坐标假定xoy⾯为投影⾯,z轴为观察⽅向过屏幕上任意像素点(x,y)作平⾏于z轴的射线R,与物体表⾯相交于p1和p 2 点p1和p 2点的z值称为该点的深度值z-buffer算法⽐较p1和p 2的z值,将最⼤的z值存⼊z缓冲器中显然,p1在p 2前⾯,屏幕上(x,y)这⼀点将显⽰p1点的颜⾊算法思想:先将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算法的优点:(1)Z-Buffer算法⽐较简单,也很直观(2)在象素级上以近物取代远物。
与物体在屏幕上的出现顺序是⽆关紧要的,有利于硬件实现z-Buffer算法的缺点:(1)占⽤空间⼤(2)没有利⽤图形的相关性与连续性,这是z-buffer算法的严重缺陷(3)更为严重的是,该算法是在像素级上的消隐算法2、只⽤⼀个深度缓存变量zb的改进算法⼀般认为,z-Buffer算法需要开⼀个与图象⼤⼩相等的缓存数组ZB,实际上,可以改进算法,只⽤⼀个深度缓存变量zb z-Buffer算法(){ 帧缓存全置为背景⾊for(屏幕上的每个象素(i,j)){ 深度缓存变量zb置最⼩值MinValuefor(多⾯体上的每个多边形Pk){if(象素点(i,j)在pk的投影多边形之内){计算Pk在(i,j)处的深度值depth;if(depth⼤于zb){ zb = depth;indexp = k;(记录多边形的序号)}}}If(zb != MinValue) 计算多边形Pindexp在交点 (I,j) 处的光照颜⾊并显⽰}}关键问题:判断象素点(i,j)是否在pk的投影多边形之内,不是⼀件容易的事。
Zbuffer算法思想一目标:1。
完成扫描线算法Zbuffer2。
完成利用Zbuffer完成Ground模型3。
完成透明效果。
二扫描线Zbuffer数据结构Zbuffer[x,y]每个点所需记录的内容:trueBuffer; //记录BUFFER中每点点所属的“体”zBuffer; //记录每个点的深度faceBuffer; //在光线跟踪时记录每个点所属面的号码,平时与truebuffer构成双//缓存加速算法lightBuffer[3]; //记录每个点的光强,记录RGBbakBuffer[3]; //记录光强的备用构成双缓存,记录RGBtransparentBuffer[3]; //透明光强,记录RGBaBuffer; //透明加权因子buffer 1,不透明,0完全透明扫描行类CheckLine记录的内容:float left_x; //左边界X值float left_dx; //每扫下一行X增加值int left_y; //本条线段还剩多少行要扫float right_x; //右边界X值float right_dx; //每扫下一行X增加值int right_y; //本条线段还剩多少行要扫float start_z; //START点处的Z深度float now_z; //目前的Z深度double delta_zx; //横扫一各Z递增值double delta_zy; //扫下一行Z递增值float left_light; //记录扫描线左面的光强float right_light; //记录扫描线右面的光强float delta_light; //横扫一各光强改变值float left_light_dy; //记录Y每增加1,光强的增加值float right_light_dy;float now_light; //目前的光强值总体所存的内容:leftLine; //目前在扫描的左端的线的序号rightLine; //目前在扫描的左端的线的序号xlimit; //场景的X裁减窗口大小ylimit; //场景的Y裁减窗口大小tpValue; //目前在扫描的面的透明度三扫描线Zbuffer基本算法预处理:对每个体中每个面计算每个顶点在场景中对应的X,Y和Z深度;根据已有关系创建直线,这些直线都以Y小的一端为首点;计算直线的Y轴范围(dy)和Y增加时X的改变值(dx);根据已有关系生成面;计算平面方程,确定dzx,dzy;根据已算出的线段,确定起始点和最小扫描线minY,和最大扫描线maxY。
计算机图形学课程设计课程设计球体Phong光照模型一、实验目的(1)掌握双线性法矢插值模型;(2)掌握ZBuffer算法的思想;(3)掌握有效边表填充算法;二、实验要求1、建立三维坐标系Oxyz,原点位于屏幕客户区中心,x轴水平向右为正,y轴垂直向上为正,z轴垂直于屏幕指向观察者。
2、绘制体心和坐标系中心重合的球体表面,使用Z-Buffer消隐算法进行消隐。
3、使用单点光源对球体进行照射生成Phong光照模型,光源位置位于球体右上方。
4、背景色设置为RGB(128,0,0)。
5、使用键盘方向键旋转球体。
6、使用鼠标左击缩小球体、右击增大球体。
三、实验步骤建立球体的网格模型,使用地理划分法将球体北极和南极划分为三角形面片,其余部分划分为四边形面片,先对球体网格模型进行背面剔除,然后使用深度缓冲算法进行消隐。
计算面片各顶点的平均法矢量,然后采用双线性法失插值计算面片内各点的法矢量。
最终根据每点的法矢量对光源的朝向,通过简单光照模型计算所获得的光强。
面片使用有效边表算法填1、Phong双线性法矢插值模型Gouraud双线性光强插值模型解决了相邻多边形之间的颜色突变问题,产生的真实感图形颜色过渡均匀,图形显得非常光滑,这是它的优点,但是,由于采用光强插值,其镜面反射光效果不太理想,而且相邻多边形边界处的马赫带效应并不能完全消除。
Phong 模型提出的双线性法矢插值模型可以有效的解决上述问题,产生正确的高光区域。
Phong 模型在进行光强插值的时候,需要先对面片的每一个顶点计算平均法矢量,然后通过双线性法矢插值计算面片内每个点的法矢量,最后根据简单光照模型计算面片上各点的颜色值。
基本算法如下。
(1)计算面片顶点的平均法矢量。
∑∑===ni ini iNN N 11由于球心位于三维坐标系原点,所以球面上任意面片的顶点平均法矢量就是该点的位置矢量。
(2)计算面片内部各点的法矢量。
在图中,三角形面片的顶点坐标为),(000y x P ,法矢量为0N ;),,(111y x P 法矢量是1N ;。
计算机图形学编程练习7:Z-buffering算法实现Z-buffering算法1974年,E. Catmull在其博士学位论文中提出了Z-buffering算法,目前已成为使用最广泛的隐藏面消除算法,其特点:易于通过软件或硬件实现,与图形的绘制流水线结构兼容等。
Z-buffering是帧缓冲器,用来存储图像空间中每一个可见像素相应的深度或z坐标,是一个独立的深度缓冲器。
计算准备写入帧缓冲器像素的深度值即z值,并与已存储在Z-buffer中该像素的原深度比较。
如果新像素位于帧缓冲器上原像素的前面,则将新像素写入帧缓冲区,同时Z-buffer缓冲器用新的z值更新。
否则,不写入也不更新。
算法的实质是对一个给定的x、y,查找最大的z(x,y)值。
本次练习,要求用扫描线填充算法以及Z-buffering算法来绘制多边形,实现隐藏面消除。
具体的算法参见:7.11.3以及7.11.5节,或者更为详细的《计算机图形学的算法基础》中4.15 扫描线Z缓冲器算法。
场景数据:空间中有一个矩形,其顶点坐标为P1(10, 5, 10),P2(10, 25, 10),P3(25, 25, 10),P4(25, 5, 10),颜色为(0, 0, 255),另有一个三角形,其顶点坐标为P5(15, 15, 15),P6(25, 25, 5),P7(30, 10, 5),颜色为(255, 0, 0)。
三角形从后面贯穿矩形,如下左图所示。
要求用640 x 480的图像分辨率显示,使用深度为32位的Z-buffer,即Z-buffer为640 x 480 x 32位平面。
视点在z轴正向无穷远处,平行投影,投影平面为z = 50,视景体为(0, 40, 0, 35, 0, 40)。
图1:a) 三维视图;b) 二维投影;作业要求●本次练习的主要学习目标:▪学习使用MFC编程(包括简单的GDI编程,最后图像利用CDC::SetPixel绘制);▪学习扫描线填充算法;▪学习Z-buffering算法;注意:●若遇到画图闪烁,可采用double buffer技术解决,参见memdc.h.●若想在MFC框架下查看printf, cout输出信息,可使用ConsoleDebug.cpp.如何学习MFC窗口编程?MFC窗口编程的书籍有很多,所有的书籍都是方方面面(如窗口、菜单、工具栏、多窗口、多线程….)都介绍。
计算机图形学与虚拟现实一、引言计算机图形学是计算机科学的一个重要分支,它研究如何利用计算机生成、处理和显示图像。
而虚拟现实则是一种通过计算机生成的仿真环境,使用户能够沉浸其中并与虚拟环境进行交互。
本文将介绍计算机图形学和虚拟现实的基本概念、原理以及应用。
二、计算机图形学1. 基本概念计算机图形学是研究如何生成、处理和显示图像的科学和技术。
它涉及到图像的表示、变换、渲染等方面。
•图像表示:图像可以通过点阵、向量、多边形等形式来表示。
常见的图像表示方法有光栅图、向量图等。
•图像变换:图像变换可以对图像进行平移、旋转、缩放等操作。
变换通常使用矩阵运算来实现。
•图像渲染:图像渲染是将图像转化为具有真实感的图像的过程。
常见的渲染技术有光线追踪、着色等。
2. 图形学算法计算机图形学中常用的算法有:•Bresenham算法:用于直线和圆的绘制。
•DDA算法:用于直线的绘制。
•Foley-So.cgansky算法:用于多边形的裁剪。
•Z-buffer算法:用于隐藏面消除。
3. 图形学应用计算机图形学在许多领域都有应用,包括电影、游戏、虚拟现实等。
它可以用来生成逼真的图像、模拟物理效果、实现计算机动画等。
在电影制作中,计算机图形学被广泛应用于特效的生成。
通过计算机图形学技术,电影制作团队可以实现一些在现实中无法实现的特效场景,例如变身、爆炸等。
在游戏开发中,计算机图形学用于生成游戏场景、角色模型等。
通过计算机图形学技术,游戏开发者可以创建出逼真的游戏画面和动画效果,提供更好的游戏体验。
三、虚拟现实1. 基本概念虚拟现实是通过计算机生成的仿真环境,使用户能够沉浸其中并与虚拟环境进行交互。
虚拟现实通常通过头戴式显示器、手柄等设备来实现用户与虚拟环境的交互。
虚拟现实可以模拟现实世界中的场景、物体和行为,用户可以在虚拟环境中进行互动。
通过虚拟现实技术,用户可以体验到身临其境的感觉,例如在虚拟世界中参观博物馆、进行游戏等。
1.用于减少或克服在“光栅图形显示器上绘制直线、多边形等连续图形时,由离散量表示连续量引起的失真”技术叫(反走样),常用方法有(提高分辨率方法),(非加权区域采样),(加权区域采样)。
2.三维对象建模类型分为(线框模型),(表面模型),(实体模型)3.阴极管(CRT)的(聚焦系统)通过电场和磁场控制“交细….”保证…..提高分辨率。
5.圆的中点生成算法中,通常把圆分为(八)个部分。
假定当前取点为(Xi,Yi),那么下一点只能是正右方的A(Xi+1,Yi)或右下方B (Xi+1,Yi‐1)设M为中点,F(M)<0.取(正右)方。
7.在光栅显示器上显示任何一种图形,实际上都是一些具有一种或多种颜色的像素集合,确立最佳逼近的像素集合,并用指定属性写像素的过程称为(光栅化)。
8.消隐算法根据算法实现时所在的坐标系或空间进行分类,可分为(物体空间的消隐算法)(图像空间的消隐算法)(物体空间和图像空间的消隐算法)三类。
9.增量算法的目的是:(加快扫描转换)。
11.纹理是物体表面的细小结构,根据纹理的表现形式可分为(图像纹理)(几何纹理)(过程纹理)三类。
12.凹凸纹理是通过对(物体的表面几何性质)进行扰动来产生凹凸不平的视觉效果。
13.penGL的工作方式是一种(状态机制),可以进行各种状态或技术设置。
14.画家算法原理是先把屏幕置成背景色,再把物体的各个面按其离视点远近进行排序,远者在表头近者在表尾,构成一张(深度优先)表。
1.光栅显示系统的优点是刷新率一定与图形的复杂度无关,但会产生走样。
(对)2.若要对某点进行比例、旋转交换、首先需要把坐标原点平移至该点,在新的坐标下作比例或旋转变换,然后将原点平移回去。
(错)3.光线跟踪算法与光传播方向是相同的,是视线跟踪。
(错)4.将线段两端的分区编码的逐位取逻辑“与”,若结果为零,则该线相对于裁剪窗口必为完全不见。
(错)5.Phong 明暗处理算法先计算出曲面在各多边形顶点处的光强,然后再采用双曲线插值法确定在扫描线上每个像素处的光强值,得到多边形的光滑颜色分布。
实验六 9-7一、实验题目z-buffer 算法的代表性案例是绘制三个相互交叉的红绿蓝条,如图9-85所示,请使用MFC 编程实现。
二、实验思想Z-Buffer 算法建立两个缓冲器:深度缓冲器,用以存储图像空间中每一像素相应的深度值,初始化为最大深度值(z s 坐标)。
帧缓冲器,用以存储图像空间中的每个像素的颜色,初始化为屏幕的背景色。
① 帧缓冲器初始值置为背景色。
② 确定深度缓冲器的宽度、高度和初始深度。
一般将初始深度置为最大深度值。
③ 对于多边形表面中的每一像素(x s ,y s ),计算其深度值z s (x s ,y s )。
④ 将z s (x s ,y s )与存储在z 缓冲器中该位置的深度值zBuffer (x s ,y s )进行比较。
⑤ 如果z s (x s ,y s )≤zBuffer (x s ,y s ),则将此像素的颜色写入帧缓冲器,且用z (x s ,y s )重置zbuffer (x s ,y s )。
三、实验代码CZBuffer::~CZBuffer(){delete []P;}void CZBuffer::SetPoint(CPi3 p[],int m){P=new CPi3[m];for(int i=0;i<m;i++){P[i]=p[i];}PNum=m;}void CZBuffer::CreateBucket()//创建桶表{int yMin,yMax;yMin=yMax=P[0].y;for(int i=0;i<PNum;i++)//查找多边形所覆盖的最小和最大扫描线{if(P[i].y<yMin){yMin=P[i].y;//扫描线的最小值}if(P[i].y>yMax){yMax=P[i].y;//扫描线的最大值}}for(int y=yMin;y<=yMax;y++){if(yMin==y)//建立桶头结点{HeadB=new CBucket;//建立桶的头结点CurrentB=HeadB;//CurrentB为CBucket当前结点指针CurrentB->ScanLine=yMin;CurrentB->pET=NULL;//没有连接边链表CurrentB->next=NULL;}else//建立桶的其它结点{CurrentB->next=new CBucket;CurrentB=CurrentB->next;CurrentB->ScanLine=y;CurrentB->pET=NULL;CurrentB->next=NULL;}}}void CZBuffer::CreateEdge()//创建边表{for(int i=0;i<PNum;i++){CurrentB=HeadB;int j=(i+1)%PNum;//边的第二个顶点,P[i]和P[j]构成边if(P[i].y<P[j].y)//边的终点比起点高{Edge=new CAET;Edge->x=P[i].x;//计算ET表的值Edge->yMax=P[j].y;Edge->k=(P[j].x-P[i].x)/(P[j].y-P[i].y);//代表1/kEdge->pb=P[i];//绑定顶点和颜色Edge->pe=P[j];Edge->next=NULL;while(CurrentB->ScanLine!=P[i].y)//在桶内寻找该边的yMin{CurrentB=CurrentB->next;//移到yMin所在的桶结点}}if(P[j].y<P[i].y)//边的终点比起点低{Edge=new CAET;Edge->x=P[j].x;Edge->yMax=P[i].y;Edge->k=(P[i].x-P[j].x)/(P[i].y-P[j].y);Edge->pb=P[i];Edge->pe=P[j];Edge->next=NULL;while(CurrentB->ScanLine!=P[j].y){CurrentB=CurrentB->next;}}if(int(P[j].y)!=P[i].y){CurrentE=CurrentB->pET;if(CurrentE==NULL){CurrentE=Edge;CurrentB->pET=CurrentE;}else{while(CurrentE->next!=NULL){CurrentE=CurrentE->next;}CurrentE->next=Edge;}}}}void CZBuffer::Gouraud(CDC *pDC)//填充多边形{double CurDeep=0.0;//当前扫描线的深度double DeepStep=0.0;//当前扫描线随着x增长的深度步长double A,B,C,D;//平面方程Ax+By+Cz+D=0的系数CVector V21(P[1],P[2]),V10(P[0],P[1]);CVector VN=V21*V10;A=VN.X();B=VN.Y();C=VN.Z();D=-A*P[1].x-B*P[1].y-C*P[1].z;DeepStep=-A/C;//计算直线deep增量步长CAET *T1,*T2;HeadE=NULL;for(CurrentB=HeadB;CurrentB!=NULL;CurrentB=CurrentB->next){for(CurrentE=CurrentB->pET;CurrentE!=NULL;CurrentE=CurrentE->next) {Edge=new CAET;Edge->x=CurrentE->x;Edge->yMax=CurrentE->yMax;Edge->k=CurrentE->k;Edge->pb=CurrentE->pb;Edge->pe=CurrentE->pe;Edge->next=NULL;AddEt(Edge);}EtOrder();T1=HeadE;if(T1==NULL){return;}while(CurrentB->ScanLine>=T1->yMax)//下闭上开{T1=T1->next;HeadE=T1;if(HeadE==NULL)return;}if(T1->next!=NULL){T2=T1;T1=T2->next;}while(T1!=NULL){if(CurrentB->ScanLine>=T1->yMax)//下闭上开{T2->next=T1->next;T1=T2->next;}else{T2=T1;T1=T2->next;}}CRGB Ca,Cb,Cf;//Ca、Cb代边上任意点的颜色,Cf代表面上任意点的颜色Ca=Interpolation(CurrentB->ScanLine,HeadE->pb.y,HeadE->pe.y,HeadE->pb.c,He adE->pe.c);Cb=Interpolation(CurrentB->ScanLine,HeadE->next->pb.y,HeadE->next->pe.y,He adE->next->pb.c,HeadE->next->pe.c);BOOL Flag=FALSE;double xb,xe;//扫描线的起点和终点坐标for(T1=HeadE;T1!=NULL;T1=T1->next){if(Flag==FALSE){xb=T1->x;CurDeep=-(xb*A+CurrentB->ScanLine*B+D)/C;//z=-(Ax+By-D)/CFlag=TRUE;}else{xe=T1->x;for(double x=xb;x<xe;x++)//左闭右开{Cf=Interpolation(x,xb,xe,Ca,Cb);if(CurDeep>=ZB[ROUND(x)+Width/2][CurrentB->ScanLine+Height/2])//如果新采样点的深度大于原采样点的深度{ZB[ROUND(x)+Width/2][CurrentB->ScanLine+Height/2]=CurDeep;//xy坐标与数组下标保持一致pDC->SetPixel(ROUND(x),CurrentB->ScanLine,RGB(Cf.red*255,Cf.green*255,Cf.b lue*255));}CurDeep+=DeepStep;}Flag=FALSE;}}for(T1=HeadE;T1!=NULL;T1=T1->next)//边的连续性{T1->x=T1->x+T1->k;}}delete HeadB;delete HeadE;delete CurrentE;delete CurrentB;delete Edge;}void CZBuffer::AddEt(CAET *NewEdge)//合并ET表{CAET *CE;CE=HeadE;if(CE==NULL){HeadE=NewEdge;CE=HeadE;}else{while(CE->next!=NULL){CE=CE->next;}CE->next=NewEdge;}}void CZBuffer::EtOrder()//边表的冒泡排序算法{CAET *T1,*T2;int Count=1;T1=HeadE;if(T1==NULL){return;}if(T1->next==NULL)//如果该ET表没有再连ET表{return;//桶结点只有一条边,不需要排序}while(T1->next!=NULL)//统计结点的个数{Count++;T1=T1->next;}for(int i=1;i<Count;i++)//冒泡排序{T1=HeadE;if(T1->x>T1->next->x)//按x由小到大排序{T2=T1->next;T1->next=T1->next->next;T2->next=T1;HeadE=T2;}else{if(T1->x==T1->next->x){if(T1->k>T1->next->k)//按斜率由小到大排序{T2=T1->next;T1->next=T1->next->next;T2->next=T1;HeadE=T2;}}}T1=HeadE;while(T1->next->next!=NULL){T2=T1;T1=T1->next;if(T1->x>T1->next->x)//按x由小到大排序{T2->next=T1->next;T1->next=T1->next->next;T2->next->next=T1;T1=T2->next;}else{if(T1->x==T1->next->x){if(T1->k>T1->next->k)//按斜率由小到大排序{T2->next=T1->next;T1->next=T1->next->next;T2->next->next=T1;T1=T2->next;}}}}}}CRGB CZBuffer::Interpolation(double t,double t1,double t2,CRGB c1,CRGB c2)//线性插值{CRGB c;c=(t-t2)/(t1-t2)*c1+(t-t1)/(t2-t1)*c2;return c;}void CZBuffer::InitDeepBuffer(int width,int height,double depth)//初始化深度缓冲{Width=width,Height=height;ZB=new double *[Width];for(int i=0;i<Width;i++)ZB[i]=new double[Height];for(i=0;i<Width;i++)//初始化深度缓冲for(int j=0;j<Height;j++)ZB[i][j]=double(depth);}四、程序结果截图。