计算机图形学实验zbuffer算法

合集下载

有关脏矩形与Z-Buffer

有关脏矩形与Z-Buffer

有关脏矩形与Z-Buffer近⽇上⽹查资料,看到⼀篇有关脏矩形与Z-Buffer的⽂章。

但是不明⽩⽂章结尾的DX对于Z-Buffer的渲染优化。

原⽂如下:脏矩形与Z-Buffer,写游戏的朋友们⼀定要来看看上次看过云风的《我的编程感悟》,读到⾥⾯的脏矩形优化的时候,⼀直不明⽩云风为什么说要使⽤逆向的画家算法。

我先解释⼀下画家算法,懂的可以跳过下⾯段落画家算法,顾名思义,就是像画家作画的顺序⼀样,由远⾄近的绘制物体,先画远处的,再逐步画近处的,近处的东西画上去后将远处的东西覆盖掉,然后绘制完成的画就成为了覆盖顺序正确的⼀幅完美的图画。

这就是所谓的画家算法,其实也就是阐述了⼀个绘制顺序问题,由远⾄近的绘制。

我相信所有的朋友在制作游戏的前期,⼀直是在使⽤着画家算法来绘制图像的,在制作屏幕显⽰单位不多的情况下,画家算法可以胜任⼤部分的⼩游戏的要求。

但是到了⼤型MMORPG中,如果单纯的使⽤画家算法,就不能应付N个玩家在⼀个屏幕上的情况了,那可能会FPS急剧下降,到不可想象的地步。

这时候,就必须使⽤脏矩形优化了。

再讲解⼀下脏矩形,懂的朋友⼀样可以跳过:脏矩形,就是说,在屏幕上的单位,如果某些部分被更新了,那么这个部分就脏了,那么在这个脏矩形范围内的东西将都被更新。

也就是说有选择的更新,⽽不是每次都画全屏的东西。

这样的优化可以让程序的速度提升很多,这便是很多游戏中使⽤的著名的“脏矩形”算法我再讲⼀下Z-Buffer,懂的朋友跳过:Z-Buffer,被称为深度缓冲,听起来很深奥的,实际上很简单,就是对象在屏幕上的远近,值越⼤就越远,⼀般情况下Z-Buffer是⼀个float(浮点)值,范围在0.0-1.0范围内。

Z值⼩的东西将被绘制在前⾯,Z值⼤的东西将被绘制在后⾯。

⽐如,两个图⽚,A,B,A的Z为0.1,B为0.2,则A将覆盖B。

有了Z-Buffer,问题就变得好解决多了,DirectX在判断ZBuffer的时候,会⾃动忽略不需要绘制的点。

计算机图形学第五次实验报告

计算机图形学第五次实验报告

《计算机图形学》实验报告实验十一真实感图形一、实验教学目标与基本要求初步实现真实感图形, 并实践图形的造型与变换等。

二、理论基础运用几何造型, 几何、投影及透视变换、真实感图形效果(消隐、纹理、光照等)有关知识实现。

1.用给定地形高程数据绘制出地形图;2.绘制一(套)房间,参数自定。

三. 算法设计与分析真实感图形绘制过程中, 由于投影变换失去了深度信息, 往往导致图形的二义性。

要消除这类二义性, 就必须在绘制时消除被遮挡的不可见的线或面, 习惯上称之为消除隐藏线和隐藏面, 或简称为消隐, 经过消隐得到的投影图称为物体的真实图形。

消隐处理是计算机绘图中一个引人注目的问题, 目前已提出多种算法, 基本上可以分为两大类:即物体空间方法和图象空间方法。

物体空间方法是通过比较物体和物体的相对关系来决定可见与不可见的;而图象空间方法则是根据在图象象素点上各投影点之间的关系来确定可见与否的。

用这两类方法就可以消除凸型模型、凹形模型和多个模型同时存在时的隐藏面。

1).消隐算法的实现1.物体空间的消隐算法物体空间法是在三维坐标系中, 通过分析物体模型间的几何关系, 如物体的几何位置、与观察点的相对位置等, 来进行隐藏面判断的消隐算法。

世界坐标系是描述物体的原始坐标系, 物体的世界坐标描述了物体的基本形状。

为了更好地观察和描述物体, 经常需要对其世界坐标进行平移和旋转, 而得到物体的观察坐标。

