Я пытаюсь отобразить HUD по своей 3D игре. Для начала, я просто пытаюсь отобразить "Привет Мир", но я еще не имел никакого успеха! Сцена замораживается / мерцания, после того как я сделан.
Я использую QT/C++ и QGLWdiget / QPainter, чтобы сделать это. Я использовал пример сверхрисования в качестве своей ссылки для начала работы. Вот то, что я делаю:
вытолкайте modelview матрицу
Сделайте объект QPainter
Это - в значительной степени то же, как упомянуто в примере. Однако, когда я выполняю этот код, он испытывает замораживание / мерцание и очень безразличен. У кого-либо была бы какая-либо идея относительно того, почему это могло бы происходить? Я был бы действительно 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();
Спасибо
Для тех, кто все еще борется с этим и натолкнулся на этот пост: вот как я решил эту проблему ::
Пожалуйста, следуйте примеру перерисовки как есть. Если вы посмотрите на код в примере, то заметите в конструкторе таймер 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 (...)
)
Я надеюсь, что это помогло вам хоть немного. Если это все еще не работает для вас или вам нужно другое объяснение, оставьте мне комментарий здесь, и я постараюсь помочь.