6

3D ゲームに HUD を表示しようとしています。手始めに、「Hello World」を表示しようとしていますが、まだ成功していません! 作業が完了すると、シーンがフリーズ/ちらつきます。

これを行うために Qt/C++ と QGLWdiget / QPainter を使用しています。開始するための参照として、オーバーペイントの例を使用しました。これが私がすることです:

  • 自分のサブクラス化された GameGL クラス ( GameGL : public QGLWidget ) で paintEvent(...) をオーバーライドします。
  • openGL ModelView マトリックスを現在のマトリックスとしてプッシュする
  • パラメータを gl_depth_test として有効にする
  • ゲームをレンダリングする (:: paintGL1() )
  • モデルビュー パラメータを無効にする
  • pop モデルビュー マトリックス

  • QPainterオブジェクトを作る

  • paint.drawText() を呼び出す
  • paint.end() を使用してフラッシュする

これは、例で述べたものとほとんど同じです。ただし、このコードを実行すると、フリーズ/ちらつきが発生し、非常に反応しなくなります。なぜこれが起こっているのか、誰にも分かりますか?何か助けていただければ幸いです。


コード: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();

ありがとうございました

4

1 に答える 1

10

まだこれに苦労していて、この投稿に出くわした人のために:これが私がそれを解決した方法です::

そのまま上塗りの例に従ってください。例のコードを見ると、コンストラクターでタイマーtimeout()SIGNALがanimate()SLOTに接続されていることがわかります。animate()スロットをよく見ると、順番にupdate()akaを呼び出しますGLWidget::update()。GLWidget :: update();のドキュメントに従う場合 この順番で呼び出しますpaintEvent(...)

この背景は重要であり、私の問題には欠けていた部分でした。GLWidgetをオーバーライドしていたので、以前はpaintGL(...)を使用してシーンを描画していました。アニメーションやシーンの更新をサポートするために、タイマーをupdateGL()に接続しました。これは、glDraw()を介してpaintGL()を呼び出すことでした。これがすべての問題の根本的な原因でした。

私が書いたコードは、paintGL()を何度も呼び出していました。オーバーペイントの例に従って、paintGLメソッドを完全に削除し、代わりにpaintEvent(...)レンダリング方法に切り替えました。したがって、物事の同期を保つために、物事を機能させるために(updateGL()の代わりに)update()を呼び出す必要がありました。この移行を行った瞬間、物事は期待どおりに機能し始めました。(GLWidget::update()呼び出しpaintEvent(...)

お役に立てば幸いです。それでもうまくいかない場合や、さらに説明が必要な場合は、ここにコメントを残してください。サポートさせていただきます。

于 2010-05-24T05:30:33.157 に答える