物体的观察坐标能得到描述物体的更好视角, 所以物体空间法通常都是在观察坐标系中进行的。

观察坐标系的原点一般即是观察点。

物体空间法消隐包括两个基本步骤, 即三维坐标变换和选取适当的隐藏面判断算法。

选择合适的观察坐标系不但可以更好地描述物体, 而且可以大大简化和降低消隐算法的运算。

因此, 利用物体空间法进行消隐的第一步往往是将物体所处的坐标系转换为适当的观察坐标系。

这需要对物体进行三维旋转和平移变换。

常用的物体空间消隐算法包括平面公式法、径向预排序法、径向排序法、隔离平面法、深度排序法、光线投射法和区域子分法。

06-消隐

06-消隐

点与多边形的包含性检测: (1)射线法
P P1 P2 P3 P P1 P2
由被测点P处向 y = - 方向作射线 交点个数是奇数,则被测点在多边形内部。否则,偶数 表示在多边形外部。
若射线正好经过多边形的顶点 ,则采用“左开右闭”的原则来 实现。即:当射线与某条边的顶 点相交时,若边在射线的左侧, 交点有效,计数;若边在射线的 右侧,交点无效,不计数。 用射线法来判断一个点是否 在多边形内一是计算量大,二 是不稳定。原因是射线在经过 多边形顶点时,由于计算机本 身的误差(也许多了0.00001), 把本该无效的交点变成有效的 交点了。所以这种算法是不稳 定的。
上图所画的仅仅是一个简单的立方体,如果一个物体是由多 个形体所组成的,或者整个三维场景是由多个物体构成的,情 况就更为复杂了。 因此,要绘制出意义明确的、富有真实感的立体图形,首 先必须消去形体中的不可见部分,而只在图形中表现可见部 分。这就要去寻求解决显示三维物体的图形中消去不可见部 分的方法,也就是所谓的“消隐”问题。消隐包括消除“隐 藏线”和“隐藏面”两个问题。
消 隐
三维物体的显示和真实感图形是当今计算机图形学研究的 一个焦点。在二维显示设备上显示三维图像, 必须对三维图像 进行消隐处理, 通过消隐处理的物体才能很好的表现三维立体 效果, 但是这种物体明显缺乏真实感, 还需要对物体进行真实 感的处理, 这样才能逼真的显示物体。
主要讲述的内容:
消隐的分类,如何消除隐藏线、隐藏面,主要介绍以 下几个算法:
Z-Buffer算法() { 帧缓存全臵为背景色
深度缓存全臵为最小Z值(比如赋一个10-8次方)
for(每一个多边形)
{扫描转换该多边形
for(该多边形所覆盖的每个象素(x,y) )

图像空间消隐:z缓冲器(z-buffer)算法

图像空间消隐:z缓冲器(z-buffer)算法
如果z(x, y) > zbuffer(x, y),那么
计算该像素(x, y)的光亮值属性并写入帧缓冲器 更新z缓冲器 zbuffer(x, y)=z(x, y)
5
z缓冲器的其它应用
阴影算法:以光源为 视点的z缓冲器
6
z缓冲器的其它应用
rgb和z缓冲器相结合,实现图像的合成
7
z缓冲器算法分析
优点
算法复杂度(O(nN)):对于给定的图像空间,N是固定的,所 以算法复杂度只会随着场景的复杂度线性地增加
无须排序:场景中的物体是按任意顺序写入帧缓冲器和z缓冲 器的,无须对物体进行排序,从而节省了排序的时间
适合于任何几何物体:能够计算与直线交点 适合于并行实现(硬件加速)算法
z (深度)缓冲器算法属于图像空间算法 z缓冲器是帧缓冲器的推广
帧缓冲器:存储的是像素的颜色属性 z缓冲器:存储的是对应像素的z值
假设在视点坐标系(oxyz)中,投影平面为z=0,视线方向沿(-z)轴方向, 投影为平行投影
深度值就是物体沿着视线(-z)方向、与视点的距离 离视点近的物体遮挡离视点远的物体:z值越大,离视点越近
2
z缓冲器算法
投影变换示意图
3
颜色与深度缓冲举例
颜色缓冲
深度缓冲
4
z缓冲器算法描述
(1) 帧缓冲器中的颜色置为背景颜色 (2) z缓冲器中的z值置成最小值(离视点最远) (3) 以任意顺序扫描各多边形
a) 对于多边形中的每一像素,计算其深度值z(x,y) b) 比较z(x, y)与z缓冲器中已有的值zbuffer(x,y)
不足
z缓冲器需要占用大量的存储单元
一个大规模复杂场景中:深度范围可能为106,一个 像素需要24bit来存储其深度信息。如果显示分辨率 为1280×1024,那么深度缓冲器需要4MB存储空间

