计算机图形学实验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。

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

相关文档
最新文档