qt QOpenGLContext详解

1. 概述

QOpenGLContext 是 Qt 提供的一个类,用于管理 OpenGL 上下文。它封装了 OpenGL 上下文的创建、配置和管理功能,使得开发者可以在 Qt 应用程序中以平台无关的方式使用 OpenGL。通过 QOpenGLContext,可以轻松地创建和管理 OpenGL 上下文,并与 Qt 的窗口系统集成。

2. 重要函数

构造和析构
  • QOpenGLContext(QObject *parent = nullptr)

    构造函数,创建一个新的 QOpenGLContext 实例。

  • virtual ~QOpenGLContext()

    虚析构函数,确保资源被正确释放。

上下文创建和初始化
  • bool create()

    创建 OpenGL 上下文。必须在设置格式、屏幕和共享上下文后调用。

  • bool isValid() const

    检查上下文是否成功创建。

上下文管理
  • bool makeCurrent(QSurface *surface)

    将上下文设置为当前线程的当前上下文,并与指定表面关联。

  • void doneCurrent()

    使当前线程没有上下文成为当前上下文。

  • void swapBuffers(QSurface *surface)

    交换指定表面的前后缓冲区。

格式和屏幕
  • void setFormat(const QSurfaceFormat &format)

    设置上下文的格式。

  • QSurfaceFormat format() const

    获取上下文的实际格式。

  • void setScreen(QScreen *screen)

    设置上下文的屏幕。

  • QScreen *screen() const

    获取上下文的屏幕。

资源共享
  • void setShareContext(QOpenGLContext *shareContext)

    设置共享上下文。

  • QOpenGLContext *shareContext() const

    获取共享上下文。

OpenGL 函数访问
  • QOpenGLFunctions *functions() const

    获取当前上下文的 QOpenGLFunctions 实例。

  • QOpenGLExtraFunctions *extraFunctions() const

    获取当前上下文的 QOpenGLExtraFunctions 实例。

  • QFunctionPointer getProcAddress(const QByteArray &procName) const

    获取指定 OpenGL 函数的指针。

  • QFunctionPointer getProcAddress(const char *procName) const

    获取指定 OpenGL 函数的指针。

扩展和版本
  • QSet<QByteArray> extensions() const

    获取上下文支持的 OpenGL 扩展。

  • bool hasExtension(const QByteArray &extension) const

    检查上下文是否支持指定的扩展。

  • bool isOpenGLES() const

    检查上下文是否为 OpenGL ES。

  • QAbstractOpenGLFunctions *versionFunctions(const QOpenGLVersionProfile &versionProfile = QOpenGLVersionProfile()) const

    获取指定版本的 OpenGL 函数集。

其他
  • GLuint defaultFramebufferObject() const

    获取当前表面的默认帧缓冲对象。

  • QVariant nativeHandle() const

    获取上下文的原生句柄。

  • QSurface *surface() const

    获取当前关联的表面。

3. 静态公共成员

