QOpenGLContext Class
QOpenGLContextクラスは、ネイティブのOpenGLコンテキストを表し、QSurface...続きを読む
Header: | #include <QOpenGLContext> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
qmake: | QT += gui |
Inherits: | 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
現在のサーフェスのデフォルトのフレームバッファオブジェクトを取得するためにこれを呼び出します。
いくつかのプラットフォーム(例えばiOS)では、デフォルトのフレームバッファオブジェクトはレンダリングされるサーフェスに依存し、0とは異なるかもしれません。したがって、異なる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 を有効にすることで可能です。これは、基盤となるネイティブ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)
このコンテキストは、テクスチャ、シェーダ、およびその他の 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 ()を再度呼び出すようにしてください。
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。