【前言】
上一节中我们使用的glut,当时不太理解为什么学opengl非得用这个开发包,后来看完第一章才明白。
由于opengl是跨平台的,并且用于窗口界面中的绘制。但窗口与系统有关心,那么将无法统一,所以opengl是核心库,它只负责绘制。窗口操作交给其他程序接口去负责,windows上使用了glut来封装opengl使其能与系统交互。
以上是个人理解,仅供参考。
【正文】
上一节中我们在glutInitDisplayMode函数里设置了GLUT_DOUBLE,这就是双缓冲标识。
双缓冲使得窗口显示一个缓存内容时,另一个缓存加载下一次要显示的内容。这样来回切换时,衔接会很顺畅感觉舒服。
双缓冲在动画上体现得多,下面我们用代码例子来感受一下。
【例子】
static GLfloat spin = 0.0; static GLfloat col = 0.0; void init() { glClearColor(0.0, 0.0, 0.0, 0.0); glShadeModel(GL_FLAT); } void display() { glClear(GL_COLOR_BUFFER_BIT); glPushMatrix(); glRotated(spin, 0.0, 0.0, 1.0); glColor3f(col, 1, 1); glRectf(-25, -25, 25, 25); glPopMatrix(); glutSwapBuffers(); } void spinDisplay() { spin += 2.0; if(spin >= 360.0) spin -= 360.0; col += 0.1; if(col > 1.0) col -= 1.0; glutPostRedisplay(); } void reshape(GLsizei w,GLsizei h) { glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); //改变投影矩阵 glOrtho(-50,50,-50,50,-1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void mouse(int button, int state, int x, int y) { switch(button) { case GLUT_LEFT_BUTTON: if(state == GLUT_DOWN) glutIdleFunc(spinDisplay); break; case GLUT_RIGHT_BUTTON: break; case GLUT_MIDDLE_BUTTON: if(state == GLUT_DOWN) glutIdleFunc(NULL); break; default: break; } } int _tmain(int argc, char* argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); glutInitWindowPosition(500, 250); glutInitWindowSize(400, 400); glutCreateWindow("OpenGL程序"); glutDisplayFunc(&display); glutReshapeFunc(&reshape); glutMouseFunc(&mouse); glutMainLoop(); return 0; }【效果】
【总结】
本节主要了解glut和双缓冲的意义。
掌握以下几个函数的使用:
glutSwapBuffers()
glutPostRedisplay()
glutIdleFunc()