glutDisplayFunc()
вызывает ваш обратный вызов только тогда, когда ОС требует перерисовки вашего окна.Если вам нужны более регулярные вызовы, вам нужно инициировать их самостоятельно с помощью glutPostRedisplay()
:
... Когда GLUT определяет, что нормальную плоскость для окна необходимо повторно отобразить,вызывается обратный вызов дисплея для окна....
...
GLUT определяет, когда обратный вызов дисплея должен быть запущен, на основе состояния повторного отображения окна.Состояние повторного отображения для окна может быть установлено явно, путем вызова glutPostRedisplay
или неявно, как результат повреждения окна, сообщенного оконной системой.GLUT объединяет несколько опубликованных повторных отображений для окна, чтобы минимизировать количество вызываемых обратных вызовов.
Мне нравится использовать glutTimerFunc()
для периодического вызова glutPostRedisplay()
:
#include <GL/glut.h>
#include <cstdlib>
void timer( int value )
{
glutPostRedisplay();
glutTimerFunc( 16, timer, 0 );
}
void display()
{
glClearColor( 0.2, 0.2, 0.2, 1 );
glClear( GL_COLOR_BUFFER_BIT );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glBegin( GL_POLYGON );
glColor3ub( rand(), rand(), rand() );
glVertex3f( 0.25, 0.25, 0.0 );
glVertex3f( 0.75, 0.25, 0.0 );
glVertex3f( 0.75, 0.75, 0.0 );
glVertex3f( 0.25, 0.75, 0.0 );
glEnd();
glColor3f( 0.0, 0.0, 0.0 );
glRectf( 0.45, 0.25, 0.55, 0.05 );
glRectf( 0.35, 0.08, 0.65, 0.02 );
glutSwapBuffers();
}
int main( int argc, char** argv )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE );
glutInitWindowSize( 250, 250 );
glutCreateWindow( "GLUT" );
glutDisplayFunc( display );
glutTimerFunc( 0, timer, 0 );
glutMainLoop();
return 0;
}