2010-05-18 9 views
6

Ich versuche, HUD über mein 3D-Spiel anzuzeigen. Für den Anfang versuche ich nur "Hallo Welt" anzuzeigen, aber ich hatte noch keinen Erfolg! Die Szene erstarrt/flackert, sobald ich fertig bin.2d HUD nicht ordnungsgemäß über QGLWidget zeichnen (mit QPainter)

Ich verwende Qt/C++ und QGLWdiget/QPainter, um dies zu tun. Ich habe overpainting example als meine Referenz verwendet, um loszulegen. Hier ist, was ich tue:

  • Überschreibung paintEventO (...) in meinem eigenen subclassed GameGL Klasse (GameGL: public QGLWidget)
  • Push-openGL Modelview Matrix als die aktuelle Matrix
  • ermöglichen Parameter wie GL_DEPTH_TEST
  • mein Spiel machen (:: paintGL1())
  • die Model-View-Parameter deaktivieren
  • pop Model-View-Matrix

  • Fabrikat QPainter Objekt

  • aufrufen paint.drawText()
  • Flush mit paint.end()

Das ist so ziemlich das gleiche wie in dem Beispiel erwähnt. Wenn ich diesen Code ausführe, erleidet er jedoch ein Einfrieren/Flackern und reagiert sehr unempfindlich. Hätte jemand eine Idee, warum das passieren könnte? Ich würde wirklich jede Hilfe schätzen.


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

Danke

Antwort

10

Für alle, die immer noch mit diesem und kam in diesem Beitrag kämpft: hier ist, wie ich es gelöst ::

Bitte folgen Sie dem Übermalung Beispiel gibt. Wenn Sie sich den Code im Beispiel ansehen, würden Sie im Konstruktor feststellen, dass ein Timer timeout() SIGNAL mit animate() SLOT verbunden ist. Wenn Sie sich den animated() - Slot genauer ansehen, ruft er wiederum update() a.k.a GLWidget::update() auf. Wenn Sie der Dokumentation für GLWidget :: update() folgen; Diese wiederum ruft paintEvent(...).

Dieser Hintergrund ist wichtig und war das fehlende Teil zu meinem Problem. Ich habe früher mit paintGL (...) meine Szene gezeichnet, seit ich GLWidget überschrieben habe. Um Animation oder Updates meiner Szene zu unterstützen, hatte ich den Timer mit updateGL() verbunden. Dies führte wiederum dazu, dass paintGL() über glDraw() aufgerufen wurde. Dies war die Ursache aller Probleme.

Der Code, wie ich geschrieben hatte, rief paintGL() immer wieder auf. Nach dem Übermalen wurde die paintGL-Methode komplett entfernt und stattdessen auf die paintEvent (...) Rendering-Methode umgestellt. Um die Dinge synchron zu halten, musste ich also update() aufrufen (statt updateGL()), damit alles funktioniert. In der Minute, in der ich diesen Übergang vollzog, funktionierten die Dinge wie erwartet.(GLWidget::update() Anrufe paintEvent(...))

Ich hoffe, es hat Ihnen ein bisschen geholfen. Wenn es immer noch nicht für Sie funktioniert oder eine weitere Erklärung benötigt, hinterlassen Sie mir hier einen Kommentar und ich werde versuchen zu helfen.

+0

Können Sie sich bitte [dieses Thema] (http://stackoverflow.com/q/8446437/176769) ansehen? – karlphillip