QOpenGLContext Class
QOpenGLContextクラスは、ネイティブのOpenGLコンテキストを表し、QSurface 上のOpenGLレンダリングを可能にします ... 続きを読む
ヘッダー | #include <QOpenGLContext> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
qmake: | QT += gui |
継承: | QObject |
- 継承メンバを含む全メンバのリスト
- QOpenGLContextは、Rendering in 3D に含まれています。
パブリックタイプ
enum | OpenGLModuleType { LibGL, LibGLES } |
パブリック関数
QOpenGLContext(QObject *parent = nullptr) | |
virtual | ~QOpenGLContext() |
bool | create() |
GLuint | defaultFramebufferObject() const |
void | doneCurrent() |
QSet<QByteArray> | extensions() const |
QOpenGLExtraFunctions * | extraFunctions() const |
QSurfaceFormat | format() const |
QOpenGLFunctions * | functions() const |
QFunctionPointer | getProcAddress(const QByteArray &procName) const |
QFunctionPointer | getProcAddress(const char *procName) const |
bool | hasExtension(const QByteArray &extension) const |
bool | isOpenGLES() const |
bool | isValid() const |
bool | makeCurrent(QSurface *surface) |
QNativeInterface * | nativeInterface() const |
QScreen * | screen() const |
void | setFormat(const QSurfaceFormat &format) |
void | setScreen(QScreen *screen) |
void | setShareContext(QOpenGLContext *shareContext) |
QOpenGLContext * | shareContext() const |
QOpenGLContextGroup * | shareGroup() const |
QSurface * | surface() const |
void | swapBuffers(QSurface *surface) |
シグナル
void | aboutToBeDestroyed() |
静的パブリックメンバー
bool | areSharing(QOpenGLContext *first, QOpenGLContext *second) |
QOpenGLContext * | currentContext() |
QOpenGLContext * | globalShareContext() |
QOpenGLContext::OpenGLModuleType | openGLModuleType() |
bool | supportsThreadedOpenGL() |
詳細な説明
QOpenGLContextは、基礎となるOpenGLコンテキストのOpenGL状態を表す。コンテキストをセットアップするには、そのコンテキストが使用されるサーフェスまたはサーフェスのものと一致するように、そのスクリーンとフォーマットを設定し、必要に応じて、setShareContext ()で他のコンテキストとリソースを共有するようにし、最後にcreate ()を呼び出します。コンテキストが正常に初期化されたかどうかを調べるには、戻り値かisValid() を使用する。
コンテキストは、makeCurrent ()を呼び出すことで、指定したサーフェスに対してカレントな状態にすることができる。OpenGLレンダリングが完了したら、swapBuffers ()を呼び出してサーフェスのフロントバッファとバックバッファを入れ替え、新しくレンダリングされたコンテンツが見えるようにする。特定のプラットフォームをサポートするために、QOpenGLContextは、swapBuffers ()を呼び出した後、新しいフレームのレンダリングを開始する前に、makeCurrent ()を再度呼び出す必要があります。
アプリケーションがレンダリングしていないときなど、コンテキストが一時的に不要な場合は、リソースを解放するためにコンテキストを削除すると便利です。QOpenGLContext 自身とは異なる所有権で割り当てられたリソースをクリーンアップするには、aboutToBeDestroyed ()シグナルに接続します。
QOpenGLContextがカレント化されると、QOpenGLFunctions 、QOpenGLBuffer 、QOpenGLShaderProgram 、QOpenGLFramebufferObject などのQtのOpenGLイネーブラを使用することで、プラットフォームに依存しない方法でレンダリングすることができます。また、移植性を犠牲にする可能性はありますが、Qtイネーブラを使用せずに、プラットフォームのOpenGL APIを直接使用することも可能です。後者はOpenGL 1.xやOpenGL ES 1.xを使いたい場合に必要です。
OpenGL APIの詳細については、公式のOpenGLドキュメントを参照してください。
QOpenGLContextの使い方の例については、OpenGL Windowの例を参照してください。
スレッド親和性
QOpenGLContext はmoveToThread() で別のスレッドに移動できます。QOpenGLContextオブジェクトが属するスレッドとは異なるスレッドからmakeCurrent ()を呼び出さないでください。コンテキストは一度に1つのスレッドと1つのサーフェスに対してのみカレントとなることができ、スレッドは一度に1つのコンテキストしかカレントとすることができません。
コンテキストのリソース共有
テクスチャや頂点バッファオブジェクトなどのリソースは、コンテキスト間で共有できます。create() を呼び出す前にsetShareContext() を使用して、コンテキストがこれらのリソースを共有するように指定します。QOpenGLContext は、shareGroup() でアクセスできるQOpenGLContextGroup オブジェクトを内部的に追跡しており、このオブジェクトを使用して、指定された共有グループ内のすべてのコンテキストを見つけることができます。共有グループは、正常に初期化され、共有グループ内の既存のコンテキストと共有しているすべてのコンテキストから構成される。非共有コンテキストは、単一のコンテキストからなる共有グループを持つ。
デフォルトのフレームバッファ
特定のプラットフォームでは、現在のサーフェスによっては0以外のフレームバッファがデフォルトのフレームバッファになることがあります。アプリケーションが異なるプラットフォーム間で移植可能であることを保証するために、glBindFramebuffer(0)を呼び出す代わりに、glBindFramebuffer(ctx->defaultFramebufferObject()) を使用することが推奨されます。しかし、QOpenGLFunctions::glBindFramebuffer() を使えば、これは自動的に行われます。
警告 WebAssembly
QOpenGLContext は、QSurface の有効期間中、QSurface とともに 1 つだけ使用することをお勧めします。複数のコンテキストを使用する場合は、WebAssembly プラットフォームの下にある同じネイティブ・コンテキストによって複数の QOpenGLContext インスタンスがバックアップされる可能性があることを理解することが重要です。したがって、2 つの QOpenGLContext オブジェクトで同じQSurface を使用してmakeCurrent() を呼び出しても、2 回目の呼び出しでは異なるネイティブ・コンテキストに切り替わらない可能性があります。その結果、2回目のmakeCurrent ()の後に行われるOpenGLの状態変更は、すべて同じネイティブコンテキストによってバックアップされているため、最初のQOpenGLContextの状態も変更する可能性があります。
注意: これは、既存のOpenGLベースのQtコードでWebAssemblyをターゲットにする場合、これらの制限に対応するためにいくつかの移植が必要になる可能性があることを意味します。
QOpenGLFunctions 、QOpenGLBuffer 、QOpenGLShaderProgram 、QOpenGLFramebufferObjectも参照して ください。
メンバ型のドキュメント
enum QOpenGLContext::OpenGLModuleType
この列挙型は、基礎となるOpenGL実装のタイプを定義します。
定数 | 値 | 説明 |
---|---|---|
QOpenGLContext::LibGL | 0 | OpenGL |
QOpenGLContext::LibGLES | 1 | OpenGL ES 2.0以上 |
メンバー関数ドキュメント
[explicit]
QOpenGLContext::QOpenGLContext(QObject *parent = nullptr)
親オブジェクトparent を持つ新しい OpenGL コンテキストインスタンスを作成します。
これを使用する前に、適切なフォーマットを設定し、create() を呼び出す必要があります。
create() およびmakeCurrent()も参照してください 。
[virtual noexcept]
QOpenGLContext::~QOpenGLContext()
QOpenGLContext オブジェクトを破棄する。
これがスレッドの現在のコンテキストである場合、doneCurrent ()も呼び出される。
[signal]
void QOpenGLContext::aboutToBeDestroyed()
このシグナルは、基盤となるネイティブOpenGLコンテキストが破棄される前に発行され、OpenGLコンテキストが共有されている場合、ユーザーがOpenGLリソースをクリーンアップすることができます。
クリーンアップを行うためにコンテキストをカレントにしたい場合は、直接接続のみを使用してシグナルに接続するようにしてください。
注意: Qt for Python では、Pythonインスタンスがすでに破棄されているため、QOpenGLWidget やQOpenGLWindow のデストラクタからこのシグナルが発せられても受信されません。代わりにQWidget::hideEvent() でクリーンアップを行うことをお勧めします。
[static]
bool QOpenGLContext::areSharing(QOpenGLContext *first, QOpenGLContext *second)
first とsecond コンテキストがOpenGLリソースを共有している場合、true
を返す。
bool QOpenGLContext::create()
現在の構成でOpenGLコンテキストの作成を試みます。
現在の構成には、フォーマット、共有コンテキスト、スクリーンが含まれる。
システム上のOpenGL実装が要求されたバージョンのOpenGLコンテキストをサポートしていない場合、QOpenGLContext 、最も近いバージョンのOpenGLコンテキストの作成を試みる。実際に作成されたコンテキスト・プロパティは、format ()関数が返すQSurfaceFormat を使用して問い合わせることができる。たとえば、OpenGL 4.3 Coreプロファイルをサポートするコンテキストを要求したが、ドライバやハードウェアがバージョン3.2 Coreプロファイルのコンテキストしかサポートしていない場合、3.2 Coreプロファイルのコンテキストを取得します。
ネイティブ・コンテキストが正常に作成され、makeCurrent ()、swapBuffers ()などで使用する準備ができている場合は、true
を返します。
注意: コンテキストがすでに存在する場合、この関数はまず既存のコンテキストを破棄してから新しいコンテキストを作成します。
makeCurrent() およびformat()も参照 。
[static]
QOpenGLContext *QOpenGLContext::currentContext()
現在のスレッドで最後にmakeCurrent を呼び出したコンテキスト、 または現在のコンテキストがない場合はnullptr
を返す。
GLuint QOpenGLContext::defaultFramebufferObject() const
これを呼び出して、現在のサーフェスのデフォルトのフレームバッファオブジェクトを取得する。
異なるQtプラットフォーム間でアプリケーションを動作させたい場合は、glBindFramebuffer(0)を呼び出す代わりに、glBindFramebuffer(ctx->defaultFramebufferObject())を呼び出す必要があります。
QOpenGLFunctions 、glBindFramebuffer()を使用すると、0が渡されたときに現在のコンテキストのdefaultFramebufferObject()を自動的にバインドするので、この心配はありません。
注意: QOpenGLWidget やQQuickWidget のように、フレームバッファオブジェクトを介してレンダリングするウィジェットは、ペイントがアクティブなときにこの関数から返される値をオーバーライドします。なぜなら、その時点で正しい「デフォルト」フレームバッファは、トップレベルウィンドウのサーフェスに属するプラットフォーム固有のものではなく、ウィジェットに関連付けられたバッキングフレームバッファだからです。これにより、この関数とそれに依存する他のクラス(例えば、QOpenGLFramebufferObject::bindDefault() やQOpenGLFramebufferObject::release() )に期待される動作が保証されます。
QOpenGLFramebufferObjectも参照してください 。
void QOpenGLContext::doneCurrent()
makeCurrent を表面 0 で呼び出すための便利な関数。
この結果、現在のスレッドにはコンテキストが存在しない。
makeCurrent() およびcurrentContext()も参照のこと 。
QSet<QByteArray> QOpenGLContext::extensions() const
このコンテキストがサポートするOpenGL拡張のセットを返す。
このコンテキストまたは共有コンテキストはカレントでなければなりません。
hasExtension()も参照 。
QOpenGLExtraFunctions *QOpenGLContext::extraFunctions() const
このコンテキストのQOpenGLExtraFunctions インスタンスを取得する。
QOpenGLContext 手動で管理することなく にアクセスできる便利な方法です。QOpenGLExtraFunctions
コンテキストまたは共有コンテキストは現在でなければなりません。
返されたQOpenGLExtraFunctions インスタンスはすぐに使用でき、initializeOpenGLFunctions() を呼び出す必要はない。
注: QOpenGLExtraFunctions には、実行時に利用可能であることが保証されていない機能が含まれています。実行時に利用可能かどうかは、プラットフォーム、グラフィックス・ドライバ、およびアプリケーションによって要求されたOpenGLバージョンに依存します。
QOpenGLFunctions およびQOpenGLExtraFunctionsも参照のこと 。
QSurfaceFormat QOpenGLContext::format() const
create() が呼び出された場合は、そのプラットフォーム・コンテキストのフォーマットを返す。
そうでない場合は、要求された書式を返す。
要求されたフォーマットと実際のフォーマットは異なる場合があります。指定されたOpenGLバージョンを要求しても、結果のコンテキストが要求されたバージョンを正確にターゲットにすることを意味するわけではありません。ドライバがそのようなコンテキストを提供できる限り、作成されるコンテキストのバージョン/プロファイル/オプションの組み合わせが要求と互換性があることだけが保証される。
たとえば、OpenGLバージョン3.xコアプロファイルコンテキストを要求すると、OpenGL 4.xコアプロファイルコンテキストが生成されるかもしれません。同様に、OpenGL 2.1のリクエストは、非推奨関数を有効にしたOpenGL 3.0コンテキストになるかもしれません。最後に、ドライバによっては、サポートされていないバージョンは、コンテキストの作成に失敗するか、サポートされている最も高いバージョンのコンテキストになる可能性があります。
たとえば、結果のコンテキストは要求されたよりも大きな深度バッファを持つかもしれません。これは完全に正常です。
setFormat()も参照 。
QOpenGLFunctions *QOpenGLContext::functions() const
このコンテキストのQOpenGLFunctions インスタンスを取得する。
QOpenGLContext 手動で管理することなく にアクセスできる便利な方法です。QOpenGLFunctions
コンテキストまたは共有コンテキストは現在でなければなりません。
返されたQOpenGLFunctions インスタンスはすぐに使用でき、initializeOpenGLFunctions()を呼び出す必要はない。
QFunctionPointer QOpenGLContext::getProcAddress(const QByteArray &procName) const
で識別されるOpenGL拡張関数への関数ポインタを解決します。procName
そのような関数が見つからない場合はnullptr
を返します。
QFunctionPointer QOpenGLContext::getProcAddress(const char *procName) const
これはオーバーロードされた関数である。
[static]
QOpenGLContext *QOpenGLContext::globalShareContext()
アプリケーション全体で共有されているOpenGLコンテキストがあればそれを返す。そうでない場合は、nullptr
を返す。
これは、QOpenGLWidget またはQQuickWidget を作成または表示する前に、OpenGL オブジェクト(バッファ、テクスチャなど)をアップロードする必要がある場合に便利です。
注意: QGuiApplication オブジェクトを作成する前にQGuiApplication にQt::AA_ShareOpenGLContexts フラグを設定する必要があります。
警告 この関数が返すコンテキストを、どのサーフェス上でもカレントなものにしようとしないでください。その代わりに、グローバルなコンテキストと共有する新しいコンテキストを作成し、その新しいコンテキストをカレントにしてください。
Qt::AA_ShareOpenGLContexts 、setShareContext()、makeCurrent()も参照のこと 。
bool QOpenGLContext::hasExtension(const QByteArray &extension) const
このOpenGLコンテキストが指定されたOpenGLextension をサポートしている場合はtrue
を、そうでない場合はfalse
を返す。
コンテキストまたは共有コンテキストは現在でなければなりません。
extensions()も参照 。
bool QOpenGLContext::isOpenGLES() const
コンテキストがOpenGL ESコンテキストであればtrueを返す。
コンテキストがまだ作成されていない場合、結果はsetFormat() で設定された要求フォーマットに基づきます。
create()、format()、setFormat()も参照 。
bool QOpenGLContext::isValid() const
このコンテキストが有効かどうか、つまり正常に作成されたかどうかを返す。
一部のプラットフォームでは、以前に正常に作成されたコンテキストに対してfalse
が返されると、OpenGL コンテキストが失われたことを示す。
アプリケーションでコンテキスト喪失シナリオを処理する典型的な方法は、makeCurrent() が失敗してfalse
を返すたびに、この関数でチェックすることである。この関数がfalse
を返した場合、create ()を呼び出して基礎となるネイティブOpenGLコンテキストを再作成し、makeCurrent ()を再度呼び出してから、すべてのOpenGLリソースを再初期化します。
プラットフォームによっては、コンテキストが失われる状況は避けられません。しかし、他のプラットフォームでは、オプトインする必要があるかもしれません。これは、QSurfaceFormat でResetNotification を有効にすることで可能です。これは、RESET_NOTIFICATION_STRATEGY_EXT
を基礎となるネイティブOpenGLコンテキストのLOSE_CONTEXT_ON_RESET_EXT
に設定することにつながります。QOpenGLContext は、makeCurrent() のたびにglGetGraphicsResetStatusEXT()
を介してステータスを監視します。
create()も参照してください 。
bool QOpenGLContext::makeCurrent(QSurface *surface)
与えられたsurface に対して、現在のスレッドで現在のコンテキストを作成する。成功すればtrue
を返し、そうでなければfalse
を返す。後者は、サーフェスが公開されていない場合や、アプリケーションがサスペンドされているなどの理由でグラフィックス・ハードウェアが利用できない場合に発生する可能性がある。
surface がnullptr
の場合、これはdoneCurrent() を呼び出すのと同じです。
この関数を、QOpenGLContext インスタンスが存在するスレッドとは異なるスレッドから呼び出すことは避けてください。異なるスレッドからQOpenGLContext を使用したい場合は、まず、必要に応じてdoneCurrent() を呼び出して、現在のスレッドでこの関数が使用されていないことを確認する必要があります。その後、他のスレッドで使用する前に moveToThread(otherThread) を呼び出します。
デフォルトでは、Qtはスレッド親和性に関して上記の条件を強制するチェックを採用しています。このチェックを無効にするには、Qt::AA_DontCheckOpenGLContextThreadAffinity
アプリケーション属性を設定します。QObject thread affinity ドキュメントで説明されているように、QObject をスレッド外から使用した場合の結果を理解しておいてください。
functions(),doneCurrent(),Qt::AA_DontCheckOpenGLContextThreadAffinityも参照して ください。
template <typename QNativeInterface> QNativeInterface *QOpenGLContext::nativeInterface() const
コンテキストに指定された型のネイティブ・インターフェースを返す。
この関数は、QNativeInterface 名前空間で定義されているQOpenGLContext のプラットフォーム固有の機能へのアクセスを提供します:
macOS 上の NSOpenGLContext へのネイティブインターフェース | |
EGL コンテキストへのネイティブインタフェース | |
GLX コンテキストへのネイティブインターフェース | |
Windows上のWGLコンテキストへのネイティブインターフェース |
要求されたインターフェースが利用できない場合は、nullptr
が返される。
[static]
QOpenGLContext::OpenGLModuleType QOpenGLContext::openGLModuleType()
基礎となるOpenGL実装のタイプを返します。
OpenGL実装が動的にロードされないプラットフォームでは、戻り値はコンパイル時に決定され、変更されることはありません。
注意: デスクトップOpenGL実装は、ES互換のコンテキストを作成することもできる。したがって、ほとんどの場合、QSurfaceFormat::renderableType ()をチェックするか、便利な関数isOpenGLES ()を使用する方が適切です。
注意: この関数は、QGuiApplication インスタンスがすでに作成されていることを必要とする。
QScreen *QOpenGLContext::screen() const
コンテキストが作成された画面を返します。
setScreen()も参照 。
void QOpenGLContext::setFormat(const QSurfaceFormat &format)
OpenGLコンテキストが互換性を持つべきformat を設定する。この関数が有効になる前にcreate() を呼び出す必要があります。
この関数によってフォーマットが明示的に設定されない場合、QSurfaceFormat::defaultFormat() によって返されるフォーマットが使用されます。つまり、複数のコンテキストを持つ場合、この関数を個別に呼び出す代わりに、最初のコンテキストを作成する前にQSurfaceFormat::setDefaultFormat() を 1 回呼び出せばよい。
format()も参照 。
void QOpenGLContext::setScreen(QScreen *screen)
OpenGLコンテキストが有効であるべきscreen を設定する。有効にする前にcreate() を呼び出す必要があります。
screen()も参照してください 。
void QOpenGLContext::setShareContext(QOpenGLContext *shareContext)
このコンテキストは、テクスチャ、シェーダ、およびその他の OpenGL リソースをshareContext と共有するようになります。 この設定を有効にするには、create() を呼び出す必要があります。
shareContext()も参照してください 。
QOpenGLContext *QOpenGLContext::shareContext() const
このコンテキストが作成された共有コンテキストを返します。
基盤となるプラットフォームが要求された共有をサポートできなかった場合、これは 0 を返します。
setShareContext()も参照してください 。
QOpenGLContextGroup *QOpenGLContext::shareGroup() const
このコンテキストが属する共有グループを返します。
[static]
bool QOpenGLContext::supportsThreadedOpenGL()
プラットフォームがメイン(gui)スレッド以外でのOpenGLレンダリングをサポートしている場合、true
。
この値は、使用中のプラットフォーム・プラグインによって制御され、グラフィックス・ドライバにも依存する可能性があります。
QSurface *QOpenGLContext::surface() const
コンテキストがカレントになっているサーフェスを返す。
これはmakeCurrent() の引数として渡されたサーフェスである。
void QOpenGLContext::swapBuffers(QSurface *surface)
surface のバックバッファとフロントバッファを入れ替えます。
OpenGLレンダリングのフレームを終了するためにこれを呼び出し、新しいフレームの一部としてなど、それ以上のOpenGLコマンドを発行する前に、makeCurrent ()を再度呼び出すようにしてください。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.