2011-08-16 7 views
1

QGLWidgetでglVertex3fなどのさまざまなOpenGL関数への関数呼び出しをQtがどのように処理するのですか?QGLWidgetのglXXX関数呼び出しはどのように処理されますか?

これらはQGLWidgetオブジェクトの一部であるか、厳密にはグローバル名前空間OpenGL関数ですか?

別のクラスからQGLWidgetで描画するときのベストプラクティスは何ですか?

答えて

3

これらgl…機能は通常のOpenGLの機能であり、または延長ラッパーは、ラッパーのシンボルに解決するマクロ名を使用している場合。 GLUTやGLFWと同様に、QGLWidgetはOpenGLコンテキストの作成と管理を行います。

QGLWidgetは、QGLWidget::makeCurrentが呼び出されるスレッドの現在のコンテキストであるQGLWidgetインスタンスのOpenGLコンテキストを選択するメンバー関数QGLWidget::makeCurrentを提供します。 QGLWidget::swapBuffersはダブルバッファスワップを発行します。レンダラー関数の最後にあるOpenGLコンテキストの使用が終了したら、QGLWidget::doneCurrentを呼び出して、現在のスレッドからコンテキストを切り離します。 OpenGLがマルチスレッドプログラムで動作するようにする必要があります。すべてのOpenGL操作が同じスレッドから実行されていることを確認した場合は、QGLWidget::doneCurrentへの呼び出しを省略することができます。

もちろん、真のOOPファッションプログラムでは、他のクラスへの参照をQGLWidgetの派生物に渡し、その描画関数をQGLWidgetの描画ハンドラから呼び出す必要があります。

+1

ちょうど情報のために、 'swapBuffers'は' paintGL'が返った後に自動的に呼び出されます。 –

+0

拡張ラッパーについて詳しく説明します。 QtはOpenGL関数ポインタをロードしてバインドするQGL/[QOpenGLFunctions](http://doc.qt.io/qt-5/qopenglfunctions.html)(QOpenGLFunctions_2_1のようにバージョン管理されています)クラスを提供します。結果は各コンテキストごとにキャッシュされます。 QOpenGLContext :: currentContext() - > functions() - > glを使用して、コンテキストにバインドされた関数を直接呼び出すこともできます。 – Bim

1

これらはグローバルな名前空間のOpenGL関数です。

paintGL()関数の他のクラスの描画関数を呼び出します。

void MyGLWidget::paintGL() 
{ 
    other->draw(); 
} 
関連する問題