opengl重新绘制窗口:
void timerProc(int id)
{
//display();
glutPostRedisplay();
glutTimerFunc(10,timerProc,1);//需要在函数中再调用一次,才能保证循环
}
int main(int argc, char** argv)
{
//int k=0;
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize (800, 800);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
init ();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutTimerFunc(100,timerProc,1); //glutTimerFunc(毫秒数, 回调函数指针, 区别值);
//主函数中 注册回调函数:
// glutKeyboardFunc(KeyFunc); 键盘按键
glutMouseFunc(MouseFunc); //鼠标按键
glutMotionFunc(MouseMotion); //鼠标移动并在 渲染函数 开始处调用:
glMatrixMode(GL_MODELVIEW);
LookAt();
glutMainLoop();
exit(0);
}
glutPostRedisplay 标记当前窗口需要重新绘制。通过glutMainLoop下一次循环时,窗口显示将被回调以重新显示窗口的正常面板。多次调用glutPostRedisplay,在下一个显示回调只产生单一的重新显示回调。
有了glutPostRedisplay函数,和mainloop,则会反复调用glutDisplayFunc(display);
代码也可以改为如下形式,将display()放在 timerProc函数里面:
void timerProc(int id)
{
display();
glutTimerFunc(10,timerProc,1);//需要在函数中再调用一次,才能保证循环
}
int main(int argc, char** argv)
{
//int k=0;
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize (800, 800);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
init ();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutTimerFunc(100,timerProc,1); //glutTimerFunc(毫秒数, 回调函数指针, 区别值);
//主函数中 注册回调函数:
// glutKeyboardFunc(KeyFunc); 键盘按键
glutMouseFunc(MouseFunc); //鼠标按键
glutMotionFunc(MouseMotion); //鼠标移动并在 渲染函数 开始处调用:
glMatrixMode(GL_MODELVIEW);
LookAt();
glutMainLoop();
exit(0);
}
这样不需要main函数里面带有glutPostRedisplay();