OpenGL帧缓存和动画

17.1、帧缓存
  屏幕上所绘的图形都是由象素组成的,每个象素都有一个固定的颜色或带有相应点的其它信息,如深度等。因此在绘制图形时,内存中必须为每个象素均匀地保存数据,这块为所有象素保存数据的内存区就叫缓冲区,又叫缓存(buffer)。不同的缓存可能包含每个象素的不等数位的数据,但在给定的一个缓存中,每个象素都被赋予相同数位的数据。存贮一位象素信息的缓存叫位面(bitplane)。系统中所有的缓存统称为帧缓存(Framebuffer),可以利用这些不同的缓存进行颜色设置、隐藏面消除、场景反走样和模板等操作。

  17.1.1 帧缓存组成
  OpenGL帧缓存由以下四种缓存组成:

颜色缓存(Color Buffer)
颜色缓存通常指的是图形要画入的缓存,其中内容可以是颜色索引,也可以是RGB颜色数据(包含Alpha值也可)。若读者所用OpenGL系统支持立体视图,则有左、右两个缓存;若不支持立体视图,则只有左缓存。同样,双缓存OpenGL系统有前台和后台两个缓存,而单缓存系统只有前台缓存。每个OpenGL系统都必须提供一个左前颜色缓存。
深度缓存(Depth Buffer)
深度缓存保存每个象素的深度值。深度通常用视点到物体的距离来度量,这样带有较大深度值的象素就会被带有较小深度值的象素替代,即远处的物体被近处的物体遮挡住了。深度缓存也称为z-buffer,因为在实际应用中,x、y常度量屏幕上水平与垂直距离,而z常被用来度量眼睛到屏幕的垂直距离。
模板缓存(Stencil Buffer)
模板缓存可以保持屏幕上某些部位的图形不变,而其它部位仍然可以进行图形绘制。比如说,可以通过模板缓存来绘制透过汽车挡风玻璃观看车外景物的画面。首先,将挡风玻璃的形状存贮到模板缓存中去,然后再绘制整个场景。这样,模板缓存挡住了通过挡风玻璃看不见的任何东西,而车内的仪表及其它物品只需绘制一次。因此,随着汽车的移动,只有外面的场景在不断地更改。
累积缓存(Accumulation Buffer)
累积缓存同颜色缓存一样也保存颜色数据,但它只保存RGBA颜色数据,而不能保存颜色索引数据(因为在颜色表方式下使用累积缓存其结果不确定)。这个缓存一般用于累积一系列图像,从而形成最后的合成图像。利用这种方法,可以进行场景反走样操作。
  17.1.2 缓存清除
  前面几章内容里已经提到缓存清除的应用,这里将详细解释这些函数。在许多图形程序中,清屏或清除任何一个缓存,一般来说操作开销都很大。例如,在一个1280*1024的屏幕上,它要求对成千上万个象素进行操作。通常,对于一个简单的绘图程序,清除操作可能要比绘图所花费的时间多得多。如果不仅仅只清除颜色缓存,而还要清除深度和模板等缓存的话,则将花费三四倍的时间开销。因此,为了解决这个问题,许多机器都用硬件来实现清屏或清除缓存操作。OpenGL清除缓存操作过程是:先给出要写入每个缓存的清除值,然后用单个函数命令执行操作,传入所有要清除的缓存表,若硬件能同时清除,则这些清除操作可以同时进行;否则,各个操作依次进行。
  下面这个函数为每个缓存设置清除值:

  void glClearColor(GLclampf red,GLclampf green,GLclampf blue,GLclampf alpha);
  void glClearIndex(GLfloat 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。用清除函数命令设置的清除值一直保持有效,直到它们被更改为止。
  选择了要清除的缓存及其清除值后,就可以调用glClear()来完成清除的操作了。这个清除函数为:

  void glClaear(Glbitfield mask);

  清除指定的缓存。参数mask可以是下面这些位逻辑的或,

  GL_COLOR_BUFFER_BIT
  GL_DEPTH_BUFFER_BIT
  GL_STENCIL_BUFFER_BIT
  GL_ACCUM_BUFFER_BIT

  这些位逻辑确定所要清除的缓存。注意:GL_COLOR_BUFFER_BIT清除RGBA方式颜色缓存还是清除颜色表方式颜色缓存,要依赖当前系统设置的颜色方式。当清除颜色缓存后,所有启动写操作的颜色缓存都被清除。

17.2、OpenGL动画
  OpenGL提供了双缓存,可以用来制作动画。也就是说,在显示前台缓存内容中的一帧画面时,后台缓存正在绘制下一帧画面,当绘制完毕,则后台缓存内容便在屏幕上显示出来,而前台正好相反,又在绘制下一帧画面内容。这样循环反复,屏幕上显示的总是已经画好的图形,于是看起来所有的画面都是连续的。
  在OpenGL中,设计这样的动画程序很简单,只需掌握一个重点函数,即:

  void auxSwapBuffers(void);

  设置交换缓存。即执行完一次绘制过程,便交换前后台缓存,以便让下一帧图形在屏幕后绘制完成。当然,使用不同的窗口系统设置交换缓存的函数也可能不一样,比如在X窗口系统下,就最好用glxSwapBufferS()。
  此外,在窗口显示模式中还应设置双缓存模式。下面看一个双缓存动画例子dbufcolr.c,这个程序是在第十三章的nmlcolr.c的基础上改制而成的,读者可以对比起来看看,就会发现OpenGL动画程序设计其实是件极其容易和有趣的事情。

转载于:https://www.cnblogs.com/lizhengjin/archive/2010/10/02/1841184.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值