文章来源:http://baike.baidu.com/link?url=F-0esBBzkOr-JXsCG8pqUCD84ZQHWzCMbSHPTYsdtHkvZuUVGIoKmZJk6Hf9dGIwCoxqMb-5NciZ5qILzHKr2a
计算机学
1函数简介编辑
通常, 我们所看到的窗体、文字、图像,从根本上来说都是“画”出来的。比如,制作一个简单的五子棋, 我们可能先要绘制棋盘,然后绘制棋子,我们可能还要绘制一些提示信息。虽然这些绘制操作有一定的先后顺序,通常情况下,操作系统的这些绘制速度非常的快,使人眼误认为这些绘制操作是同时完成的。
但当我们进行复杂的绘图操作时,画面便可能有明显的闪烁。解决这个问题的关键在于使绘制的东西同时出现在
屏幕上。所谓
双缓冲技术, 是指使用两个缓冲区: 前台缓冲和后台缓冲。前台缓冲即我们看到的屏幕,后台缓冲则在内存当中,对我们来说是不可见的。每次的所有绘图操作都在后台缓冲中进行, 当绘制完成时, 把绘制的最终结果复制到
屏幕上, 这样, 我们看到所有GDI元素同时出现在屏幕上,从而解决了频繁刷新导致的画面闪烁问题。
在OpenGL中实现
双缓冲技术的一种简单方法:
1.在调用
glutInitDisplayMode函数时, 开启GLUT_DOUBLE,即
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);。这里将我们惯用的GLUT_SINGLE替换为GLUT_DOUBLE,意为要使用
双缓冲而非单缓冲。
2. 调用
glutDisplayFunc(display)注册
回调函数时, 在回调函数中所有绘制操作完成后调用glutSwapBuffers()交换两个缓冲区指针。
3. 调用
glutIdleFunc注册一个空闲时绘制操作函数, 注册的这个函数再调用display函数。
2程序示例编辑
#include <windows.h>
#include <GL/glut.h>
int day = 200; // 0~360
void display(void)
{
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(75, 1, 1, 400);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, -200, 200, 0, 0, 0, 0, 0, 1);
glColor3f(1.0f, 0.0f, 0.0f);
glutWireSphere(35, 30, 30);
glColor3f(0.0f, 0.0f, 1.0f);
glRotatef(day / 360.0 * 360.0, 0.0f, 0.0f, -1.0f);
glTranslatef(120, 0.0f, 0.0f);
glutWireSphere(15, 25, 25);
glColor3f(1.0f, 1.0f, 0.0f);
glRotatef(day / 30.0 * 360.0 - day / 360.0 * 360.0, 0.0f, 0.0f, -1.0f);
glTranslatef(32, 0.0f, 0.0f);
glutWireSphere(10, 10, 10);
glFlush();
glutSwapBuffers();
}
void idle(void)
{
++day;
if( day >= 360 ) {
day = 0;
}
display();
Sleep(20);
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(640, 500);
glutCreateWindow("12");
glutDisplayFunc(display);
glutIdleFunc(idle);
glutMainLoop();
return 0;
}
词条标签: