2010-05-18 9 views
6

Estoy intentando mostrar HUD sobre mi juego 3D. Para empezar, solo intento mostrar "Hello World", pero aún no he tenido éxito. La escena se congela/parpadea una vez que he terminado.2d HUD no dibujando correctamente sobre QGLWidget (usando QPainter)

Estoy usando Qt/C++ y QGLWdiget/QPainter para hacer esto. He utilizado overpainting example como referencia para comenzar. Aquí es lo que hago:

  • paintEvent anulación (...) en mi propia subclase GameGL Clase (GameGL: QGLWidget pública)
  • empuje matriz de OpenGL modelview como la matriz actual
  • permiten parámetros como gl_depth_test
  • hacer mi juego (:: paintGL1())
  • desactivar los parámetros modelview
  • matriz modelview pop

  • Make objeto QPainter

  • invocar paint.drawText()
  • Flush usando paint.end()

Esto es prácticamente la misma como se ha mencionado en el ejemplo. Sin embargo, cuando ejecuto este código, experimenta congelación/parpadeo y es muy poco receptivo. ¿Alguien tiene alguna idea de por qué esto podría estar pasando? Realmente apreciaría cualquier ayuda.


Código: 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(); 

Gracias

Respuesta

10

Para cualquier persona que todavía está luchando con esto y encontré con este aviso: aquí es cómo lo resolví ::

Por favor, siga el ejemplo Pintabilidad como es. Si observa el código en el ejemplo, notará en el constructor, un temporizador timeout() SIGNAL está conectado a animate() SLOT. Si observa detenidamente la ranura animada(), in-turn llama al update() a.k.a GLWidget::update(). Si sigue la documentación para GLWidget :: update(); esto a su vez llama al paintEvent(...).

Este fondo es importante y fue la pieza que falta a mi problema. Antes usaba paintGL (...) para dibujar mi escena ya que tenía GLwidget anulado. Para admitir animaciones o actualizaciones de mi escena, conecté el temporizador a updateGL(). Esto fue a su vez invocando paintGL() a través de glDraw(). Esta fue la causa raíz de todos los problemas.

El código como lo había escrito estaba llamando a paintGL() una y otra vez. Siguiendo el ejemplo de la sobreimpresión, me deshice completamente del método paintGL y cambié a la metodología de representación paintEvent (...). Por lo tanto, para mantener las cosas sincronizadas, tuve que llamar a update() (en lugar de updateGL()) para que todo funcione. En el momento en que hice esta transición, las cosas comenzaron a funcionar como se esperaba.(GLWidget::update() llamadas paintEvent(...))

Espero que te haya ayudado un poco. Si aún no funciona para usted o si necesita más explicaciones, déjeme un comentario aquí e intentaré ayudarlo.

+0

¿Puede echar un vistazo a [este hilo] (http://stackoverflow.com/q/8446437/176769)? – karlphillip

Cuestiones relacionadas