我目前正在创建一个NTSC信号解码器/模拟器,基本上,我希望能够在渲染之前准备好帧,例如读取数组,处理数据,相应绘制一些像素然后渲染帧。我试图摆脱glutMainLoop();
的事情,而只是使用一个手工循环:
for(;;) {
glClearColor(0.0f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Whatever I might have to do goes somewhere in here
glFlush();
}
但是,这不起作用,
glClearColor
和glClear
,也可能被执行glFlush
,但是只有一次,在此之后,程序只是挂起了,我该怎么办才能避免这种情况? 最佳答案
这是一个坏主意,因为通常在使用GLUT时获得事件处理的唯一方法是glutMainLoop()
。
参见 glutMainLoop
:
请注意,glutMainLoop()
不仅会调用glutDisplayFunc
设置的回调函数,还会接收并处理IO事件(如鼠标和键盘事件)。如果您不使用glutMainLoop()
,那么您将没有事件处理,当然也没有IO事件处理。这导致程序似乎挂起,并且对任何输入均不响应。
您必须使用glutMainLoop()
或切换另一个窗口API(例如GLFW),在其中您可以通过 glfwPollEvents()
显式激活事件处理。
GLut的较新实现(例如freeglut)提供了一些其他功能。 glutMainLoopEvent()
与glutMainLoop()
相同,但仅执行一次。它只对事件循环进行一次迭代,并立即将控制权交还给用户。因此,您可以实现自己的循环处理您的应用程序。
例如
void display( void )
{
glClearColor(0.0f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Whatever I might have to do goes somewhere in here
glFlush();
}
int main()
{
.....
glutDisplayFunc(display);
.....
for(;;)
{
glutMainLoopEvent(); // handle the main loop once
glutPostRedisplay(); // cause `display` to be called in `glutMainLoopEvent`
}
.....
}
甚至可以设置一个不显示任何内容的虚拟显示功能,并在循环中进行绘制:
例如
void dummyDisplay( void )
{
// does nothing
}
int main()
{
.....
glutDisplayFunc(dummyDisplay);
.....
for(;;)
{
glClearColor(0.0f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Whatever I might have to do goes somewhere in here
glFlush();
glutMainLoopEvent(); // does the event handling once
}
.....
}