如何关闭openGL窗口

时间:2017-01-02 23:19:22

标签: c opengl freeglut

在这里,我有两个循环。第一个循环处理图形几秒钟,然后代码进入第二个循环。我在第一个循环中通过glutMainLoopEvent处理图形事件。在第二个循环开始之前,我想关闭图形窗口。似乎命令glutLeaveMainLoop无法关闭窗口。我应该使用什么其他功能在第一次循环后立即关闭窗口?

#include <stdio.h>
#include <GL/freeglut.h>
#include <boost/thread/thread.hpp> // for sleep

void cback_render()
{
    if(!glutGetWindow())
        return ;
    static float rotations = 0;

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();
    glRotatef(rotations, 0, 0, 1);

    glBegin(GL_TRIANGLES);
        glVertex3f(0,0,0);
        glVertex3f(1,0,0);
        glVertex3f(0,1,0);
    glEnd();

    glutSwapBuffers();

    if (++rotations > 360) rotations -= 360;
}

void timer(int )
{
    if(!glutGetWindow())
        return ;
    glutPostRedisplay();
    glutMainLoopEvent();
    glutTimerFunc(30, timer, 1);
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(512, 512);
    glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS);

    glutCreateWindow("freegluttest");
    glutDisplayFunc (cback_render);
    glutTimerFunc(30, timer, 1);

    long i=0;
    while(glutGetWindow() && i< 30)
    {
        printf("[%ld]\n",i);
        i++;
        glutMainLoopEvent();
        boost::this_thread::sleep( boost::posix_time::milliseconds(100) );
    }
    glutMainLoopEvent();

    glutLeaveMainLoop(); // does not work
    glutMainLoopEvent();

    // do something else ....
    while(1)
    {
        // other calculations
        boost::this_thread::sleep( boost::posix_time::milliseconds(100) );
    }

    return 0;
}

1 个答案:

答案 0 :(得分:1)

来自http://freeglut.sourceforge.net/docs/api.php#EventProcessing

的freeglut文档

您正在使用的功能glutLeaveMainLoop()只是停止过剩的主循环,如果它由glutMainLoop()启动而不是glutMainLoopEvent()

由于您在示例中自己控制循环,glutLeaveMainLoop()不会做任何事情。

  

它旨在留下过剩的主要环路,如果过剩控制不是你。

由于最后有一个while(1),睡眠时间为100毫秒,因此在渲染完所有帧后,应用程序将无法执行任何操作。如果要销毁窗口,请使用一些窗口函数,如glutDestroyWindow()