1

QGLWidget の paintEvent メソッドは initializeGL の前に呼び出されるようですが、openGL 初期化コードをどこに置くべきですか?

次のように paintEvent メソッドに入れています。

void MyGLWidget::paintEvent(...)
{
   makeCurrent();
   ..save modelview and projection matrices..

   // This is initialization code

   GLenum init = glewInit();
    if (GLEW_OK != init)
    {
      /* Problem: glewInit failed, something is seriously wrong. */
      qWarning() << glewGetErrorString(init);
    }

    // Dark blue background
    glClearColor(0.2f, 0.0f, 0.5f, 0.0f);
    // Enable depth test
    glEnable(GL_DEPTH_TEST);


   // End initialization code

   ... drawing code

   QPainter painter(this);
   ...overpainting..

}

paintEvent が発生するたびに glew ライブラリの初期化関数を呼び出すという考えは本当に好きではありません...それは機能していますが。

なにか提案を?

4

2 に答える 2

2

initializeGL()でOpenGLを初期化する必要があります。他のオプションはありません。

ただし、paintEvent内ではなく、 paintGL内にも描画する必要があるため、間違いがあります。

于 2012-07-18T19:04:23.990 に答える
0

QGLWidget の initializeGL() 関数をオーバーライドします。それはあなたが望む目的のために正しく作成されています

ドキュメントから:

この仮想関数は、paintGL() または resizeGL() への最初の呼び出しの前に 1 回呼び出され、その後、ウィジェットに新しい QGLContext が割り当てられるたびに 1 回呼び出されます。サブクラスで再実装します。

ドキュメントへのリンク: http://doc.qt.io/archives/qt-4.7/qglwidget.html#initializeGL

于 2012-07-18T17:24:16.190 に答える