计算机图形学课程设计-Z-Buffer隐面算法的实现

计算机图形学课程设计-Z-Buffer隐面算法的实现

枣庄学院信息科学与工程学院课程设计任务书题目:Z-Buffer隐面算法的实现姓名:秦云学号:201012110128专业班级:计算机科学与技术、2010级本1班课程:计算机图形学指导教师:燕孝飞职称:讲师完成时间:2012年12 月----2013年1 月枣庄学院信息科学与工程学院制2012年12 月30日课程设计任务书及成绩评定目录第1章引言 (1)第2章计算机图形学的发展历史 (2)2.1 智能CAD (2)2.2计算机美术与设计 (2)2.2.1 计算机美术的发展 (2)2.3计算机动画艺术 (3)2.3.1历史的回顾 (3)2.4科学计算可视化 (4)2.5虚拟现实 (4)第3章计算机图形学的研究方向 (6)第4章 Z-Buffer隐面算法的相关原理 (7)4.1 Z-Buffer隐面算法简介 (7)4.2 Z-Buffer隐面算法程序 (7)第5章系统设计的相关代码 (8)5.1坐标设置函数的相应代码 (8)5.2旋转角度函数相应代码 (8)5.3多边形填充 (9)第6章系统的运行效果 (12)6.1运行主界面 (12)6.2不同方向键的运行效果 (13)第7章总结 (16)第1章引言计算机图形学一个主要的目的就是要利用计算机产生令人赏心悦目的真实感图形。

为此,必须建立图形所描述的场景的几何表示,再用某种光照模型,计算在假想的光源、纹理、材质属性下的光照明效果。

所以计算机图形学与另一门学科计算机辅助设计有着密切的关系。

事实上,图形学也把可以表示几何场景的曲线曲面造型技术和实体造型技术作为其主要的研究内容。

同时,真实感图形计算的结果是以数字图像的方式提供的,计算机图形学也就和图像处理有着密切的关系。

真实感图形绘制过程中,由于投影变换失去了深度信息,往往导致图形的二义性。

要消除这类二义性,就必须在绘制时消除被遮挡的不可见的线或面,习惯上称之为消除隐藏线和隐藏面,或简称为消隐,经过消隐得到的投影图称为物体的真实图形。

图像空间的消隐算法Zbuffer扫描线

图像空间的消隐算法Zbuffer扫描线

3. 求直线与相应多边形的交。若无交点,转4。
否则,交点在线段内部或外部。若交点在线
段内部,交点将线段分成两段,与视点同侧
的一段不被遮挡,另一段在视点异侧,转4再
20判20/;4/2若交点在线段外部,转4。
7 / 41
第九章:真实感图形学
4. 求所剩线段(可能被遮挡部分)的投影与多边形边界投影 的所有交点,并根据交点在原直线参数方程中的参数 值求出Z值(即深度)。若无交点,转5。
2020/4/2
3 / 41
第九章:真实感图形学
• Southerland根据消隐空间的不同,将消隐算法分为三类:
1. 物体空间的消隐算法 (光线投射、Roberts)
将场景中每一个面与其他每个面比较,求出所有点、边、 面遮挡关系。
2. 图像空间的消隐算法 (Z-buffer、扫描线、warnock)
第九章:真实感图形学
➢ 9.1 消隐
➢真实图形在仿真模拟、几何造型、广告影视、指挥控制 和科学计算的可视化等许多领域有广泛应用。
➢用计算机生成三维物体的真实图形,是计算机图形学研 究的重要内容。
➢显示设备描述物体的图形时,必须把三维信息经过某种 投影变换,在二维的显示表面上绘制出来。由于投影变 换失去了深度信息,往往导致图形的二义性(如图9.1所 示)。要消除二义性,就必须在绘制时消除被遮挡的不可 见的线或面,称作消除隐藏线和隐藏面,或简称为消隐。 经过消隐得到的投影图称为物体的真实图形。
• 后向面总是看不见的,由于后向面的遮挡,别的棱成为 不可见-》可以把后向面去掉,并不影响消隐结果。
2020/4/2
11 / 41
第九章:真实感图形学
图 9.9 (a)前向面 (b)后向面

