2d HUD が QGLWidget で正しく描画されない (QPainter を使用)



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


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



  • 独自のサブクラス化された GameGL クラス ( GameGL :public QGLWidget ) で paintEvent(...) をオーバーライドします

  • openGL ModelView マトリックスを現在のマトリックスとしてプッシュ

  • パラメータを gl_depth_test として有効化

  • ゲームをレンダリングする (::paintGL1() )

  • モデルビュー パラメータを無効にする

  • モデルビュー マトリックスをポップ


  • QPainterオブジェクトを作る


  • paint.drawText() を呼び出す

  • paint.end() を使用してフラッシュ



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



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


ありがとう


答え:


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


塗り重ね例をそのまま踏襲してください。例のコードに目を通すと、コンストラクターにタイマー timeout() があることに気付くでしょう。 SIGNAL は animate() に接続されています スロット。 animate() スロットをよく見ると、今度は update() が呼び出されます 別名 GLWidget::update() . GLWidget::update(); のドキュメントに従っている場合これは順番に paintEvent(...) を呼び出します .


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


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


少しでもお役に立てば幸いです。それでも問題が解決しない場合、またはさらに説明が必要な場合は、ここにコメントを残してください。できる限りお手伝いします。


いくつかのコードの回答


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