Saturday, May 14, 2011

8、Opengl动画(编程指南有详细的解释)

动画:通过快速的吧看似连续的画面一幅幅的呈现在人们面前,一旦每秒钟的画面超过24幅,人们就会错以为它是连续的。
假设某动画一共有n副图片,则它的工作步骤是:
显示第1幅图片,然后等待一小段时间,直到下一个1/24
显示第2幅图片,然后等待一小段时间,直到下一个1/24
……
显示第n幅图片,然后等待一小段时间,直到下一个1/24
结束
如果用C语言伪代码来描述这一过程,就是:
for( i=0; i<n; i++ )
{
     DrawScene( i );
     Wait();
}
双缓冲技术
实际的动画是先画好了,播放的时候直接拿出来现世就行,但计算机动画则是画一张,就拿出来一张,再画下一张,再拿出来。如果所绘制的图形简单,那么这样也没什么问题。但一旦图形比较复杂,绘制所需要的时间较长,问题就会变得突出。让我们把计算机想象成一个画图比较快的人,假如他直接在屏幕上画图,而图形比较复杂,则有可能在他只画了某幅图的一半的时候就被观众看到。而后面虽然他把画补全了,但观众的眼睛却又没有反应过来,还停留在原来那个残缺的画面上。也就是说,有时候观众看到完整的图象,有时却又只看到残缺的图象,这样就造成了屏幕的闪烁。
如何解决这一问题呢?我们设想有两块画板,画图的人在旁边画,画好以后把他手里的画板与挂在屏幕上的画板相交换。这样以来,观众就不会看到残缺的画了。这一技术被应用到计算机图形中,称为双缓冲技术。即:在存储器(很有可能是显存)中开辟两块区域,一块作为发送到显示器的数据,一块作为绘画的区域,在适当的时候交换它们。由于交换两块内存区域实际上只需要交换两个指针,这一方法效率非常高,所以被广泛的采用。
要启动双缓冲功能,最简单的办法就是使用GLUT工具包。我们以前在main函数里面写:
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
其中GLUT_SINGLE表示单缓冲,如果改成GLUT_DOUBLE就是双缓冲了。
当然还有需要更改的地方——每次绘制完成时,我们需要交换两个缓冲区,把绘制好的信息用于屏幕显示(否则无论怎么绘制,还是什么都看不到)。如果使用GLUT工具包,也可以很轻松的完成这一工作,只要在绘制完成时简单的调用glutSwapBuffers函数就可以了

No comments:

Post a Comment