图形学第十四课--opengl帧缓存和动画

上传人:F****n 文档编号:100784691 上传时间:2019-09-25 格式:DOC 页数:8 大小:32.50KB
返回 下载 相关 举报
图形学第十四课--opengl帧缓存和动画_第1页
第1页 / 共8页
图形学第十四课--opengl帧缓存和动画_第2页
第2页 / 共8页
图形学第十四课--opengl帧缓存和动画_第3页
第3页 / 共8页
图形学第十四课--opengl帧缓存和动画_第4页
第4页 / 共8页
图形学第十四课--opengl帧缓存和动画_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《图形学第十四课--opengl帧缓存和动画》由会员分享,可在线阅读,更多相关《图形学第十四课--opengl帧缓存和动画(8页珍藏版)》请在金锄头文库上搜索。

1、第十七章 OpenGL帧缓存和动画 目 录17.1 帧缓存17.2 OpenGL动画本章将简要地讲述OpenGL帧缓存和动画的内容。通过这一章的学习,读者将初步了解OpenGL帧缓存的组成和基本操作以及掌握OpenGL动画设计的基础编程方法。17.1、帧缓存屏幕上所绘的图形都是由象素组成的,每个象素都有一个固定的颜色或带有相应点的其它信息,如深度等。因此在绘制图形时,内存中必须为每个象素均匀地保存数据,这块为所有象素保存数据的内存区就叫缓冲区,又叫缓存(buffer)。不同的缓存可能包含每个象素的不等数位的数据,但在给定的一个缓存中,每个象素都被赋予相同数位的数据。存贮一位象素信息的缓存叫位面

2、(bitplane)。系统中所有的缓存统称为帧缓存(Framebuffer),可以利用这些不同的缓存进行颜色设置、隐藏面消除、场景反走样和模板等操作。17.1.1 帧缓存组成OpenGL帧缓存由以下四种缓存组成: 颜色缓存(Color Buffer)颜色缓存通常指的是图形要画入的缓存,其中内容可以是颜色索引,也可以是RGB颜色数据(包含Alpha值也可)。若读者所用OpenGL系统支持立体视图,则有左、右两个缓存;若不支持立体视图,则只有左缓存。同样,双缓存OpenGL系统有前台和后台两个缓存,而单缓存系统只有前台缓存。每个OpenGL系统都必须提供一个左前颜色缓存。 深度缓存(Depth B

3、uffer)深度缓存保存每个象素的深度值。深度通常用视点到物体的距离来度量,这样带有较大深度值的象素就会被带有较小深度值的象素替代,即远处的物体被近处的物体遮挡住了。深度缓存也称为z-buffer,因为在实际应用中,x、y常度量屏幕上水平与垂直距离,而z常被用来度量眼睛到屏幕的垂直距离。 模板缓存(Stencil Buffer)模板缓存可以保持屏幕上某些部位的图形不变,而其它部位仍然可以进行图形绘制。比如说,可以通过模板缓存来绘制透过汽车挡风玻璃观看车外景物的画面。首先,将挡风玻璃的形状存贮到模板缓存中去,然后再绘制整个场景。这样,模板缓存挡住了通过挡风玻璃看不见的任何东西,而车内的仪表及其它

4、物品只需绘制一次。因此,随着汽车的移动,只有外面的场景在不断地更改。 累积缓存(Accumulation Buffer)累积缓存同颜色缓存一样也保存颜色数据,但它只保存RGBA颜色数据,而不能保存颜色索引数据(因为在颜色表方式下使用累积缓存其结果不确定)。这个缓存一般用于累积一系列图像,从而形成最后的合成图像。利用这种方法,可以进行场景反走样操作。17.1.2 缓存清除前面几章内容里已经提到缓存清除的应用,这里将详细解释这些函数。在许多图形程序中,清屏或清除任何一个缓存,一般来说操作开销都很大。例如,在一个1280*1024的屏幕上,它要求对成千上万个象素进行操作。通常,对于一个简单的绘图程序

5、,清除操作可能要比绘图所花费的时间多得多。如果不仅仅只清除颜色缓存,而还要清除深度和模板等缓存的话,则将花费三四倍的时间开销。因此,为了解决这个问题,许多机器都用硬件来实现清屏或清除缓存操作。OpenGL清除缓存操作过程是:先给出要写入每个缓存的清除值,然后用单个函数命令执行操作,传入所有要清除的缓存表,若硬件能同时清除,则这些清除操作可以同时进行;否则,各个操作依次进行。下面这个函数为每个缓存设置清除值:void glClearColor(GLclampf red,GLclampf green,GLclampf blue,GLclampf alpha);void glClearIndex(G

6、Lfloat index); void glClearDepth(GLclampd depth);void glClearStencil(GLint s);void glClearAccum(GLflaot red,GLfloat green,GLfloat blue,GLfloat alpha);以上函数分别为RGBA方式下的颜色缓存、颜色表方式下的颜色缓存、深度缓存、模板缓存和累积缓存说明当前的清除值。GLclampf和GLclampd(约简的GLfloat和GLdouble)类型的数据被约简到0.0,1.0之间,缺省的深度清除值为0.0。用清除函数命令设置的清除值一直保持有效,直到它们被

