Понимание взаимосвязи между glutDisplayFunc и glutPostRedisplay - PullRequest
10 голосов
/ 17 ноября 2010

Читая книгу, я обнаружил:

glutDisplayFunc (void (* func) (void)) - первая и самая важная функция обратного вызова события, которую вы увидите.Всякий раз, когда GLUT определяет, что содержимое окна необходимо повторно отобразить, выполняется функция обратного вызова, зарегистрированная функцией glutDisplayFunc ().Поэтому вы должны поместить все процедуры, необходимые для перерисовки сцены, в функцию обратного вызова дисплея.

Если ваша программа изменяет содержимое окна, иногда вам придется вызывать glutPostRedisplay (), которая дает glutMainLoop () толчок для вызова зарегистрированного обратного вызова дисплея при его следующей возможности

В какое время следует вызывать glutPostRedisplay ()?Из этого абзаца я не понимаю, зачем нужна его функциональность.

Ответы [ 2 ]

16 голосов
/ 17 ноября 2010

glutDisplayFunc вызывается всякий раз, когда ваше окно должно быть перерисовано.Это включает в себя время, когда кто-то вызывает glutPostRedisplay:)

Когда нужно перерисовывать окно?

  • Когда его размер изменяется
  • , когда он становится видимым
  • , когда некоторые его части становятся видимыми
  • , когда он перемещается
  • и т. Д.

Но что если ваша функция отображения закрашивает треугольник в позиции x; y, где x; y;определяются позицией мыши?В этом случае вы должны попросить систему перерисовать окно при каждом перемещении мыши, верно?Вот почему вы будете вызывать glutPostRedisplay из MouseFunc ().На самом деле, когда вы вызываете glutPostRedisplay, событие перерисовки ставится в очередь вместе с другими событиями окна, такими как щелчок мыши и т.д.По сути, ваш mainLoop выбирает события из этой очереди и вызывает их обработчики

3 голосов
/ 17 ноября 2010

Функция, которую вы передаете glutDisplayFunc, вызывается только так, как она необходима: это означает, что когда размер окна изменяется или когда другое окно скрыло его. Например, если вы используете glutMouseFunc, возможно, вы захотите обновить (перерисовать) содержимое окна в соответствии с этими кликами. Кроме того, если вы рисуете анимацию, вам нужно вызвать glutPostRedisplay из функции ожидания.

...