2-й HUD, не тянущий правильно по QGLWidget (использующий QPainter)

Я пытаюсь отобразить HUD по своей 3D игре. Для начала, я просто пытаюсь отобразить "Привет Мир", но я еще не имел никакого успеха! Сцена замораживается / мерцания, после того как я сделан.

Я использую QT/C++ и QGLWdiget / QPainter, чтобы сделать это. Я использовал пример сверхрисования в качестве своей ссылки для начала работы. Вот то, что я делаю:

  • переопределите paintEvent (...) в моем собственном разделенном на подклассы Классе GameGL (GameGL: общедоступный QGLWidget)
  • Продвиньте матрицу openGL ModelView как текущую матрицу
  • включите параметры как gl_depth_test
  • представьте мою игру (:: paintGL1 ())
  • отключите modelview параметры
  • вытолкайте modelview матрицу

  • Сделайте объект QPainter

  • вызовите paint.drawText ()
  • Сброс с помощью paint.end ()

Это - в значительной степени то же, как упомянуто в примере. Однако, когда я выполняю этот код, он испытывает замораживание / мерцание и очень безразличен. У кого-либо была бы какая-либо идея относительно того, почему это могло бы происходить? Я был бы действительно appreaciate любая справка.


Code:makeCurrent (); glMatrixMode (GL_MODELVIEW); glPushMatrix ();

 //Black background
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);//.50f, 1.0f );
//glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
//glEnable(GL_CULL_FACE);
glEnable(GL_LIGHTING);
m_pLight->SetupLight(GL_AMBIENT | GL_DIFFUSE | GL_SPECULAR);

glEnableClientState( GL_INDEX_ARRAY );
glEnableClientState( GL_VERTEX_ARRAY );

resizeGL( width(), height() );

paintGL1();

 //glShadeModel(GL_FLAT);
 glDisable(GL_DEPTH_TEST);
 //glDisable(GL_CULL_FACE);
 glDisable(GL_LIGHTING);
 glDisableClientState( GL_INDEX_ARRAY );
 glDisableClientState( GL_VERTEX_ARRAY );

 glMatrixMode(GL_MODELVIEW);
 glPopMatrix();

 QPainter painter(this);

 painter.setRenderHint(QPainter::Antialiasing);
 painter.drawText(100, 50, QString("Hello"));
 painter.end();

Спасибо

6
задан brainydexter 18 May 2010 в 22:02
поделиться

1 ответ

Для тех, кто все еще борется с этим и натолкнулся на этот пост: вот как я решил эту проблему ::

Пожалуйста, следуйте примеру перерисовки как есть. Если вы посмотрите на код в примере, то заметите в конструкторе таймер timeout () SIGNAL, подключенный к animate () SLOT. Если вы внимательно посмотрите на слот animate (), он, в свою очередь, вызывает update () a.k.a GLWidget :: update () . Если вы следуете документации для GLWidget :: update (); это, в свою очередь, вызывает paintEvent (...) .

Эта предыстория важна и была недостающей частью моей проблемы. Раньше я использовал paintGL (...) для рисования моей сцены, так как я переопределил GLWidget. Для поддержки анимации или обновлений моей сцены я подключил таймер к updateGL (). Это, в свою очередь, вызвало paintGL () через glDraw (). Это было первопричиной всех проблем.

Код, который я написал, снова и снова вызывает paintGL ().Следуя примеру перерисовки, я полностью избавился от метода paintGL и вместо этого переключился на методологию отрисовки paintEvent (...). Таким образом, чтобы все было синхронизировано, мне пришлось вызвать update () (вместо updateGL ()), чтобы все заработало. Как только я осуществил этот переход, все заработало, как ожидалось. ( GLWidget :: update () вызывает paintEvent (...) )

Я надеюсь, что это помогло вам хоть немного. Если это все еще не работает для вас или вам нужно другое объяснение, оставьте мне комментарий здесь, и я постараюсь помочь.

10
ответ дан 10 December 2019 в 00:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: