2010-05-18 15 views
6

Sto provando a visualizzare l'HUD sul mio gioco 3D. Per cominciare, sto solo cercando di visualizzare "Hello World", ma non ho ancora avuto alcun successo! La scena si blocca/sfarfalla una volta che ho finito.2d HUD che non si disegnano correttamente su QGLWidget (usando QPainter)

Sto usando Qt/C++ e QGLWdiget/QPainter per fare questo. Ho usato overpainting example come riferimento per iniziare. Ecco quello che faccio:

  • Override paintEvent (...) nel mio sottoclasse GameGL Classe (GameGL: QGLWidget pubblico)
  • push matrice openGL modelview come la matrice corrente
  • consentono parametri come GL_DEPTH_TEST
  • rendere il mio gioco (:: paintGL1())
  • disabilitare i parametri modelview
  • matrice pop modelview

  • Marchio oggetto QPainter

  • richiamare paint.drawText()
  • Flush utilizzando paint.end()

Questo è più o meno lo stesso, come indicato nell'esempio. Tuttavia, quando eseguo questo codice, si verifica il congelamento/sfarfallio ed è altamente non reattivo. Qualcuno avrebbe qualche idea sul perché questo potrebbe accadere? Mi piacerebbe davvero avere qualche aiuto.


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

Grazie

risposta

10

Per chi è ancora alle prese con questo e sono imbattuto in questo post: ecco come ho risolto ::

Si prega di seguire l'esempio sovraverniciatura come è. Se si guarda il codice nell'esempio, si noterà nel costruttore un timer timeout() SIGNAL connesso a animate() SLOT. Se si guarda da vicino lo slot animato(), esso chiama a turno update() a.k.a GLWidget::update(). Se segui la documentazione per GLWidget :: update(); questa chiamata in entrata chiama paintEvent(...).

Questo sfondo è importante ed è stato il pezzo mancante al mio problema. Prima stavo usando paintGL (...) per disegnare la mia scena da quando avevo cancellato GLWidget. Per supportare animazioni o aggiornamenti sulla mia scena, avevo collegato il timer ad updateGL(). Questo è stato a turni invocando paintGL() via glDraw(). Questa era la causa principale di tutti i problemi.

Il codice come avevo scritto stava chiamando paintGL() ancora e ancora. Seguendo l'esempio di sovra-pittura, mi sono sbarazzato completamente del metodo paintGL e sono passato invece alla metodologia di rendering paintEvent (...). Pertanto, per mantenere le cose in sincrono, ho dovuto chiamare update() (anziché updateGL()) per far funzionare le cose. Nel momento in cui ho effettuato questa transizione, le cose hanno iniziato a funzionare come previsto.(GLWidget::update() chiamate paintEvent(...))

Spero che ti abbia aiutato un po '. Se ancora non funziona per te o hai bisogno di ulteriori spiegazioni, lasciami un commento qui e cercherò di aiutarti.

+0

Potete per favore dare un'occhiata a [questo thread] (http://stackoverflow.com/q/8446437/176769)? – karlphillip

Problemi correlati