2010-05-18 15 views
6

Próbuję wyświetlić HUD w mojej grze 3D. Na początek próbuję wyświetlić "Hello World", ale jeszcze nie osiągnąłem sukcesu! Scena zamarza/miga, gdy skończę.2d Nie poprawnie rysowanie HUD przez QGLWidget (przy użyciu QPaintera)

Używam Qt/C++ i QGLWdiget/QPainter, aby to zrobić. Użyłem overpainting example jako mojego odniesienia, aby zacząć. Oto co mam zrobić:

  • override paintEvent (...) W moim podklasy GameGL klasa (GameGL: QGLWidget publiczny)
  • push openGL ModelView macierz jako bieżącej macierzy
  • umożliwić parametrów jak gl_depth_test
  • czynią moją grę (:: paintGL1())
  • wyłączyć parametry ModelView
  • matryca pop ModelView

  • Producent obiekt QPainter

  • powołać paint.drawText()
  • Flush używając paint.end()

Jest niemal tak samo, jak wspomniano w przykładzie. Jednak po uruchomieniu tego kodu, odczuwa on mrozy/migotanie i jest wysoce niereagujący. Czy ktokolwiek miałby pojęcie, dlaczego tak się dzieje? Naprawdę doceniam każdą pomoc.


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

Dziękuję

Odpowiedz

10

Dla każdego, kto nadal boryka się z tym i natknąłem się na ten post: oto jak ja rozwiązałem ::

proszę pójść za przykładem Malowanie jak jest. Jeśli spojrzysz na kod w tym przykładzie, zauważysz w konstruktorze, timer timeout() SIGNAL jest połączony z gniazdem animate(). Jeśli przyjrzeć się dokładnie automatowi animate(), wywołuje on kolejno: update() a.k.a GLWidget::update(). Jeśli postępujesz zgodnie z dokumentacją dla GLWidget :: update(); to z kolei wywołuje paintEvent(...).

To tło jest ważne i stanowiło brakujący element mojego problemu. Wcześniej używałem paintGL (...), aby narysować moją scenę, odkąd przesłoniłem GLWidget. Aby obsłużyć animację lub aktualizacje mojej sceny, podłączyłem timer do aktualizacjiGL(). Było to z kolei wywoływanie paintGL() przez glDraw(). To była podstawowa przyczyna wszystkich problemów.

Kod, jak napisałem, wielokrotnie wywoływał paintGL(). Po przykładowym przesiąknięciu całkowicie pozbyłem się metody paintGL i zamiast tego przełączyłem się na metodologię renderingu (...). Tak więc, aby zachować synchronizację rzeczy, musiałem wywołać update() (zamiast updateGL()), aby wszystko działało. W momencie, w którym dokonałem tego przejścia, wszystko zaczęło działać zgodnie z oczekiwaniami.(GLWidget::update() dzwoni paintEvent(...))

Mam nadzieję, że ci pomogło. Jeśli nadal nie działa dla ciebie lub potrzebujesz dodatkowej eksplanacji, zostaw tutaj komentarz, a ja postaram się pomóc.

+0

Czy możesz rzucić okiem na [ten wątek] (http://stackoverflow.com/q/8446437/176769)? – karlphillip

Powiązane problemy