7、更改为止。选择了要清除的缓存及其清除值后,就可以调用glClear()来完成清除的操作了。这个清除函数为:void glClaear(Glbitfield mask);清除指定的缓存。参数mask可以是下面这些位逻辑的或,GL_COLOR_BUFFER_BITGL_DEPTH_BUFFER_BITGL_STENCIL_BUFFER_BITGL_ACCUM_BUFFER_BIT这些位逻辑确定所要清除的缓存。注意:GL_COLOR_BUFFER_BIT清除RGBA方式颜色缓存还是清除颜色表方式颜色缓存,要依赖当前系统设置的颜色方式。当清除颜色缓存后,所有启动写操作的颜色缓存都被清除。17.2、Op

8、enGL动画OpenGL提供了双缓存,可以用来制作动画。也就是说,在显示前台缓存内容中的一帧画面时,后台缓存正在绘制下一帧画面,当绘制完毕,则后台缓存内容便在屏幕上显示出来,而前台正好相反,又在绘制下一帧画面内容。这样循环反复,屏幕上显示的总是已经画好的图形,于是看起来所有的画面都是连续的。在OpenGL中,设计这样的动画程序很简单,只需掌握一个重点函数,即:void auxSwapBuffers(void);设置交换缓存。即执行完一次绘制过程,便交换前后台缓存,以便让下一帧图形在屏幕后绘制完成。当然,使用不同的窗口系统设置交换缓存的函数也可能不一样,比如在X窗口系统下,就最好用glxSwap

9、BufferS()。此外,在窗口显示模式中还应设置双缓存模式。下面看一个双缓存动画例子dbufcolr.c,这个程序是在第十三章的nmlcolr.c的基础上改制而成的,读者可以对比起来看看,就会发现OpenGL动画程序设计其实是件极其容易和有趣的事情。例17-1 双缓存动画例程(dbufcolr.c)#include glos.h#include #include #include /* 定义旋转和比例因子的初始值 */GLfloat step=0.0,s=0.1;/* 定义立方体的顶点坐标值 */static GLfloat p1=0.5,-0.5,-0.5, p2=0.5,0.5,-0.5

10、, p3=0.5,0.5,0.5, p4=0.5,-0.5,0.5, p5=-0.5,-0.5,0.5, p6=-0.5,0.5,0.5, p7=-0.5,0.5,-0.5, p8=-0.5,-0.5,-0.5;/* 定义立方体的顶点方向值 */static GLfloat m1=1.0,0.0,0.0, m2=-1.0,0.0,0.0, m3=0.0,1.0,0.0, m4=0.0,-1.0,0.0, m5=0.0,0.0,1.0, m6=0.0,0.0,-1.0;/* 定义立方体的顶点颜色值 */static GLfloat c1=0.0,0.0,1.0, c2=0.0,1.0,1.0,

11、c3=1.0,1.0,1.0, c4=1.0,0.0,1.0, c5=1.0,0.0,0.0, c6=1.0,1.0,0.0, c7=0.0,1.0,0.0, c8=1.0,1.0,1.0;void myinit(void);void CALLBACK myReshape(GLsizei w, GLsizei h);void CALLBACK stepDisplay (void);void CALLBACK startIdleFunc (AUX_EVENTREC *event);void CALLBACK stopIdleFunc (AUX_EVENTREC *event);void CALL

12、BACK display(void);void DrawColorBox(void);void myinit(void)GLfloat light_ambient=0.3,0.2,0.5;GLfloat light_diffuse=1.0,1.0,1.0;GLfloat light_position = 2.0, 2.0, 2.0, 1.0 ;GLfloat light1_ambient=0.3,0.3,0.2;GLfloat light1_diffuse=1.0,1.0,1.0;GLfloat light1_position = -2.0, -2.0, -2.0, 1.0 ;glLightf

13、v(GL_LIGHT0, GL_AMBIENT, light_ambient);glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);glLightfv(GL_LIGHT0, GL_POSITION, light_position);glLightfv(GL_LIGHT1, GL_AMBIENT, light1_ambient);glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse);glLightfv(GL_LIGHT1, GL_POSITION, light1_position);glLightModeli

14、(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glEnable(GL_LIGHT1);glDepthFunc(GL_LESS);glEnable(GL_DEPTH_TEST);glColorMaterial(GL_FRONT_AND_BACK,GL_DIFFUSE);glEnable(GL_COLOR_MATERIAL);void CALLBACK display(void)glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);s+=0.005;if(s1.0)s=0.1;glPushMatrix();glScalef(s,s,s);glRotatef(step,0.0,1.0,0.0);glRotate

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号