计算机图形学实验及课程设计

计算机图形学实验及课程设计

实验12 颜色渐变立方体
12.1 实验目的
掌握凸多面体消隐算法。 掌握双线性颜色插值算法。 建立基本三维场景。
实验12 颜色渐变立方体
12.2 实验要求


建立三维坐标系Oxyz,原点位于屏幕客户区中 心,x轴水平向右为正,y轴铅直向上为正,z轴 垂直于屏幕指向观察者。 以原点为体心绘制透视投影立方体,立方体8 个顶点的颜色分别为黑色、白色、红色、绿色、 蓝色、黄色、品红色和青色。背景色为黑色, 如图12-1所示。
实验4 二维几何变换
4.2 实验要求
使用静态切分视图,将窗口分为左右窗格。左窗格为继承于
CFormView类的表单视图类CLeftPortion,右窗格为一般视图
类CTestView。 左窗格提供代表“图形顶点数”(4、8、16和32)、“平移变 换”(x方向和y方向)、“旋转变换”(逆时针和顺时针)和 “比例变换”(放大和缩小)的滑动条,用于控制右窗格内的 图形变化。 右窗格内以屏幕客户区中心为图形的几何中心,绘制图形顶点 数从4变化为8、16和32的正多边形。为了表达图形的旋转,多
实验8 动态三视图
8.3 效果图
多面体动态三视图的效果如图8-1所示。
图8-1 多面体动态三视图的效果图
实验9 动态绘制Bezier曲线
9.1实验目的
掌握直线的参数表示法。 掌握德卡斯特里奥算法的几何意义。 掌握绘制二维Bezier曲线的方法。
实验9 动态绘制Bezier曲线
9.2 实验要求
实验8 动态三视图
8.1实验目的
掌握主视图变换矩阵。 掌握俯视图变换矩阵。 掌握侧视图变换矩阵。 掌握斜等测图绘制方法。
实验8 动态三视图

Zbuffer算法思想

Zbuffer算法思想

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光照模型课程设计报告

球体Phong光照模型课程设计报告

计算机图形学课程设计课程设计球体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 ;。

Z缓冲器算法和扫描线算法

Z缓冲器算法和扫描线算法

11
9 8
7


3
1
o
3
6 78
图 7.15 要消隐的物体
10 11 x
Z缓冲器算法和扫描线算法
• 建立一个边Y筒
–每个筒的深度和显示屏幕行数相同。
–根据边两端点较大的Y坐标值为决定放入边Y筒的相应行数。 –边Y筒中记录的每一条边要保存下列信息:
• 和该边在oxy平面上的投影相交的扫描线条数Δy, • 该投影和相邻的两条扫描线交点的x坐标的差Δx,(由上到下扫描) • 该边所属多边形的编号IP
• 建立一个多边形Y筒
– 每个筒的深度和显示屏幕行数相同。
– 根据多边形顶点Y坐标最大值来决定放入多边形Y筒的相应行数。 – 多边形Y筒要记录多边形所在平面方程ax+by+cz+d=0系数a,b,c和d, – 还要记录和该多边形在oxy平面上的投影相交的扫描线的条数Δy, – 以及多边形的属性colour和编号IP。
–一是和多边形Ⅰ在oxy平面上的投影相交的两条边 –另一是和多边形Ⅱ投影相交的两条边。
11
9 8
7


3
1
o
3
6 78
图 7.15 要消隐的物体
10 11 x
xl 4, xl 1, yl 3; xr 7, xr 0, yr 3; zl1 , zx1 , zy1 , IP1
xl
6
5 6
,
xl
这点的z坐标值和z缓冲器中相应单元内的值作
比较。
只有前者大于后者时才改变帧缓冲器的那一个单元的值,同时z缓冲器中相应 单元的值也要改成这点的z坐标值。 如果这点的z坐标值小于z缓冲器中相应单元的值,则说明对应象素已显示了 物体上一个点的属性,该点比要考虑的点更接近观察者。这样,无论帧缓冲 器或z缓冲器相应单元的值均不应改变。

