我目前正在创建一个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();
}

但是,这不起作用,glClearColorglClear,也可能被执行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
    }

    .....
}

10-08 09:17