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 は「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() を呼び出す必要があります。
アプリケーションがレンダリングを行っていない場合など、コンテキストが一時的に不要になったときは、リソースを解放するためにコンテキストを削除すると便利です。aboutToBeDestroyed() シグナルに接続することで、QOpenGLContext 自体とは異なる所有権で割り当てられたリソースをクリーンアップできます。
Qt OpenGL が現在のコンテキストとして設定されると、QOpenGLFunctions 、QOpenGLBuffer 、QOpenGLShaderProgram 、QOpenGLFramebufferObject といった Qt の OpenGL イネーブラーを使用して、プラットフォームに依存しない方法でレンダリングを行うことができます。また、Qt のイネーブラーを使用せずに、プラットフォームの OpenGL API を直接使用することも可能ですが、その場合は移植性が損なわれる可能性があります。 OpenGL 1.x または OpenGL ES 1.x を使用する場合は、後者の方法が必要となります。
OpenGL API の詳細については、OpenGL の公式ドキュメントを参照してください。
QOpenGLContext の使用例については、「OpenGL ウィンドウ」の例を参照してください。
スレッドアフィニティ
QOpenGLContext は、moveToThread() を使用して別のスレッドに移動することができます。QOpenGLContext オブジェクトが属するスレッドとは異なるスレッドから、makeCurrent() を呼び出さないでください。コンテキストは、一度に 1 つのスレッドと 1 つのサーフェスに対してのみアクティブになることができ、スレッドは一度に 1 つのコンテキストしかアクティブにできません。
コンテキストのリソース共有
テクスチャや頂点バッファオブジェクトなどのリソースは、コンテキスト間で共有できます。コンテキスト間でこれらのリソースを共有するように指定するには、create() を呼び出す前にsetShareContext() を使用してください。QOpenGLContext は内部でQOpenGLContextGroup オブジェクトを追跡しており、これにはshareGroup() を使用してアクセスでき、指定された共有グループ内のすべてのコンテキストを検索するために使用できます。 シェアグループは、正常に初期化され、そのシェアグループ内の既存のコンテキストとリソースを共有しているすべてのコンテキストで構成されます。共有していないコンテキストのシェアグループは、単一のコンテキストのみで構成されます。
デフォルトのフレームバッファ
特定のプラットフォームでは、現在のサーフェスによっては、0 以外のフレームバッファがデフォルトのフレームバッファとなる場合があります。アプリケーションの異なるプラットフォーム間での移植性を確保するため、glBindFramebuffer(0) を呼び出す代わりに、glBindFramebuffer(ctx->defaultFramebufferObject()) を使用することをお勧めします。 ただし、QOpenGLFunctions::glBindFramebuffer() を使用する場合は、この処理が自動的に行われます。
警告: WebAssembly
QSurface の存続期間全体を通じて、QSurface を使用して現在のコンテキストとして設定される QOpenGLContext は 1 つだけにすることをお勧めします。複数のコンテキストを使用する場合、WebAssembly プラットフォームでは、複数の QOpenGLContext インスタンスが、内部では同じネイティブコンテキストによって裏付けられている可能性があることを理解しておくことが重要です。 したがって、2つのQOpenGLContextオブジェクトに対して、同じQSurface を引数としてmakeCurrent()を呼び出した場合、2回目の呼び出しでは別のネイティブコンテキストに切り替わらない可能性があります。その結果、2回目のmakeCurrent()の後に実行されたOpenGLの状態変更は、すべて同じネイティブコンテキストをバックエンドとしているため、最初のQOpenGLContextの状態も変更してしまう可能性があります。
注:これは 、既存の Qt OpenGL ベースのコードで WebAssembly をターゲットとする場合、これらの制限に対応するために、ある程度の移植作業が必要になる可能性があることを意味します。
セキュリティ上の考慮事項
QOpenGLContext および、QOpenGLFunctions 、QtOpenGL モジュールのクラス、OpenGL バックエンドを持つQRhi など、それに基づいて構築されたクラスが使用するすべてのデータは、信頼できるコンテンツであることが想定されています。これには、シェーダーのソースコード、頂点およびインデックスデータ、テクスチャやその他のピクセルデータ、および OpenGL 関数に渡されるすべてのパラメータが含まれます。 Qt は、これらについて検証やサニタイズを行いません。
また、getProcAddress() は、OpenGL 実装から名前によって解決された生の関数ポインタを返す点にも注意してください。Qt は、呼び出し元がキャストするシグネチャが実装が提供するものと一致しているかどうかを確認することはできません。これを誤ると、未定義の挙動を引き起こします。
OpenGL の実装(つまり、ドライバ、およびそれを持つプラットフォームでは、ドライバにディスパッチを行うライブラリ)は、信頼されたインプロセス・プラットフォーム依存関係です。Qt は、Vulkan の実装を扱うのと同様に、サンドボックス化や検証を行うことなく、これをロードして直接呼び出します。
どのライブラリが読み込まれるかは、プラットフォームの通常の共有ライブラリ検索順序によって決定され、一部のプラットフォームでは環境変数によっても決定されます。この選択は、デプロイメントの信頼できる構成の一部です。これを制御できないデプロイメントは、プロセス内でどのネイティブコードが実行されるかを制御できません。
警告:アプリケーション開発者は 、アプリケーションの一部ではなく、かつ開発者の管理下にないユーザー提供のコンテンツの取り込みを許可する前に、その潜在的な影響を慎重に検討することを推奨します。
関連項目: 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 は、それに最も近いバージョンのコンテキストを作成しようと試みます。 実際に作成されたコンテキストのプロパティは、format() 関数が返すQSurfaceFormat を使用して照会できます。たとえば、OpenGL 4.3 コアプロファイルをサポートするコンテキストを要求したものの、ドライバやハードウェアがバージョン 3.2 コアプロファイルのコンテキストしかサポートしていない場合、3.2 コアプロファイルのコンテキストが取得されます。
ネイティブコンテキストが正常に作成され、makeCurrent() やswapBuffers() などで使用可能な状態になっている場合、true を返します。
注:コンテキストがすでに存在する場合 、この関数はまず既存のコンテキストを破棄してから、新しいコンテキストを作成します。
makeCurrent() およびformat()も参照してください 。
[static] QOpenGLContext *QOpenGLContext::currentContext()
現在のスレッド内でmakeCurrent を呼び出した最後のコンテキストを返します。現在のコンテキストがない場合は、nullptr を返します。
GLuint QOpenGLContext::defaultFramebufferObject() const
現在のサーフェスのデフォルトのフレームバッファオブジェクトを取得するには、これを呼び出します。
一部のプラットフォーム(例えばiOS)では、デフォルトのフレームバッファオブジェクトはレンダリング先のサーフェスによって異なり、0とは異なる値になる場合があります。 したがって、アプリケーションをさまざまな Qt プラットフォームで動作させたい場合は、glBindFramebuffer(0) を呼び出す代わりに、glBindFramebuffer(ctx->defaultFramebufferObject()) を呼び出す必要があります。
QOpenGLFunctions 内の glBindFramebuffer() を使用する場合は、0 が渡されると現在のコンテキストの defaultFramebufferObject() が自動的にバインドされるため、この点について心配する必要はありません。
注: QOpenGLWidget やQQuickWidget のように、フレームバッファオブジェクトを介してレンダリングを行うウィジェットは 、ペイントがアクティブな場合、この関数から返される値を上書きします。これは、その時点で正しい「デフォルト」のフレームバッファは、トップレベルのウィンドウのサーフェスに属するプラットフォーム固有のものではなく、そのウィジェットに関連付けられたバッキングフレームバッファであるためです。 これにより、この関数およびこれに依存する他のクラス(例えば、QOpenGLFramebufferObject::bindDefault() やQOpenGLFramebufferObject::release() など)に対して、期待される動作が保証されます。
QOpenGLFramebufferObjectも参照してください 。
void QOpenGLContext::doneCurrent()
0のサーフェスを指定してmakeCurrent を呼び出すための便利な関数です。
これにより、現在のスレッドではコンテキストが存在しなくなります。
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
procName で指定されたOpenGL拡張関数への関数ポインタを解決します。
この関数を使用すると、すべてのプラットフォームでリンク済みシンボルとして利用できない可能性がある OpenGL 拡張関数やコア関数にアクセスできます。
返されるポインタはプラットフォームに依存する場合があります。一部のシステムでは、関数が無効またはサポートされていない場合でも、nullptr ではないポインタが返されることがあります。
関数の利用可否を確実に確認するには、QOpenGLContext::hasExtension() を呼び出して拡張機能のサポートを確認してください。コア関数については、QOpenGLContext::format() によって返されるQSurfaceFormat 内のversion() を使用して、現在のコンテキストのバージョンを確認してください。
QFunctionPointer QOpenGLContext::getProcAddress(const char *procName) const
これはオーバーロードされた関数です。
[static] QOpenGLContext *QOpenGLContext::globalShareContext()
存在する場合、アプリケーション全体で共有される OpenGL コンテキストを返します。存在しない場合は、nullptr を返します。
これは、QOpenGLWidget やQQuickWidget を作成または表示する前に、OpenGL オブジェクト(バッファ、テクスチャなど)をアップロードする必要がある場合に便利です。
警告: この関数が返すコンテキストを、いかなるサーフェスでも現在のコンテキストに設定しようとしないでください 。代わりに、グローバルなコンテキストと共有する新しいコンテキストを作成し、その新しいコンテキストを現在のコンテキストに設定してください。
関連項目: 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 を有効にすることで実現できます。これにより、基盤となるネイティブOpenGLコンテキストにおいてRESET_NOTIFICATION_STRATEGY_EXT が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)
これにより、このコンテキストはshareContext とテクスチャ、シェーダー、およびその他のOpenGLリソースを共有するようになります。この設定が有効になるには、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()を呼び出すようにしてください。
© 2026 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.