Предоставить кадр по требованию - PullRequest
0 голосов
/ 24 октября 2018

В настоящее время я создаю декодер / симулятор сигналов 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 выполнить, но только один раз, после этого, программа просто зависает, что я могу сделать, чтобы избежать этого?

1 Ответ

0 голосов
/ 24 октября 2018

Я пытался избавиться от вещи glutMainLoop();, и просто использовал цикл ручной работы
... после этого программа просто зависает ...

Это плохая идея, потому что в общем случае единственный способ получить обработку события при использовании GLUT - это glutMainLoop().

См. glutMainLoop:

glutMainLoop входит в цикл обработки событий GLUT.Эта процедура должна вызываться не более одного раза в программе GLUT.После вызова эта процедура никогда не вернется.При необходимости он будет вызывать любые обратные вызовы, которые были зарегистрированы.

Обратите внимание, glutMainLoop() не только вызывает функцию обратного вызова, которую вы установили с помощью glutDisplayFunc, но также принимает и обрабатываетСобытия ввода-вывода, такие как события мыши и клавиатуры.Если вы не используете glutMainLoop(), то у вас нет обработки событий и, конечно, нет обработки событий ввода-вывода.Это приводит к тому, что программа, кажется, зависает и не реагирует ни на какой ввод.
Либо вы должны использовать 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`
    }

    .....
}

Можно даже установить функцию отображения dummy , которая ничего не делает, и делатьчертеж в цикле:

например

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
    }

    .....
}
...