zbuffer算法原理

zbuffer算法原理

zbuffer算法原理
zbuffer算法是一种用于3D图形渲染的技术,其原理是在场景中的每个像素上计算颜色,具体步骤如下:
1. 首先,将场景中的每个三角形进行光栅化,即将三角形转换为像素。

2. 对于每个像素,计算其深度z,即从观察者视点到该像素的距离。

3. 将该像素的深度z与zbuffer中的该像素位置处的值进行比较。

4. 如果该像素的深度z小于zbuffer中的深度值,则将该像素的颜色值存储在颜色缓冲区中,并将该像素的深度值存储在zbuffer 中。

5. 如果该像素的深度z大于或等于zbuffer中的深度值,则舍弃该像素,不进行渲染。

6. 最后,将颜色缓冲区中的像素值输出到屏幕上,完成渲染。

通过zbuffer算法,可以解决场景中不同物体之间的遮挡问题,同时也可以实现透明效果。

然而,这种算法需要消耗大量的计算资源,因此在实时渲染中需要进行优化。

- 1 -。

计算机图形学编程练习Z-buffering算法实现

计算机图形学编程练习Z-buffering算法实现

计算机图形学编程练习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窗口编程的书籍有很多,所有的书籍都是方方面面(如窗口、菜单、工具栏、多窗口、多线程….)都介绍。

计算机图形学必考知识点

计算机图形学必考知识点

Phong Lighting该模型计算效率高、与物理事实足够接近。

Phong模型利用4个向量计算表面任一点的颜色值,考虑了光线和材质之间的三种相互作用:环境光反射、漫反射和镜面反射。

Phong模型使用公式:I s=K s L s cosαΦα:高光系数。

计算方面的优势:把r和v归一化为单位向量,利用点积计算镜面反射分量:I s=K s L s max((r,v)α,0),还可增加距离衰减因子。

在Gouraud着色这种明暗绘制方法中,对公用一个顶点的多边形的法向量取平均值,把归一化的平均值定义为该顶点的法向量,Gouraud着色对顶点的明暗值进行插值。

Phong着色是在多边形内对法向量进行插值。

Phong着色要求把光照模型应用到每个片元上,也被称为片元的着色。

颜色模型RGB XYZ HSVRGB:RGB颜色模式已经成为现代图形系统的标准,使用RGB加色模型的RGB三原色系统中,红绿蓝图像在概念上有各自的缓存,每个像素都分别有三个分量。

任意色光F都可表示为F=r [ R ] + g [ G ] + b [ B ]。

RGB颜色立方体中沿着一个坐标轴方向的距离代表了颜色中相应原色的分量,原点(黑)到体对角线顶点(白)为不同亮度的灰色XYZ:在RGB 系统基础上,改用三个假想的原色X、Y、Z建立了一个新的色度系统, 将它匹配等能光谱的三刺激值,该系统称为视场XYZ色度系统,在XYZ空间中不能直观地评价颜色。

HSV是一种将RGB中的点在圆柱坐标系中的表示法,H色相S饱和度V明度,中心轴为灰色底黑顶白,绕轴角度为H,到该轴距离为S,沿轴高度为S。

RGB优点:笛卡尔坐标系,线性,基于硬件(易转换),基于三刺激值,缺点:难以指定命名颜色,不能覆盖所有颜色范围,不一致。

HSV优点:易于转换成RGB,直观指定颜色,’缺点:非线性,不能覆盖所有颜色范围,不一致XYZ:覆盖所有颜色范围,基于人眼的三刺激值,线性,包含所有空间,缺点:不一致交互式计算机程序员模型(应用模型<->应用程序<->图形库)->(图形系统<->显示屏).应用程序和图形系统之间的接口可以通过图形库的一组函数来指定,这和接口的规范称为应用程序编程人员接口(API),软件驱动程序负责解释API的输出并把这些数据转换为能被特定硬件识别的形式。

计算机图形学实验z-buffer算法,DOC

计算机图形学实验z-buffer算法,DOC

实验六9-7一、实验题目z-buffer算法的代表性案例是绘制三个相互交叉的红绿蓝条,如图9-85所示,请使用MFC编程实现。

⑤如果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;}voidCZBuffer::SetPoint(CPi3p[],intm) {P=newCPi3[m];if(P[i].y<yMin){yMin=P[i].y;//扫描线的最小值}if(P[i].y>yMax){yMax=P[i].y;//扫描线的最大值}}for(inty=yMin;y<=yMax;y++)CurrentB=CurrentB->next;CurrentB->ScanLine=y;CurrentB->pET=NULL;CurrentB->next=NULL;}}}voidCZBuffer::CreateEdge()//创建边表{for(inti=0;i<PNum;i++)while(CurrentB->ScanLine!=P[i].y)//在桶内寻找该边的yMin{CurrentB=CurrentB->next;//移到yMin所在的桶结点}}if(P[j].y<P[i].y)//边的终点比起点低{Edge=newCAET;{CurrentE=CurrentB->pET;if(CurrentE==NULL){CurrentE=Edge;CurrentB->pET=CurrentE;}else{while(CurrentE->next!=NULL)double A,B,C,D;//平面方程Ax+By+Cz+D=0的系数CVectorV21(P[1],P[2]),V10(P[0],P[1]); CVectorVN=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)AddEt(Edge);}EtOrder();T1=HeadE;if(T1==NULL){return;}while(CurrentB->ScanLine>=T1->yMax)//下闭上开{if(CurrentB->ScanLine>=T1->yMax)//下闭上开{T2->next=T1->next;T1=T2->next;}else{T2=T1;T1=T2->next;}{if(Flag==FALSE){xb=T1->x;CurDeep=-(xb*A+CurrentB->ScanLine*B+D)/C;//z=-(Ax+By -D)/CFlag=TRUE;}rDeep;//xy坐标与数组下标保持一致pDC->SetPixel(ROUND(x),CurrentB->ScanLine,RGB(Cf.red* 255,Cf.green*255,Cf.blue*255));}CurDeep+=DeepStep;}Flag=FALSE;}}{CAET*CE;CE=HeadE;if(CE==NULL){HeadE=NewEdge;CE=HeadE;}else{if(T1==NULL){return;}if(T1->next==NULL)//如果该ET表没有再连ET表{return;//桶结点只有一条边,不需要排序}while(T1->next!=NULL)//统计结点的个数{}else{if(T1->x==T1->next->x){if(T1->k>T1->next->k)//按斜率由小到大排序{T2=T1->next;T1->next=T1->next->next;T2->next=T1;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)//按斜率由小到大排序{{CRGBc;c=(t-t2)/(t1-t2)*c1+(t-t1)/(t2-t1)*c2;returnc;}voidCZBuffer::InitDeepBuffer(intwidth,intheight,doubledepth) //初始化深度缓冲{Width=width,Height=height;ZB=newdouble*[Width];。

计算机图形学 第7章消隐 - 课程教学辅导资料

计算机图形学 第7章消隐 - 课程教学辅导资料
计算机图形学
扫描线Z-buffer算法

改进之一:将窗口分割成扫描线

Z缓冲器的单元数只要等于一条扫描线内像素的个数就可以了。
计算机图形学
扫描线Z-buffer算法

改进之一:将窗口分割成扫描线

Z缓冲器的单元数只要等于一条扫描线内像素的个数就可以了。
计算机图形学
扫描线Z-buffer算法

改进之一:将窗口分割成扫描线


nu :当沿扫描线u递增一个像素时,多边形所在平面n坐标的增 量,对方程au+bv+cn+d=0来说,nu =-a/c nv :当沿扫描线v递增一个像素时,多边形所在平面n坐标的增 量,类似,nv =-b/c (c!=0) nextEP:指向下一个边对结构的指针。

计算机图形学
扫描线Z-buffer算法--活化边表对
长方体线框投影图的二义性
计算机图形学
基本概念


消隐的对象是三维物体。三维体的表示主要有边 界表示和CSG表示等。 消隐结果与观察物体有关,也与视点有关。
线框图
消隐图
真实感图形
计算机图形学
消隐的分类

按消隐对象分类


线消隐 消隐对象是物体上的边,消除的是物体上不可见的边 面消隐 消隐对象是物体上的面,消除的是物体上不可见的面

计算机图形学
扫描线Z-buffer算法--边的分类表

边的分类表(ET):当一个多边形进入活化多边形表时,需为其建立 一个边分类表(ET)。这里,ET与其在扫描转换多边形的扫描线算 法中的含义相同,是对多边形的非水平边进行分类的一维数组,长度 等于绘图窗口内扫描线的数目。若一条边在投影平面上的投影的下端 点的v坐标为v,则将该边归为第v类。

计算机图形学究极题库---副本

计算机图形学究极题库---副本

名词解释:1.图形:能够在人们视觉系统中形成视觉印象的对象称为图形,包括自然景物和人工绘图。

2.像素图:点阵法列举图形中的所有点。

用点阵法描述的图形称为像素图。

3.参数图:参数法描述图形的形状参数和属性参数。

用参数法描述的图形称为参数图。

4.扫描线:在光栅扫描显示器中,电子枪扫过的一行称为一条扫描线。

5.构造实体几何表示法:用简单的实体(也称为体素)通过集合运算组合成所需的物体的方法称为构造实体几何表示法。

6.投影:投影是从高维〔物体〕空间到低维〔投影〕空间的一种映射。

7.参数向量方程:参数向量方程是包含参数和向量的方程。

8.自由曲线:形状比较复杂、不能用二次方程来表示的曲线称为自由曲线,通常以三次参数方程来表示9.曲线拟合:给定一个点列,用该点列来构造曲线的方法称为曲线拟合。

10.曲线插值:已知曲线上的一个点列,求曲线上的其他点的方法称为曲线插值。

11.区域填充:根据像素的属性值、边或顶点的简单描述,生成区域的过程称为区域填充。

12.扫描转换:在矢量图形中,多边形用顶点序列来表示,为了在光栅显示器或打印机等设备上显示多边形,必须把它转换为点阵表示。

这种转换称为扫描转换。

1、电脑图形学:用电脑建立、存储、处理某个对象的模型,并根据模型产生该对象图形输出的有关理论、方法与技术,称为电脑图形学。

2、电脑图形标准:电脑图形标准是指图形系统及其相关应用程序中各界面之间进行数据传送和通信的接口标准。

3、图形消隐:电脑为了反映真实的图形,把隐藏的部分从图中消除。

4、几何变换:几何变换的基本方法是把变换矩阵作为一个算子,作用到图形一系列顶点的位置矢量,从而得到这些顶点在几何变换后的新的顶点序列,连接新的顶点序列即可得到变换后的图形。

5、计算几何:计算几何研究几何模型和数据处理的学科,讨论几何形体的电脑表示、分析和综合,研究如何方便灵活、有效地建立几何形体的数学模型以及在电脑中更好地存贮和管理这些模型数据。

6、裁剪:识别图形在指定区域内和区域外的部分的过程称为裁剪算法,简称裁剪。

zbuffer算法思想

zbuffer算法思想

3.简述Z 缓存消隐算法思想和描述。

深度缓存算法(Z-Buffer)是一种最简单的图象空间
面消隐算法, 既适应于多边形面也适用其它曲面。

. 它需要一个深度缓存数组ZB, 其大小与屏幕上象素
点的个数相同, 也与显示器的帧缓存FB的单元个数
相同, 彼此一一对应。

算法描述
. 若有N个多边形, 屏幕上象素点个数为m×n, 则
算法的基本步骤如下:
(1) 初始化ZB和FB, 使ZB(i,j)=z的极小值, FB(i,j)=背景色; (i=1,2,…,m, j=1,2,…,n)
(2) FOR j =1,n /*第j根扫描线*/
FOR i =1,m /*第j根扫描线上第i个象素点*/
FOR k =1,N /*多边形Pk*/
(2.1)令Zij=Z的极小值;
(2.2)判断点(i,j)是否落在多边形Pk在XOY面
上的投影多边形内;
(2.3)若(i,j)在P
k的投影多边形内,则计算多边形Pk在点(i,j)处的深度值Zij;
(2.4)比较Zij与ZB(i,j)的大小,若Zij>ZB(i,j),
则令ZB(i,j)= Zij,FB(i,j)=多边形Pk的颜色。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验六 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);}四、程序结果截图。

相关文档
最新文档