- #include<windows.h>
- #include<gl/glut.h>
- #include<gl/gl.h>
- #include<gl/glu.h>
- GLfloat x1 = 100.0f; //指定正方形的位置和大小
- GLfloat y1 = 150.0f;
- GLsizei size = 50;
- GLfloat xstep = 5.0f; //正方形运动的速度
- GLfloat ystep = 5.0f;
- void RenderScene(void)
- {
- glClear(GL_COLOR_BUFFER_BIT);
- glColor3f(1.0f, 0.0f, 0.0f);
- glRectf(x1, y1, x1+size, y1+size);
- glutSwapBuffers(); //清空命令缓冲区并交换帧缓存,代替了glFlush()函数
- }
- void ChangeSize(GLsizei w, GLsizei h)
- {
- if(h==0) h==1;
-
- glViewport(0, 0, w, h);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- if(w <= h)
- {
- windowHeight = 250.0f * h/w;
- windowWidth = 250.0f;
- }
- else
- {
- windowHeight = 250.0f *w/h;
- windowWidth = 250.0f;
- }
- glOrtho(0.0f, windowWidth, 0.0f, windowHeight, 1.0f, -1.0f);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- }
- void TimerFunction(int value)
- {
- if(x1 > windowWidth-size || x1 <0) xstep = -xstep; //到边界时,使之反弹
- if(y1 > windowHeight-size || y1 <0) ystep = -ystep;
- if(x1 > windowWidth-size) x1 > windowWidth-size-1;
- if(y1 > windowHeight-size) y1 > windowHeight-size-1;
- x1 += xstep; //根据步长修改正方形的位置
- y1 += ystep;
- glutPostRedisplay(); //只要窗口大小改变,它就通知GLUT可以进行场景渲染了
- glutTimerFunc(33, TimerFunction, 1); //因为只激发一次,所以需要重新调用
- }
- void SetupRC(void)
- {
- glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
- }
- int main(void)
- {
- glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); //设置为双缓冲区窗口
- glutCreateWindow("移动的正方形");
- glutDisplayFunc(RenderScene);
- glutReshapeFunc(ChangeSize);
- glutTimerFunc(33, TimerFunction, 1);
- SetupRC();
- glutMainLoop();
- }
-
【说明】
1. 创建一个循环,在每次调用显示回调函数之前改变正方形的位置,使其看起来像在窗口中移动。为了不断调用显示回调函 数,需要使用GLUT的库函数:glutTimerFunc(),该函数用于指定一个定时器回调函数,经过33ms调用一次。
2. glutSwapBuffers():双缓冲区,在后台缓冲区进行渲染,然后在结束时交换到前台。这种形式能防止观察者看 到可能伴随着动画帧与动画帧之间闪烁的渲染过程,比较平滑。