QOpenGLWindow Class
QOpenGLWindowクラスは、OpenGLペイントを実行するためのQWindow の便利なサブクラスです。詳細...
Header: | #include <QOpenGLWindow> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS OpenGL) target_link_libraries(mytarget PRIVATE Qt6::OpenGL) |
qmake: | QT += opengl |
Inherits: | QPaintDeviceWindow |
パブリック型
enum | UpdateBehavior { NoPartialUpdate, PartialUpdateBlit, PartialUpdateBlend } |
パブリック関数
QOpenGLWindow(QOpenGLWindow::UpdateBehavior updateBehavior = NoPartialUpdate, QWindow *parent = nullptr) | |
QOpenGLWindow(QOpenGLContext *shareContext, QOpenGLWindow::UpdateBehavior updateBehavior = NoPartialUpdate, QWindow *parent = nullptr) | |
virtual | ~QOpenGLWindow() |
QOpenGLContext * | context() const |
GLuint | defaultFramebufferObject() const |
void | doneCurrent() |
QImage | grabFramebuffer() |
bool | isValid() const |
void | makeCurrent() |
QOpenGLContext * | shareContext() const |
QOpenGLWindow::UpdateBehavior | updateBehavior() const |
シグナル
void | frameSwapped() |
保護された関数
virtual void | initializeGL() |
virtual void | paintGL() |
virtual void | paintOverGL() |
virtual void | paintUnderGL() |
virtual void | resizeGL(int w, int h) |
再実装された保護された関数
virtual void | paintEvent(QPaintEvent *event) override |
virtual void | resizeEvent(QResizeEvent *event) override |
詳細説明
QOpenGLWindow は、QOpenGLWidget と互換性のある API を使用して、OpenGL レンダリングを実行するウィンドウを簡単に作成できるように拡張されたQWindow です。QOpenGLWidget とは異なり、QOpenGLWindow には widgets モジュールへの依存性がなく、パフォーマンスが向上しています。
典型的なアプリケーションはQOpenGLWindowをサブクラス化し、以下の仮想関数を再実装します:
- initializeGL(OpenGLリソースの初期化を行う
- resizeGL() :OpenGLリソースの初期化を行う。
- paintGL() を使ってOpenGLコマンドを発行したり描画したりします。QPainter
再描画をスケジュールするには、update ()関数を呼び出します。このとき、すぐにpaintGL() が呼び出されるわけではないことに注意してください。update() を連続して複数回呼び出しても、動作は何も変わりません。
これはスロットなので、QChronoTimer::timeout ()シグナルに接続してアニメーションを実行することができます。しかし、現代のOpenGLの世界では、ディスプレイの垂直リフレッシュレートへの同期に依存する方がはるかに良い選択であることに注意してください。スワップ間隔の説明についてはsetSwapInterval() を参照してください。スワップ間隔が1
の場合(デフォルトでほとんどのシステムでそうなっている)、QOpenGLWindow が再描画のたびに内部的に実行するswapBuffers() 呼び出しはブロックして vsync を待ちます。つまり、スワップが完了するたびに、update ()を呼び出すことで、タイマーに依存せずに更新を再びスケジュールできます。
コンテキストの特定の設定を要求するには、他のQWindow と同様にsetFormat() を使用する。これにより、特に、指定されたOpenGLバージョンとプロファイルを要求したり、深度とステンシルバッファを有効にしたりすることができます。
注意: 深度バッファとステンシルバッファが基礎となるウィンドウシステムインターフェースから要求されることを確実にするのはアプリケーション次第である。ゼロでない深度バッファサイズを要求しなければ、深度バッファが利用可能であるという保証はなく、結果として深度テストに関連するOpenGL操作は期待通りに機能しないかもしれない。
一般的に使用される深度バッファサイズ要求とステンシルバッファサイズ要求は、それぞれ24と8である。たとえば、QOpenGLWindowのサブクラスは、コンストラクタでこれを行うことができます:
QSurfaceFormat format; format.setDepthBufferSize(24); format.setStencilBufferSize(8); setFormat(format);
QWindow とは異なり、QOpenGLWindow はそれ自身にペインターを開き、QPainter ベースの描画を実行できます。
QOpenGLWindow は複数の更新動作をサポートしています。デフォルトのNoPartialUpdate
は通常の OpenGL ベースのQWindow と同等です。これとは対照的に、PartialUpdateBlit
とPartialUpdateBlend
は、QOpenGLWidget の動作に近いもので、常に追加の専用フレームバッファオブジェクトが存在します。これらのモードは、性能を多少犠牲にすることで、各ペイントでより小さな領域だけを再描画し、残りのコンテンツは前のフレームから保持することを可能にします。paintGL() を呼び出すたびにウィンドウ全体の内容を再描画する必要がないため、QPainter を使用してインクリメンタルに描画するアプリケーションにとって便利です。
QOpenGLWidget と同様に、QOpenGLWindow はQt::AA_ShareOpenGLContexts 属性をサポートしています。有効にすると、すべての QOpenGLWindow インスタンスの OpenGL コンテキストが互いに共有されます。これにより、お互いの共有可能なOpenGLリソースにアクセスできるようになります。
Qtのグラフィックスの詳細については、Graphicsを参照してください。
メンバ型ドキュメント
enum QOpenGLWindow::UpdateBehavior
この列挙型は、QOpenGLWindow の更新戦略を記述します。
定数 | 値 | 説明 |
---|---|---|
QOpenGLWindow::NoPartialUpdate | 0 | ウィンドウの表面全体が更新ごとに再描画され、追加のフレームバッファが必要ないことを示します。これは、ほとんどの場合に使用される設定であり、QWindow を介して直接描画する方法と同等です。 |
QOpenGLWindow::PartialUpdateBlit | 1 | paintGL() で実行された描画がウィンドウ全体をカバーしていないことを示します。この場合、追加のフレームバッファオブジェクトがフードの下に作成され、paintGL ()で実行されるレンダリングは、このフレームバッファをターゲットにします。このフレームバッファは、各ペイントの後にウィンドウサーフェスのデフォルトフレームバッファにブレンドされます。これにより、paintGL ()でQPainter-ベースの描画コードを持つことができます。この描画コードでは、NoPartialUpdateとは異なり、前の内容が保持されるため、一度に小さな領域のみを再描画します。 |
QOpenGLWindow::PartialUpdateBlend | 2 | PartialUpdateBlitと似ていますが、フレームバッファ・ブリットを使う代わりに、余分なフレームバッファの内容は、ブレンディングを有効にしたテクスチャ付き四角形を描画することでレンダリングされます。これは、PartialUpdateBlitとは異なり、アルファブレンディングされたコンテンツを許可し、glBlitFramebufferが利用できない場合でも動作します。パフォーマンス的には、この設定はPartialUpdateBlitよりも多少遅くなる可能性があります。 |
メンバー関数ドキュメント
[explicit]
QOpenGLWindow::QOpenGLWindow(QOpenGLWindow::UpdateBehavior updateBehavior = NoPartialUpdate, QWindow *parent = nullptr)
与えられたparent とupdateBehavior で新しい QOpenGLWindow を構築します。
QOpenGLWindow::UpdateBehaviorも参照してください 。
[explicit]
QOpenGLWindow::QOpenGLWindow(QOpenGLContext *shareContext, QOpenGLWindow::UpdateBehavior updateBehavior = NoPartialUpdate, QWindow *parent = nullptr)
与えられたparent とupdateBehavior を持つ新しい QOpenGLWindow を構築します。QOpenGLWindow のコンテキストはshareContext と共有されます。
QOpenGLWindow::UpdateBehavior およびshareContext も参照して ください。
[virtual noexcept]
QOpenGLWindow::~QOpenGLWindow()
QOpenGLWindow インスタンスを破棄し、リソースを解放します。
OpenGLWindowのコンテキストはデストラクタでカレントにされるので、このウィンドウが提供するコンテキストに属するOpenGLリソースを解放する必要がある子オブジェクトを安全に破棄できます。
警告: OpenGLリソースをラップしているオブジェクト(QOpenGLBuffer 、QOpenGLShaderProgram など)をQOpenGLWindow サブクラスのメンバーとして持っている場合、そのサブクラスのデストラクタにもmakeCurrent ()の呼び出しを追加する必要があるかもしれません。C++のオブジェクト破壊の規則により、これらのオブジェクトはこの関数を呼び出す前に破壊されます(しかし、サブクラスのデストラクタが実行された後)。
makeCurrentも参照してください 。
QOpenGLContext *QOpenGLWindow::context() const
戻り値 このウィンドウによって使用されるQOpenGLContext またはまだ初期化されていない場合は0
.
GLuint QOpenGLWindow::defaultFramebufferObject() const
このウィンドウによって使用されるフレームバッファオブジェクトハンドル。
更新動作がNoPartialUpdate
に設定されている場合、個別のフレームバッファオブジェクトは存在しない。この場合、返される値はデフォルトのフレームバッファのIDです。
それ以外の場合はフレームバッファオブジェクトのIDの値、またはまだ初期化されていない場合は0
。
void QOpenGLWindow::doneCurrent()
コンテキストを解放します。
ほとんどの場合、この関数を呼び出す必要はありません。ウィジェットは、paintGL ()を呼び出すときに、コンテキストが適切にバインドされ、解放されることを確認するからです。
makeCurrent()も参照してください 。
[signal]
void QOpenGLWindow::frameSwapped()
このシグナルは、ブロッキングの可能性があるbuffer swap が実行された後に発行されます。垂直リフレッシュに同期して継続的に再描画を行いたいアプリケーションは、このシグナルが発生したときにupdate() を発行する必要があります。これにより、従来のタイマーの使い方と比較して、よりスムーズな体験が可能になります。
QImage QOpenGLWindow::grabFramebuffer()
フレームバッファのコピーを返す。
注意: これは、ピクセルを読み出すためにglReadPixels()に依存しているため、潜在的に高価な操作です。これは遅く、GPUパイプラインを停止させる可能性があります。
注意: update 動作NoPartialUpdate
と共に使用される場合、前面バッファと背面バッファが入れ替わった後に呼び出されると、返される画像に希望する内容が含まれないことがあります(基礎となるウィンドウシステムインタフェースで保存スワップが有効になっていない限り)。このモードでは、関数はバックバッファから読み込みますが、その内容は画面上の内容(フロントバッファ)と一致しない可能性があります。この場合、この関数を安全に使用できるのはpaintGL() またはpaintOverGL() だけである。
[virtual protected]
void QOpenGLWindow::initializeGL()
この仮想関数は、paintGL ()またはresizeGL ()を最初に呼び出す前に1回呼び出されます。サブクラスで再実装します。
この関数は、必要なOpenGLリソースと状態をセットアップする必要があります。
この関数が呼び出されたときにすでに設定されているので、makeCurrent ()を呼び出す必要はありません。ただし、部分更新モードが使用される場合のフレームバッファは、この段階ではまだ利用できないので、ここから描画コールを発行することは避けてください。このような呼び出しは、paintGL() に回してください。
bool QOpenGLWindow::isValid() const
コンテキストのようなウィンドウのOpenGLリソースが正常に初期化された場合、true
。ウィンドウが公開される(表示される)までは、戻り値は常にfalse
であることに注意。
void QOpenGLWindow::makeCurrent()
対応するコンテキストをカレントにし、フレームバッファオブジェクトがあればそれをそのコンテキストにバインドすることによって、このウィンドウのOpenGLコンテンツのレンダリングの準備をする。
この関数は、paintGL ()を呼び出す前に自動的に呼び出されるため、ほとんどの場合、この関数を呼び出す必要はない。それにもかかわらず、GUIやメインスレッドとは異なるスレッドがサーフェスやフレームバッファの内容を更新したいような、高度なマルチスレッドシナリオをサポートするために提供されています。スレッド関連の問題の詳細については、QOpenGLContext を参照してください。
この関数は、基盤となるプラットフォーム・ウィンドウがすでに破棄されている場合にも呼び出すのに適しています。つまり、QOpenGLWindow サブクラスのデストラクタからこの関数を呼び出しても安全です。ネイティブ・ウィンドウがなくなった場合、代わりにオフスクリーン・サーフェスが使用されます。これにより、この関数が最初に呼び出される限り、デストラクタでのOpenGLリソースのクリーンアップ操作が常に機能することが保証されます。
QOpenGLContext 、context()、paintGL()、doneCurrent()も参照 。
[override virtual protected]
void QOpenGLWindow::paintEvent(QPaintEvent *event)
再実装:QPaintDeviceWindow::paintEvent(QPaintEvent *event)。
Paintevent ハンドラ。paintGL() を呼び出します。
paintGL()も参照してください 。
[virtual protected]
void QOpenGLWindow::paintGL()
この仮想関数は、ウィンドウの内容をペイントする必要があるときに呼び出されます。サブクラスで再実装してください。
makeCurrent() を呼び出す必要はありません。なぜなら、この関数が呼び出されたときに、すでにこの処理は行われているからです。
この関数を呼び出す前に、コンテキストとフレームバッファ(ある場合)がバインドされ、glViewport()の呼び出しによってビューポートが設定されます。他の状態は設定されず、クリアや描画はフレームワークによって実行されません。
注: PartialUpdateBlend
のような部分的な更新動作を使用する場合、前の paintGL() 呼び出しの出力は保存され、関数の現在の呼び出しで実行された追加の描画の後、コンテンツはpaintUnderGL() でウィンドウに直接描画されたコンテンツの上にブライトまたはブレンドされます。
initializeGL()、resizeGL()、paintUnderGL()、paintOverGL()、UpdateBehaviorも参照のこと 。
[virtual protected]
void QOpenGLWindow::paintOverGL()
この仮想関数は、paintGL ()を呼び出すたびに呼び出される。
更新モードがNoPartialUpdate に設定されている場合、この関数とpaintGL() に違いはなく、どちらでレンダリングを行っても同じ結果になる。
paintUnderGL() と同様に、この関数でのレンダリングは、更新動作に関係なく、ウィンドウのデフォルトのフレームバッファを対象とします。この関数は、paintGL() が返り、ブリット (PartialUpdateBlit) またはクワッド描画 (PartialUpdateBlend) が行われた後に呼び出されます。
paintGL()、paintUnderGL()、UpdateBehaviorも参照してください 。
[virtual protected]
void QOpenGLWindow::paintUnderGL()
この仮想関数は、paintGL ()の各呼び出しの前に呼び出される。
更新モードがNoPartialUpdate
に設定されている場合、この関数とpaintGL() に違いはなく、どちらでレンダリングを行っても同じ結果になります。
違いは、追加のフレームバッファオブジェクトが使用されるPartialUpdateBlend
を使用する場合に大きくなります。paintUnderGL() とpaintOverGL() がデフォルトのフレームバッファ、つまりウィンドウ表面を直接ターゲットとするのに対し、paintGL() はこの追加のフレームバッファオブジェクトをターゲットとし、その内容は保持されます。
注意: 更新動作がPartialUpdateBlit
の場合、この関数に依存することは避けてください。このモードでは、paintGL() を呼び出すたびに、paintGL() で使用された余分なフレームバッファがデフォルトのフレームバッファに上書きされるため、この関数で生成されたすべての描画が上書きされます。
paintGL(),paintOverGL(),UpdateBehaviorも参照 。
[override virtual protected]
void QOpenGLWindow::resizeEvent(QResizeEvent *event)
再実装:QWindow::resizeEvent(QResizeEvent *ev)。
リサイズevent ハンドラ。resizeGL() を呼び出します。
resizeGL()も参照してください 。
[virtual protected]
void QOpenGLWindow::resizeGL(int w, int h)
この仮想関数は、ウィジェットのサイズが変更されるたびに呼び出されます。サブクラスで再実装してください。新しいサイズはw とh で渡されます。
注: これはQOpenGLWidget と互換性のあるAPIを提供するための便宜的な関数に過ぎない。QOpenGLWidget とは異なり、派生クラスはこの関数の代わりにresizeEvent() をオーバーライドすることを自由に選択できる。
注意: この関数からOpenGLコマンドを発行することは避けてください。避けられない場合は、makeCurrent ()を呼び出します。
注意: ここから更新をスケジューリングする必要はない。ウィンドウシステムは、自動的に更新のトリガーとなる公開イベントを送信します。
initializeGL() およびpaintGL()も参照のこと 。
QOpenGLContext *QOpenGLWindow::shareContext() const
このウィンドウのQOpenGLContext と共有されるように要求されたQOpenGLContext を返す。
QOpenGLWindow::UpdateBehavior QOpenGLWindow::updateBehavior() const
このQOpenGLWindow の更新動作を返します。
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。