QGLWidgetでglVertex3fなどのさまざまなOpenGL関数への関数呼び出しをQtがどのように処理するのですか?QGLWidgetのglXXX関数呼び出しはどのように処理されますか?
これらはQGLWidgetオブジェクトの一部であるか、厳密にはグローバル名前空間OpenGL関数ですか?
別のクラスからQGLWidgetで描画するときのベストプラクティスは何ですか?
QGLWidgetでglVertex3fなどのさまざまなOpenGL関数への関数呼び出しをQtがどのように処理するのですか?QGLWidgetのglXXX関数呼び出しはどのように処理されますか?
これらはQGLWidgetオブジェクトの一部であるか、厳密にはグローバル名前空間OpenGL関数ですか?
別のクラスからQGLWidgetで描画するときのベストプラクティスは何ですか?
これら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の描画ハンドラから呼び出す必要があります。
これらはグローバルな名前空間のOpenGL関数です。
paintGL()関数の他のクラスの描画関数を呼び出します。
void MyGLWidget::paintGL()
{
other->draw();
}
ちょうど情報のために、 'swapBuffers'は' paintGL'が返った後に自動的に呼び出されます。 –
拡張ラッパーについて詳しく説明します。 QtはOpenGL関数ポインタをロードしてバインドするQGL/[QOpenGLFunctions](http://doc.qt.io/qt-5/qopenglfunctions.html)(QOpenGLFunctions_2_1のようにバージョン管理されています)クラスを提供します。結果は各コンテキストごとにキャッシュされます。 QOpenGLContext :: currentContext() - > functions() - > glを使用して、コンテキストにバインドされた関数を直接呼び出すこともできます。 – Bim