У OpenGL Render пока курсор в GLUT UI - PullRequest
0 голосов
/ 28 июля 2011

У меня есть главное окно, в котором верхний 10% экрана имеет перенасыщенный пользовательский интерфейс, а в нижних 90% экрана - мир openGL. Каждый раз, когда мой курсор начинает зависать над частью GLUT, рендеринг openGL останавливается. Он возобновляется только тогда, когда курсор выходит из области GLUT.

Это потому, что, пока курсор находится над областью GLUT, предположительно glutIdleFunc никогда не вызывается, потому что glut не "простаивает", поэтому материал openGL не отображается.

Я уже пытался создать новый несвязанный поток, который просто вызывает код дисплея и / или glutPostRedisplay, но я получил частоту кадров в 20 кадров в секунду, в отличие от 100 + кадров в секунду обычным способом. Я не знаю точно, почему. (В этом тесте я также отключил glutIdleFunc, поэтому нет функции ожидания, просто отдельный поток, вызывающий отображение)

Способы обойти это (кроме «прекратить использовать перенасыщение», которое я мог бы сделать в будущем, но сейчас я бы хотел временное решение)?

Ответы [ 2 ]

2 голосов
/ 22 ноября 2014

Я знаю, что это старый вопрос, но у меня была похожая проблема, и я хотел рассказать, как я ее решил.

По сути, в своей функции ожидания вы должны вручную установить для окна обычный идентификатор окна. Спасибо коду HexPlanet Джоэля Дэвиса (https://github.com/joeld42/hexplanet/) за демонстрацию этого:

void glut_Idle( void )
{
  // According to the GLUT specification, the current window is 
  // undefined during an idle callback.  So we need to explicitly change
  // it if necessary
  if ( glutGetWindow() != g_glutMainWin ) 
  {
    glutSetWindow(g_glutMainWin);  
  }

  ...
}
0 голосов
/ 29 июля 2011

Создать функцию обратного вызова для функции пассивного движения:

void passiveMouseFunc(int,int){
    glutPostRedisplay();
}

и зарегистрировать его, используя:

glutPassiveMotionFunc(passiveMouseFunc);
...