【前言】
上一节中我们使用的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()