2010-05-18 3 views
6

J'essaie d'afficher HUD sur ma partie 3D. Pour commencer, j'essaie juste d'afficher "Hello World", mais je n'ai pas encore eu de succès! La scène gèle/scintille une fois que j'ai terminé. J'utilise Qt/C++ et QGLWdiget/QPainter pour y arriver. J'ai utilisé overpainting example comme référence pour commencer. Voici ce que je fais:2d HUD ne dessine pas correctement sur QGLWidget (avec QPainter)

  • override paintEvent (...) dans mon sous-classé GameGL classe (GameGL: QGLWidget public)
  • Poussez la matrice openGL MODELVIEW comme la matrice actuelle
  • permettent paramètres comme gl_depth_test
  • rendre mon jeu (:: paintGL1())
  • désactiver les paramètres de MODELVIEW
  • matrice modelview pop

  • Marque objet QPainter

  • invoquer paint.drawText()
  • Rincer à l'aide paint.end()

C'est à peu près le même que celui mentionné dans l'exemple. Cependant, lorsque j'exécute ce code, il subit un gel/scintillement et est très peu réactif. Quelqu'un aurait-il une idée de la raison pour laquelle cela pourrait se produire? J'apprécierais vraiment toute aide.


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

Merci

Répondre

10

Pour toute personne qui est toujours aux prises avec cela et est tombé sur ce poste: voici comment je l'ai résolu ::

S'il vous plaît suivre l'exemple surpeint comme il est. Si vous regardez le code dans l'exemple, vous remarquerez dans le constructeur, un minuteur timeout() SIGNAL est connecté à animate() SLOT. Si vous regardez attentivement la fente animate(), elle appelle update() a.k.a GLWidget::update(). Si vous suivez la documentation de GLWidget :: update(); ceci appelle à son tour paintEvent(...).

Cet arrière-plan est important et était la pièce manquante à mon problème. J'utilisais auparavant paintGL (...) pour dessiner ma scène puisque j'avais remplacé GLWidget. Pour soutenir l'animation ou les mises à jour de ma scène, j'avais connecté la minuterie à updateGL(). Cela appelait alternativement paintGL() via glDraw(). C'était la cause première de tous les problèmes.

Le code que j'avais écrit appelait paintGL() encore et encore. Après un exemple de peinture, je me suis complètement débarrassé de la méthode paintGL et je suis passé à la méthode de rendu paintEvent (...). Ainsi, pour garder les choses synchronisées, j'ai dû appeler update() (au lieu de updateGL()) pour que les choses fonctionnent. La minute où j'ai fait cette transition, les choses ont commencé à fonctionner comme prévu.(GLWidget::update() appels paintEvent(...))

J'espère que cela vous a aidé un peu. Si cela ne fonctionne toujours pas pour vous ou si vous avez besoin de plus d'explications, laissez-moi un commentaire ici et je vais essayer de vous aider.

+0

Pouvez-vous jeter un coup d'œil à [ce fil] (http://stackoverflow.com/q/8446437/176769)? – karlphillip

Questions connexes