QOpenGLContext 提供了一些静态公共成员函数,这些函数主要用于全局管理 OpenGL 上下文和查询 OpenGL 环境的状态。这些静态函数可以在不创建 QOpenGLContext 实例的情况下直接使用。

  • bool areSharing(QOpenGLContext *first, QOpenGLContext *second)

    检查两个 QOpenGLContext 实例是否共享资源。
    参数

    • first:第一个 OpenGL 上下文。

    • second:第二个 OpenGL 上下文。
      返回值 :如果两个上下文共享资源,则返回 true,否则返回 false
      用途:确认两个上下文是否可以访问彼此的资源(如纹理、缓冲区等)。

  • QOpenGLContext *currentContext()

    获取当前线程的当前 OpenGL 上下文。
    返回值 :返回当前线程的当前 QOpenGLContext 实例,如果没有上下文,则返回 nullptr
    用途:查询当前线程中正在使用的 OpenGL 上下文,常用于调试或在多上下文环境中管理资源。

  • QOpenGLContext *globalShareContext()

    获取全局共享上下文。
    返回值 :返回全局共享的 QOpenGLContext 实例,如果没有设置全局共享上下文,则返回 nullptr
    用途:全局共享上下文通常用于在多个窗口或上下文之间共享资源。通过调用此函数,可以获取全局共享上下文,从而实现资源的共享。

  • void *openGLModuleHandle()

    获取 OpenGL 模块的句柄。
    返回值 :返回 OpenGL 模块的句柄(例如,HMODULE 在 Windows 上,void* 在其他平台上)。
    用途:获取 OpenGL 动态链接库(DLL 或共享库)的句柄,以便进行进一步的模块操作或调试。

  • QOpenGLContext::OpenGLModuleType openGLModuleType()

    获取 OpenGL 模块的类型。
    返回值 :返回 QOpenGLContext::OpenGLModuleType 枚举值,表示 OpenGL 模块的类型:

    • DesktopOpenGL:桌面 OpenGL。

    • OpenGLES:OpenGL ES。

    • LibGL:使用 libGL 的 OpenGL。

    • LibGLES:使用 libGLES 的 OpenGL。
      用途:查询当前系统中使用的 OpenGL 实现类型,这对于跨平台开发和调试非常有用。

  • bool supportsThreadedOpenGL()

    检查系统是否支持多线程 OpenGL。
    返回值 :如果系统支持多线程 OpenGL,则返回 true,否则返回 false
    用途 :确定是否可以在多线程环境中安全地使用 OpenGL。如果返回 false,则需要避免在多线程中使用 OpenGL,或者采取额外的同步措施。

    class OpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core {

    public:
    OpenGLWidget(QWidget parent = nullptr) : QOpenGLWidget(parent) {}
    protected:
    // 初始化 OpenGL 上下文
    void initializeGL() override {
    // 初始化 OpenGL 函数
    initializeOpenGLFunctions();
    // 获取当前 OpenGL 上下文
    QOpenGLContext context = this->context();
    if (context) {
    qDebug() << "OpenGL context created:" << context->format().majorVersion() << "." << context->format().minorVersion();
    }
    // 设置清屏颜色
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    }
    // 调整 OpenGL 视口
    void resizeGL(int w, int h) override {
    glViewport(0, 0, w, h);
    }
    // 绘制 OpenGL 场景
    void paintGL() override {
    // 清除颜色缓冲区
    glClear(GL_COLOR_BUFFER_BIT);
    // 定义三角形的顶点坐标和颜色
    GLfloat vertices[] = {
    // 位置 // 颜色
    0.0f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, // 顶部
    -0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, // 左下角
    0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f // 右下角
    };
    // 创建并绑定顶点数组对象 (VAO)
    GLuint VAO;
    glGenVertexArrays(1, &VAO);
    glBindVertexArray(VAO);
    // 创建并绑定顶点缓冲对象 (VBO)
    GLuint VBO;
    glGenBuffers(1, &VBO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    // 设置顶点属性
    // 位置属性
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid
    )0);
    glEnableVertexAttribArray(0);
    // 颜色属性
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid
    )(3 * sizeof(GLfloat)));
    glEnableVertexAttribArray(1);
    // 绘制三角形
    glDrawArrays(GL_TRIANGLES, 0, 3);
    // 解绑 VAO 和 VBO
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindVertexArray(0);
    }
    };

    int main(int argc, char *argv[])
    {
    QApplication app(argc, argv);

    复制代码
      OpenGLWidget widget;
      widget.resize(800, 600);
      widget.show();
    
      return app.exec();

    }

觉得有帮助的话,打赏一下呗。。

需要商务合作(定制程序)的欢迎私信!!

相关推荐
bjxiaxueliang2 小时前
Qt搭配CLion:Mac电脑M芯片Qt开发环境
qt·macos
水瓶丫头站住4 小时前
Qt 读取数据库
数据库·qt
小gpt&7 小时前
03 介绍ffmpeg 视频解码流程
c++·qt·ffmpeg·音视频
Wizard79718 小时前
在linux 系统下的qt 安装mqtt库
linux·运维·qt
yuyuyuliang0019 小时前
Qt SQL-1
sql·qt
此刻我在家里喂猪呢20 小时前
qt介绍图表 charts 一
开发语言·qt
byxdaz20 小时前
Qt Graphics View
开发语言·qt
威桑20 小时前
Qt 中 isHidden 和 isVisible 的区别与使用
开发语言·c++·qt
დ旧言~20 小时前
【QT】QT 的窗口坐标 && 信号与槽
qt
vegetablesssss20 小时前
QT5.15.2加载pdf为QGraphicsScene的背景
qt·pdf