OpenGL入门教程(精)_第1页
OpenGL入门教程(精)_第2页
OpenGL入门教程(精)_第3页
OpenGL入门教程(精)_第4页
OpenGL入门教程(精)_第5页
已阅读5页,还剩91页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、OpenGL入门教程1. 第一课:说起编程作图,人概还令很多人想起TC的#mclude吧?但是乞位是否想过,那些画面绚朗的PC游戏是如何编写出來的?就靠TC那町怜的640M80分辨率、16 色来做吗?显然是不行的.本帖的H的是让人家放弃TC的老旧图彫接口,让大家接触一些新事物。OpenGL作为行前主流的图形API之一,它在一些场介JI冇比DirectX更优越的特性。1、与C语言紧密结合.OpenGL命令最初就是用C语二屈数來进行描述的,対学习过C语;:的人來讲,OpenGL是容易理解和 学习的。如果你曾经枪触过TC的graphics h,你仝发现便用0penGL作图虛节比TC 0加简烦。2、强

2、大的可移植性.微软的Direct3D负然也是十分优秀的图形API.但它只用J: Window系统(现在还耍加卜一个XBOX游 戏机)。而OpenGL不仅JI j- Windows,还町以用Unix Linux等其它系统,它哄至在大熨计算机、冬种 $业“算机(如:医疗用显示设备上郁仃应用。并IL, OpenGL的基木命令郁做到了谀件无关,找至采 平台无关.3、高性能的图形淇染。OpenGL是一个I】业标准,它的技术紧駅时代,现今乞个显旧.家无一不对OpenGL提供强力支持,激烈 的竞爭中使得OpenGL性能-直领先。总之,OpenGL是-个很NB的图形软件接口至丁究竟冇多NB玄看H DOOM3和

3、QUAKE4等专业游 戏就知道了.OpenGL官方网站(英文ht tp:./Avvw. op engl org卜面我将对Windows卜的OpenGL编程进行简单介绍。学习OpenGL前的准备工作第-步,选抒一个编译环境现在Windows系统的匸流編译环境彳f Visual Studio. Broland C+ Builder. Dev-C+鸽,它们祁是支持OpenGL 的。但这里我们选择Visual Studio 2005作为学习OpenGL的坏境。第二步,安装GLUT J.具包GLUT不是OpenGL所必须的,但它会给我们的学Al带來-定的方便,推荐安装.Windows环境下的GLUT卜载

4、地址:(大小约为150k)http:/M-w.openglorgTesources/librarles glut/glutdlls37beta.zip无法从以上地址F戎的话请使用下面的连接:http zupload proeramfan. comup file/200607311626279.zipWindows环境下安装GLUT的步驟:1、将卜载的斥缩包解开,将得到5个文件2、伫我的电脑冲捜索“gLh”,并找到其所在文件夹(如果是VisualStudio2005,则应该是其安装H求下面 VCPlatfonnSDKinclude.gl文件夹”)。把解压得到的glut h枚到这个文件夹。3、把解

5、压得到的giut lib和ghit32 hb放到靜态用数库所在文件夹(如果是isualStudio2005则应该是其安 装H壊卜面的“VClib“文件夹)。4. 把解压得到的glut.dU和giut32dU放到操作系统II录卜M的system32文件夹内。(典空的位朮为: C:WiadowsSystem32)第三步,锂立一个OpenGL工程这甲以 VisualSnidio2005 为例。选择 File-Nev.Project.然 V;选择 Win32 Console Application.选择一个名字.然后按 0K。 在谈出的对话框左边点Application Settings.找到Empt

6、y project几勾上.选抒Finish 然后向该工程添加一个代码文件,取名为“OpenGLc”,注意用.c來作为文件结尼。搞定了,就跟平时的工程没什么两样的.第一个OpenGL程序一个简敢的OpenGLfi?序如下:(注意,如果需耍编译并运行,需耍正确安装GLUT安装方法如上所述)#mclude void my Display (void)gClear(GL_COLOR_BUFFER_BIT);glRectf(-0.5f -0.5C 0.5f, 0.5f);glFiushO;int main(int argc. char argvJ)ghnlnrt(&argr arg-);glutImtD

7、isphyMode(GLUT_RGB | GLUT_SINGLE);giutlmt WindowPosit ion( 100. 100);giutImtWindowSize(400. 400);giutCreateWmdow(M第_个 OpenGL 聊宇 J;glutDisp lay F unc(&myDi)lay).glutMainLoopO:return 0;该程序的作用是在一个黑色的窗口中央画一个门色的矩形。下而对备厅语句进彳亍说明.怎么样?代码还不算长吧?先,盅耍包倉头文件片include vGL gut h,这是GLUT的头文件。本來OpenGL程序 般还要包和,但GLUT的头文件中

8、U经门动将这两个文件包倉 了,不必再次包含.然后看main函数=int mam(int argc. char *argvr).这个是带命令行:参数的main函数,乞位应该见过吧?没见过的同志们请务 翻翻书,等弃明白了冉往卜看.注总main闻数屮的各语句,除J最后的return Z外,其余全部以glut开头。这种以glut开头的用数都是GLUT I H包所提供的旳数,卜面对用到的几个惭数进行介绍。1、dutlnit.对GLUT进彳亍初始化,这个函數必须在其它的GLUT使用之前调用一次。其格式比较死板,-般照抄这句ghitlmt(&argc, argv)就可以了.2、utImtDisplayMod

9、e.设玄显示方式,梵中GLUT_RGB表示使用RGB颜色,与之,对应的还冇GLUT_NDEX (衣示使用索引颜色)。GLUT_SINGLE表示使用单缓冲.与Z对应的还竹GLUT_DOUBLE (使用双缓冲)。更多倍息,请fl d Google当然以后的教程也会冇一些讲解。3、dutlmtWmdowPosition.这个简单,设7?謝口在屏幕中的位?Z4、utlnitWmdowSize.这个也简的,设就窗口的大小.5、glutCreateWmdoxv.根据询向设世的信息创建窗口。参数将被作为謝口的标題。注意:窗LI被创建后, 并不立即显示到川幕上。盅要调用giutMainLoop才能看到谢口.6

10、、glutDispFiinc,设个函数,盅要进行画图时,这个函数就会被调用.(这个说法不够准确,但 准确的说法町能初学者不太好理解,暂时这样说吧).7、giutMainLoop.进行一个消息術坏.(这个町能初学者也不太明白,现在只需要知道这个的数町以显示 贾口,并H等待謝口关闭后才会返回,这就足够了。)在glutDisplayFunc 数中,我们设代了“半需要同图时,请调用myD叼lay隨数是 眄D叼lay旳数就 用來帧图。观察myDisplay中的三个陶数调用,发现它们郁以gl开头。这种以gl开头的函数都是OpenGL 的标准旳数,下面对用到的函数进行介绍。1、Clear淸除.GL_COLO

11、R_BUFFER_BIT表示淸除颜色,Clear换数还町以淸除贯它的东西,但这电 不作介绍。2、glRectf.湎一个矩形。四个参数分别衣不了位对角线上的两个点的横、纵坐标。3、蛮lush,保证询而的OpenGL命令立即执疔(而不是让它们在缓冲区中等待)。梵作川级fflush(stdout) 类似.2. 第二课:本次课程所耍讲的是绘制简唯的几何图形,在实际绘制之前,讣我们先熟悉-些概念。一、点、直线和多边形我们知道数学(具体的说,是几何学)中有点、直线和多边形的概念,但这些概念在计算机中会有所不同. 数学上的点,只冇位置,没冇大小.但在计况机中,无论计克楙度如何提高,始终不能表示一个无穷小的

12、点另一方面,无论图形输出设备(例如,显示器)如何秸确,始终不能输出一个无穷小的点.一般惜况 F, OpenGL中的点将被画成单个的像素(像素的概念,请白己搜索之虽然它可能足够小,但并不会 是无穷小。同一像楽上,OpenGL可以绘制许多坐标只有稍微不同的点,但该像素的具体颜色将取决于 OpenGL的实现。十然,过度的注总细节就是钻牛角尖,我们大町不必花费过多的格力2;研究“多个点如何 画到同一像索上同样的,数学上的直线没有宽度,但OpenGL的宜线则是令宽度的。同时.OpenGL的苴线必须是令跟长 度,lii不是像数学概念那样是无限的。可以认为,OpenGL的虫线”概念少数学上的“线段”接近.它

13、可以曲 两个端点來确定。多边形是由多条线段首用相连而形成的闭介区域。OpenGL规定,一个多边形必须是一个“凸多边形”(英定 义为:多边形内任总两点所确迳的线段都在冬边形内,山此也町以推导出,凸多边形不能是空心的)。多边 形町以宙其边的靖点(这里可称为顶点)來确泄。(注焦 如果使用的芬边形不是凸娄边形,则虽后输出的 效果是未定义的一penGL为了效率,放宽了检戏,这町能导致显示错误。耍避免这个诰谋,尽虽使用 三角杉,内为三角形祁是门多边形)町以想彖,通过点、直线和多边形,就町以组合成$种儿何图形。其至r,你町以把一段弧看成是很多短 的玄线段相连,这些玄线段足够短,以至丁其长度小r一个像索的宽度

14、。这样一來孤和圆也町以农示出來 了.通过位丁不同平面的相连的小多边形,我们还可以组成-个“曲而”。二、在OpenGL中指定顶点由以上的讨论可以知道,“点是一切的基础o如何指定-个点呢? OpenGL提供了一系列函数。它们都以Vfertex开头,后而跟一个数字和卜2个字母. 例如:glV?rtex2dglrtex2fgl&ex3f&ex3fv等等.数字丧示参数的个数,2表示符两个参数,3表示三个,4丧不以个(我知道旨点罗嗦)。7母長爪参数的类他s农爪16位桔数(OpenGLP将这个类甲4义GLshort).i表示32位於数(OpenGL中将这个类熨定义为GLut和GLscei),f表示32位浮点

15、数(OpenGL中将这个类弋定义为GLfloat和GLclampf),d表示64位浮点数(OpenGL屮将这个类型泄义为GLdouble和GLdampd)。v衣示传递的几个参数将使用指针的方式,见下面曲例子.这些闻数除了参数的类空和个数不同以外,功能是相同的。例如,以下五个代码段的功能是等效的:(一)g!V&tex2i(1.3);(二)glertex2f(1.0f. 3.0f):(三)glrtex3f(l.Of. 3.0f. O.Of).(四)g!Fe鼎f(l.Of. 3.0f. O Of. 1 Of):(五)GLfloat feitexArr3 = 1 Of. 3 Of. O Of;gler

16、tex3fv(,ertexAir3);以后我们将用dVrtex*來农示这-系列函数。注总:OpenGL的很多换数都是采用这样的形式,一个相同的前缀再加上参数说明标记,这一点会随养学 习的深入而有更多的体会。三、开始绘制假设现在我已经指定了若顶点,那么OpenGL是如何知逍我想拿这些顶点來什么呢?是个-个的画 出来,还是连成线?或者构成一个多边形?或者做英它什么事情?为了解决这一问题,OpenGL要求:指定顶点的命令必须包含彳glBegm惭数Z几 gEnd旳数之前(否则 指定的顶点将被忽略)。并山glBegui來指明如何使用这些点。例如我写:glBegm(GL_POINTS);glertex2f

17、(0.0f, O.Of);glVertex2f(0.5f, O.Of);glEndO;则这两个点将分别破间出來。如果将GL_POINTS替换成GL.LINES,则两个点将被认为是真线的两个端 点,OpenGL将会画出一条宜线。我们还可以指定更姜的顶点,然后画出更奴杂的图形。另方而,glBegrn 支持的方式除了 GL_POINTS 和 GL_LINES,还fjGL_LINE_STRIP. GL_LINE_LOOP, GL TRIANGLES. GL TRIANGLE STRIPGL TRIANGLE FAN等,毎种方式的大致效果见下图: V4vO V3VI* 2GL POINTSGL LINE

18、SGL_LINE_STRIPGL POLYGONGL QUADS5TRI 尸GL_TRIANGLE_STRIPGL QUADGL TBIANGLE FAN声明:该图片來门wwwopenorg.该图片是(OpenGL编程指南一站的附图.由于该书的旧版(第版. 1994年(2经流伎网络.我冷型没仃触及到版权问懸。我井不准备在glBegm的各种方式I:大作文帝。大家町以门(2尝试改变glBegm的方式和顶点的位粘生成 一些有趣的图案。程序代码:void my Display (void)glClear(GL_COLOR_BUFFER_BIT);glBegm(/*存这里填上你所希琨的模式*/);/在这

19、里使用gl&tex*系列怖数*/指圧你所希星的顶点位置/glEndO;gfflushO;把这段代码改成你喜欢的样子,然后用它瞽换第-课中的myDisplay旳数,编译后即町运行。 两个例子例一、顷一个圆 止四边形,正五边形,止六边形,总到疋n边形,当n越人时,这个图形就越接近圆 当n大到一定程度后,人眼将无法把它跟真正的圆相区别这时我们已经成功的画出了一个“I员I”(注:画圆的方法很慕,这里使川的是比较简单,但效率较低的一种)试修改F面的const int n的值,观察当n=3A5.8,10.15.2030,50等不同数值时输出的变化情况 将GL_POLYGOK改为GL_LINE_LOOP、G

20、LPOIKTS等具它方式,观察输出的变化悄况#mclude const mt n = 20;const GLfloat R = 0.5f;const GLfloat Pi - 3.1415926536f;void my Display (void)int 1;g!Clear(GL_COLOR_BUFFER_BIT):glBegm(GLPOLYGON);forii=0; in; ii),ertex2f(R*cos(2*Pini). R*sin(2ePi/n*i):glEndO;glFiushO;例二、画一个五角星严设五角星的五个顶点分布位置关系如卜:AE BD C首先,根据余弦定理列方程,计算五

21、角星的中心到顶点的距离a(假改五角星对应正五边形的边长为.0)a-l/(2-2#cos(72ePi/180);然后,根据正孩和余弦的定义,计算B的x坐标bx和y坐标by,以及C的y坐标 (假设五角星的中心在坐标原点)bx-a*cos(18*Pi/180);by = a*sin(18*Pi/180);cy = -acos(18 *Pi/180);五个点的坐标就可以通过以上四个虽和一些當数简单的衣示出來T#mclude const GLfloat Pi= 3.1415926536f;void myDisphy(void)GLfloat a = 1 /(2-2*cos(72#Pi/180);GLfl

22、oat bx= a * cos(18 拿 Pi 180);GLfloat by = a sm(18 Pi 180);GLfloat cy - -a * cos(18 # PvlSO);GLfloatPointA2 = 0, a ,PomtB2 = bx by ,PointC2 = 0.5, cy ,PointD2- -0.5,cy , PointE2 = -bx, by ;glClear(GL_COLOR_BUFFER_BET):按照AXEBDA的顺序,町以-笔将五角星画出glBegm(GL_LINE_LOOP);0Vi?rtex2fV(PointA);0&tex2fV(PointC).0at

23、ex2fV(PointE);0V?rtex2fv(PointB);gl Vertex? fV(PointD);glEndO:glFlushO;例三、廐出正弦函数的图形严由于OpenGL默认坐标值只能从J到1,(可以修改,但方法留到以后讲) 所以我们设溼一个因子factor.把所有的坐标值等比例缩小,这样就可以画出更多个正弦周期试修改factor的值,观察变化惜况 /#mclude const GLfloat factor = O.lf;void iny Display (void)GLfloat x;glClear(GL_COLOR_BUFFER_BIT);glBegm(GL_IJNE S).

24、0Eex2f(l Of 0 Of);0Wrtex2f(l.Of O.Of); /以上两个点可以画X轴gl&tex2f(0.0f0&tex2f(O.Of l.Of); /以上两个点可以画y轴 glEndO; g!Begm(GL_LINE_ STRIP);fori x=-l .Of factor, x“属性”对话框中,设置图片的离度和宽度均为32.用放大镜观察图片,并编辑Z黑色对应二进制零(镂空),白色对应二进制一(不镂空,编辑完毕后保 存.然后,就町以使用以卜代码来获得这个Mask数组了。si at ic GLuby t e M ask 12 8;FILE *fp;fp = fop en(mas

25、k blip, rb):逋輝)exit(O);/移动文件拆针到这个位用,使得再读sizeof(Mask)个了节就会遇到文件结束注意(mt)sizeof(Mask)虽然不是什么好的写法,但这甲.它确实是正确仃效的如果任接呼sizeof(Mask)的话冈为sizeof取得的是一个无符号数,取负号会令问融if( fseek(fp. -(mt)sizeofIask). SEEK_END)exit(O);/ 读JR sizeof(Mask)个了节到 Maskif( ?fread(Mask sizeof(Mask), 1. fy)exit(O); fclose(fp);好的.现在请门己编組一个图片作为ma

26、sk.并用上述方法取得Mask数组.运行后观察效果。说明:绘制虚线时可以设置factor因子,但多边形的镂空无法殳置fiictor因子。请用取标改变窗口的犬小, 观察偻空效果的变化惜况.#mclude #mclude void myDisphy(void)static GLuby te M ask128;FILE *fp;fp fopenCmask bmpl MrbM):敢)exit(O);if( fseek(fp, -(int)sizeofNfask). SEEKEND)exit(O);if( fread(Mask. sizeof(Mask), 1. 0)exit(O);fclose(e);

27、glCleai(GL_COLOR_BUFFER_BIT);glEnable(GL_POLYGON_STIPPLE);glPoly gpn Stipp le(M ask);glRectf(-O.5f. -0.5f. O.Of, O.Of), /在左卜7/绘制一个仃镂空效乂的止方形glDisable(GL_POLYGON_STIPPLE):glRectf(O Of. 0 0f. 0.5f. 0.5f); 在右I:方绘制一个无镂空效果的正方形glFtushO;小结本课学习了绘制几何图形的一些细节.点町以设置大小。直线町以设疋宽度:町以将4线画成虚线。多边形的两个而的绘制方法可以分别设置:在三维空间中

28、,不可见的多边形町以被剔除:町以将填充多边 形绘制成镂空的样式.了解这些细节会使我们在一些图彖绘制中更加得心应-另外,把一些数据写到程序之外的文件中,并用专门的工具編笹之,有时可以显得更方便。4第四课:OpenGL支持网种颜色模式:一种是RGBA. 种是颜色索引哄式。无论祁种顔色模式,计算机都必復为每个像索保些数据。不同的是,RGBA模式中,数据也接就代 表了顾色:而频色索引模式中,数据代表的是一个索引,要得到亢正的颜色,还必须去茂索引表.1 RGBA 色 RGBA模式中,毎一个像索会保存以卜数据:R值(红色分戢)、G值(绿色分嵐)、B值(蓝色分戢)和 A值(alpha分虽)。其中红、绿、蓝二

29、种颜色柑组介,就町以得到我们所需要的*种颜色,Ifu alpha不“接 形响颜色,它将留待以后介绍.在RGBA模式卜选择颜色是十分简单的审惜,只需箜一个惭数就町以搞定.glColor*系列函数町以川设起颜色,其中三个参数的版本町以指定R、G、B的值,而A值采用默认:PM 个参数的版本町以分别指圧R、G、B、A的值。例如:void glColor3f(GLfloat red. GLfloat green. GLfloat blue);void glColor4f(GLfloat red. GLfloat green. GLfloat bhie. GLfloat alpha);(还记得吗? 3f表

30、示有三个浮点参数请看第课中关J: gertex*P仓数的叙述。)将浮点数作为参数,其中0.0农示不使川该种颜色,而L0表示将该种颜色用到最多.例如: glColor3f(l Of. 0Of. 000;衣示不使用绿、蓝色,而将红色使用晟多,丁足得到嚴纯净的红色. g!Color3f(0Of. 1 Of. 1 Of);表示使用绿、蓝色到最多,而不使用红色。混合的效果就是浅蓝色。 glColor3f(0.5f, 0.5f, 0.5f);表乐各种颜色使用一半,效果为灰色。注总:浮点数町以耕确到小数点后若干位,这并不表示计养机峨町以显示如此多种颜色。实际上,计算机 町以显示的颜色种数将由唤件决定.如果O

31、penGL找不到裕确的颜色,会进行类似“四含五入”的处理.人家町以通过改变卜向代码中glColor3f的参数值,绘制不同颜色的矩形。void inyDisp lay (void)Clear(GL_COLOR_BUFFER_BIT);glColor3f(0.0f l.Of, l.Of);glRectf(-0.5f.0.5f. 0.5f. 0.5f);glFtushO;注意:Color系列函数.在数类型不同时,衣示“最人”颜色的值也不同。采用f和d做后缀的函数,以10表示最大的使用.采用b做后缀的函数,以127表示最大的便用。采用ub做后缀的函数,以255表示最大的使用.采用5做后缀的函数,以32

32、767衣示最大的使用。采用US做后缀的函数,以65535表示最大的使用.这些规则看似麻烦,但熟悉后实际使用中不会有什么障碍。2、萦引颜色在索引颜色模式中,OpenGL需耍-个颜色农。这个表就相YT画家的调色板:虽然町以调出很多种颜色, 但同时存在调色板匕的颜色种数将不会超过调色板的格数。试将颜色表的毎一项想彖成调色板卜的一个 格子:它保存了一种颜色。在使用索引颜色模式画图时,我说“我把第1种颜色设氏为某某”,其实就相当将调色板的第1格调为某某 颜色.“我需耍第k种顾色來画图”,那么就用画笔去腫-下第k格调色板。濒色表的大小是很冇阳的,一般在2567096之间,II总是2的整数次斥。在使用索引颜

33、色方式进行绘图时, 总是先设置颜色表,然后选择颜色。2.1、选择颜色使用gUndex*系列旳数町以在颜色表中选样颜色.英中最常用的町能是gUndexi.它的参数是一个帑形. void gl!ndexi(GLint c);是的,这的确很简单。2.2.设置颜色表OpenGL并直接没冇提供设代颜色表的方法,冈此设置颜色表需耍使用操作系统的支持。我们所用的 Windows和其他大多数图形操作系统郁具令这个功能,但所使用的因数却不相同。止如我没令讲述如何fl US代码( Windows卜建立个窗口这里我也不会讲述如何在Windows卜假W颜色农。GLUT 丁JI包提供了设用颜色表的函数gluiSetCo

34、lor,但我测试始终冇问题.现在为了让大家体验一下索引 颜色,我向大家介绍另一个OpenGL T.具包:aux这个工貝包是isualStudio门带的,不必另外安装,但 它L1经过时,这里仅仅是体验一下,大家不必深入。壮 include 芒 include #mclude pragma comment (lib. Mopengl32.hbH)#pragna comment (lib, Mglauxlibn)#mclude const GLdouble Pi 3.1415926536.void my Display (void)int 1;for(i-0; i8; T)auxSetOneColo

35、r(L (float)(i&0x04). (float)(i&0x02). (floatXi&3x01); gl ShadeM odel(GL_FLAT);glClear(GL_COLOR_BUFFER_BIT); glBegm(GL_TRIANGLE_FAN):glertex2f(O.Of. O Of):fbr(t=O; K=& T)gllndexi(i);0Fex2f(cos(严P”4) sin(i*Pi4);glEndO;glFlushO;int main(void)auxImtDisplayMode(AUX_SINGLE|AUX_INDEX): auxInitPosition(0, 0

36、, 400,400);auxInitWmdow(LMM).myDisplayO;Sle?p(10 1000);return 0;其它部分大家都町以不怡 只看myD理lay函数就町以了。首先,使用auxSetOneColor设??颜色农中的 格。循坏八次就町以设置八格.glShadeModel等卜再讲,这里不提。然后在循环中用glXertex设直顶点,同时川ellndexi改变顶点代衣的颜色。最终得到的效果是八个相同形状、不同颜色的三角形。索引颜色虽然讲得多了点。索引颜色的上要优势是占用空间小(毎个像索不必单独保的颜色,只用 很少的二进制位就町以代衣其颜色在颜色衣中的位遡),花费系统资源少,图形

37、运毎速度快,但它编程稍稍 显得不是那么方便,并fl丽而效果也会比RGB颜色星一叫“展际争希”町能代表了 256色的颜色农的画而 效果,虽然它在一台很烂的PC卜.也町以运行很流畅,但以II前的眼光來看,英昕而效果就显得不足了.H前的PC机性能已经足够在各种场合卜使用RGB颜色,因此PC程序开发中,使用索引颜色已经不是主 流。勻魅.一歧小减设冬例如GBA、T机邹.索引颇沦还型冇它的用此Z地。3、指定淸除屏幕用的顾色我们写:Clear(GL_COLOR_BUFFER_BIT);思是把屏幕匕的颜色淸空.但实际上什么才叫“空”呢?在宇宙中.黑色代表了“空”:在一张白纸上,白色代表了“空“:在信封上,信

38、封的颜色才是“空”。OpenGL用下而的旳数來定义淸楚屏幕示屏幕所拥冇的颜色.在RGB模式卜,使用glClearColor來指定“空的颜色,它需要四个参数,其参数的意义跟glColor4f相似. 右:索引埶色模式卜,使用glClearlndex來拆芒空”的颜色所在的索引,它需耍个参数,其总义gllndexi 相似evoid my Display (void)glClearColor(1.0f, O.Of, O.Of, O.Of);0Clear(GL_COLOR_BUFFER_BIT);gfftushO;呵,这个还真简单4、指定着色模型OpenGL允许为同一多边形的不同顶点指定不同的颜色.例如:

39、#mclude const GLdouble Pi = 3.1415926536.void my Display (void)inti;/ glShadeM odeKGLFLAT);glClear(GL_COLOR_BUFFER_BIT);g!Begm(GL_TRIANGLE_FAN):glColor3f(1.0f l.Of, l.Of);glcrtex2f(0.0f. O.Of);fdr(i-O; iv8:卄i)glColor3f(i&0x04. i&0x02, l&OxOl);glVstex2f(cos(i*Pi/4), sin(i*Pi 4);glEndO;glFlushO;在默认悄况卜

40、一,OpenGL会计算两点顶点Z间的氏它点,并为它们填上洽适“的颇色.使相邻的点的颇色值 都比较接近。如果使用的足RGB模式.看起來就几冇渐变的效果如果足使用颜色索引模式,则英相邻点 的索引值是接近的,如果将颜色表中接近的项设溼成接近的颜色,则看起來也是渐变的效果.但如果颜色 表中接近的项颜色却星距很大,则看起來町能是很奇怪的效果。使用glShadeModel函数町以关闭这种计算,如果顶点的颤色不同,则将顶点Z间的典它点全部设置为 一个点相同.(克线以后指定的点的颜色为准.而多边形将以仃:总顶点的颜色为准曲实现决定)为了避 免这个不确定性,尽晁在多边形中使用同一种颜色。glShadeModel

41、的使用方法:glShadeModel(GL_SMOOTH)i /平滑方式,这山默认方式glShadeModel(GL_FLAT); / 单色方式小结:本课学习了如何设置颜色。其中RGB顔色方式是11 i)ij PC机上的常用方式.町以蛙置glClear清除后刖料所剩的颜色.可以设芒颜色境充方式:平涓方式或总色方式.5. 第五课:在前面绘制儿何图形的时帙,人家是否觉得我们绘图的范IMA狭隘了呢?坐标只能从到1,还只能是X 轴向右,Y轴向上,Z轴垂克屏幕。这些限制给我们的绘图带来了很多不便。我们生活在一个三维的世如果嘤观察一个物体,我们町以:1、从不同的位置去观察它.(视图变换)2、移动或者旋转它

42、半然了.如果它只是计算机甲.而的物休.我们还可以放大或缩小它.(模弋变换)3、如果把物体画下来,我们可以选择:是否需要一种“近大远小”的透视效果.另外,我们可能只希望看到 物体的一部分,而不是全部(剪裁。(投影变换)4、我们可能希望把整个看到的图形画下來.但它只占撫纸张的一部分,而不是全部。(视口变换 这临都町以在OpenGL中实现。OpenGL变换实际上是通过矩阵乘法來实现。无论是移动、旋转还是缩放人小,都是通过在当询矩阵的基 础上乘以一个新的矩阵來达到【1的.关丁矩阵的知识,这里不详细介绍,冇兴趣的朋友町以看看线性代数(大学生的话多半应该学过的.OpenGL f以在最底心直接操作矩阵,不过作为初学,这样做的总义并不人。这里就不做介绍了。1、模型变换和视图变换从“相对移动”的观点來看,改变观察点的位用与方向和改变物体本少的位用与方向H有效性。 在OpenGL中,实现这两种功能其至使用的是同样的旳数.由模空和视图的变换都通过矩阵运算來实现,在进分变换询,应先设比当的操作的矩阵为“模熨 视图矩阵

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论