QOpenGLContext 类
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 渲染 的一个部分。
公共类型
枚举 | 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本身不同所有权的任何已分配资源。
一旦QOpenGLContext变为当前上下文,您就可以使用Qt的OpenGL启用器(例如QOpenGLFunctions、QOpenGLBuffer、QOpenGLShaderProgram和QOpenGLFramebufferObject)以平台无关的方式对其进行渲染。也可以直接使用平台的OpenGL API,而不使用Qt启用器,尽管这可能牺牲可移植性。当需要使用OpenGL 1.x或OpenGL ES 1.x时,后者是必要的。
有关OpenGL API的更多信息,请参阅官方OpenGL文档。
有关如何使用QOpenGLContext的示例,请参阅OpenGL窗口示例。
线程亲和力
可以使用moveToThread()将QOpenGLContext移动到另一个线程。不要从不属于QOpenGLContext对象的线程调用makeCurrent().一个上下文一次只能在一个线程和表面上是当前的,并且一个线程一次只能有一个当前上下文。
上下文资源共享
如纹理和顶点缓冲对象等资源可以在上下文之间共享。在调用create()()之前使用setShareContext()来指定上下文应共享这些资源。QOpenGLContext内部跟踪一个QOpenGLContextGroup对象,可以通过shareGroup()()访问它,并且可以使用它来查找给定共享组中的所有上下文。共享组由共享现有上下文的共享组的所有已成功初始化的上下文组成。一个不共享的上下文有一个仅包含一个上下文的共享组。
默认帧缓冲区
在某些平台上,默认帧缓冲区可能是除0以外的帧缓冲区,具体取决于当前表面。而不是调用glBindFramebuffer(0),建议您使用glBindFramebuffer(ctx->defaultFramebufferObject()()),以确保您的应用程序在不同平台之间是可移植的。然而,如果您使用QOpenGLFunctions::glBindFramebuffer(),这会自动为您完成。
另请参阅 QOpenGLFunctions、QOpenGLBuffer、QOpenGLShaderProgram 和 QOpenGLFramebufferObject。
成员类型文档
枚举 QOpenGLContext::OpenGLModuleType
此枚举定义了底层OpenGL实现的类型。
常量 | 值 | 描述 |
---|---|---|
QOpenGLContext::LibGL | 0 | OpenGL |
QOpenGLContext::LibGLES | 1 | OpenGL ES 2.0 或更高版本 |
成员函数文档
[显式]
QOpenGLContext::QOpenGLContext(QObject *parent = nullptr)
创建一个新的带有父对象 parent 的OpenGL上下文实例。
在可以使用之前,您需要设置适当的格式并调用 create()。
另请参阅 create() 和 makeCurrent。
[虚拟 noexcept]
QOpenGLContext::~QOpenGLContext()
销毁 QOpenGLContext 对象。
如果是该线程的当前上下文,将调用 doneCurrent。
[信号]
void QOpenGLContext::aboutToBeDestroyed()
在销毁底层原生OpenGL上下文前发出此信号,以便用户可以清理可能被视为悬挂的OpenGL资源。
如果您希望将上下文设置为当前上下文以进行清理,请确保仅使用直接连接连接到该信号。
注意:在 Qt for Python 中,由于Python实例已被销毁,当从 QOpenGLWidget 或 QOpenGLWindow 的析构函数中发出此信号时,不会收到此信号。我们建议在 QWidget::hideEvent() 中进行清理。
[静态]
bool QOpenGLContext::areSharing(QOpenGLContext *first, QOpenGLContext *second)
如果 first 和 second 上下文正在共享OpenGL资源,则返回 true
。
bool QOpenGLContext::create()
尝试使用当前配置创建OpenGL上下文。
当前配置包括格式、共享上下文和屏幕。
如果您的系统上的OpenGL实现不支持请求的OpenGL上下文版本,则 QOpenGLContext 将尝试创建最接近的匹配版本。可以使用由 format() 函数返回的 QSurfaceFormat 查询实际创建的上下文属性。例如,如果您请求支持OpenGL 4.3 Core profile的上下文,但驱动程序和/或硬件仅支持版本3.2 Core profile上下文,则您将得到3.2 Core profile上下文。
如果原生上下文已成功创建并准备好与 makeCurrent()、swapBuffers() 等一起使用,则返回 true
。
注意:如果上下文已存在,此函数将首先销毁现有上下文,然后创建一个新上下文。
另请参阅 makeCurrent() 和 format。
[静态]
QOpenGLContext *QOpenGLContext::currentContext()
返回当前线程中最后调用makeCurrent的上下文,如果没有当前上下文,则返回nullptr
。
GLuint QOpenGLContext::defaultFramebufferObject() const
用此方法获取当前表面的默认帧缓冲对象。
在某些平台上(例如iOS),默认帧缓冲对象取决于渲染到的表面,并且可能不等于0。因此,如果你想在不同Qt平台上让应用程序工作,你应该调用ctx->defaultFramebufferObject()
而不是glBindFramebuffer(0)
。
如果你在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
将函数指针解析为OpenGL扩展函数,该扩展函数由procName标识。
如果没有找到这样的函数,则返回nullptr
。
QFunctionPointer QOpenGLContext::getProcAddress(const char *procName) const
这是一个重载函数。
[静态]
QOpenGLContext *QOpenGLContext::globalShareContext()
如果存在全局共享OpenGL上下文,则返回应用范围内的共享OpenGL上下文。否则,返回nullptr
。
当您需要在创建或显示QOpenGLWidget或QQuickWidget之前上传OpenGL对象(缓冲区、纹理等)时,这非常有用。
注意:您必须在创建QGuiApplication对象之前将Qt::AA_ShareOpenGLContexts标志设置在QGuiApplication上,否则Qt可能不会创建全局共享上下文。
警告:请不要尝试在任一表面上将此函数返回的上下文设置为当前上下文。相反,您可以创建一个新的与全局上下文共享的新上下文,然后使该新上下文成为当前上下文。
另请参阅 Qt::AA_ShareOpenGLContexts、setShareContext和makeCurrent。
bool QOpenGLContext::hasExtension(const QByteArray &extension) const
如果此OpenGL上下文支持指定的OpenGL 扩展,则返回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 线程亲和力 文档中解释的从线程外部使用 QObjects 的后果。
另请参阅 functions(),doneCurrent() 和 Qt::AA_DontCheckOpenGLContextThreadAffinity。
template <typename QNativeInterface> QNativeInterface *QOpenGLContext::nativeInterface() const
为上下文返回给定类型的本机接口。
此函数提供对定义在 QNativeInterface 命名空间中 QOpenGLContext 的平台特定功能的访问。
Native interface to an NSOpenGLContext on macOS | |
Native interface to an EGL context | |
Native interface to a GLX context | |
Native interface to a WGL context on Windows |
If the requested interface is not available, a nullptr is returned.
[static]
QOpenGLContext::OpenGLModuleType QOpenGLContext::openGLModuleType()
Returns the underlying OpenGL implementation type.
On platforms where the OpenGL implementation is not dynamically loaded, the return value is determined during compile time and never changes.
Note: A desktop OpenGL implementation may be capable of creating ES-compatible contexts too. Therefore in most cases it is more appropriate to check QSurfaceFormat::renderableType() or use the convenience function isOpenGLES().
Note: This function requires that the QGuiApplication instance is already created.
QScreen *QOpenGLContext::screen() const
Returns the screen the context was created for.
See also setScreen().
void QOpenGLContext::setFormat(const QSurfaceFormat &format)
设置OpenGL上下文应兼容的format。您需要在它生效前调用create()。
当格式未通过此函数显式设置时,将使用QSurfaceFormat::defaultFormat()返回的格式。这意味着在具有多个上下文的情况下,可以通过在创建第一个上下文之前对QSurfaceFormat::setDefaultFormat()进行一次调用来替换对函数的单个调用。
See also format().
void QOpenGLContext::setScreen(QScreen *screen)
设置OpenGL上下文应有效的screen。您需要在它生效前调用create()。
See also screen().
void QOpenGLContext::setShareContext(QOpenGLContext *shareContext)
使此上下文与shareContext共享纹理、着色器和其他OpenGL资源。您需要在它生效前调用create()。
See also shareContext().
QOpenGLContext *QOpenGLContext::shareContext() const
Returns the share context this context was created with.
If the underlying platform was not able to support the requested sharing, this will return 0.
See also setShareContext().
QOpenGLContextGroup *QOpenGLContext::shareGroup() const
Returns the share group this context belongs to.
[static]
bool QOpenGLContext::supportsThreadedOpenGL()
Returns true
if the platform supports OpenGL rendering outside the main (gui) thread.
该值由当前使用的平台插件控制,也可能取决于图形驱动程序。
QSurface *QOpenGLContext::surface() const
返回已使上下文成为当前上下文的表面。
这是传递给 makeCurrent() 函数的参数表面对象。
void QOpenGLContext::swapBuffers(QSurface *surface)
交换surface的最后和前置缓存。
调用此函数以完成OpenGL渲染帧,并在发射任何进一步的OpenGL命令之前(例如,在新帧范围内)重新调用makeCurrent(),确保正确刷新屏幕。
© 2024 The Qt Company Ltd. 本文档中的贡献均为各自所有者的版权。所提供的文档受GNU自由文档许可协议第1.3版的约束,由自由软件基金会发布。Qt及其相关标志是芬兰和/或其他国家的The Qt Company Ltd.的商标。所有其他商标均为其各自所有者的财产。