2d HUD не рисует должным образом через QGLWidget (используя QPainter) - PullRequest
6 голосов
/ 19 мая 2010

Я пытаюсь отобразить HUD поверх моей 3D-игры. Для начала я просто пытаюсь отобразить «Hello World», но пока не добился успеха! Сцена застывает / мерцает, как только я закончу.

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

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

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

  • вызывать paint.drawText ()
  • Промывка с использованием paint.end ()

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


Код: makeCurrent (); glMatrixMode (GL_MODELVIEW); glPushMatrix (); * 1 035 *

 //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();

Спасибо

1 Ответ

10 голосов
/ 24 мая 2010

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

Пожалуйста, следуйте примеру перекраски как есть. Если вы посмотрите на код в примере, то заметите, что в конструкторе таймер 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(...))

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

...