Qt学习 - OpenGL

264 阅读2分钟

QOpenGLWidget 不需要GLFW

QOpenGLWidget提供了三个便携的虚函数。可以重载,用来实现典型的OpenGl任务。

  • paintGL: 渲染OpenGL场景。widget需要更新时调用
  • resizeGL:设置OpenGL视口。投影等。widget调整大小(或首次显示时调用)。
  • initalizeGL:设置OpenGL资源和状态。第一次调用resizeGL/paintGL之前调用一次。

如果需要从paintGL以外的位置触发重新绘制(典型实例就是使用计时器设置场景动画)则应该调用widget的update()函数来安排更新。

调用OpenGL、resizeGL、initializeGL时,widget的OpenGL呈现上下文变成当前。如果需要从其他位置调用标准OpenGL API函数。必须首先调用makeCurrent()。

在paintGL以外的地方调用绘制函数。没有任何意义。绘制图像最终会被paintGL覆盖。

QOpenGLFunctions_x_x_Cores 不需要GLAD

QOpenGLFunctions_X_X_Core提供OpenGL X.X版本核心模式的所有功能。是对OpenGL函数的封装。

  • initializeOpenGLFunctions:初始化OpenGL函数,将Qt里面的函数指针指向显卡的函数。
glClearColor(0.2f,0.3f,0.3f,1.0f);
glClear(GL_COLOR_BUFFER_BIT)

创建应用程序

图片.png

让应用程序支持OpenGL

  • 新建一个类,该类继承了QOpenGL和QOpenGLFunctions_3_3_Core
  • 重写OpenGLWidget的paintGL、resizeGL、initalizeGL方法
// GMOpenGLWidget.h
#ifndef GMOPENGLWIDGET_H
#define GMOPENGLWIDGET_H

#include <QWidget>
#include <QOpenGLWidget>
#include <QOpenGLFunctions_3_3_Core>

class GMOpenGLWidget:public QOpenGLWidget,QOpenGLFunctions_3_3_Core
{
public:
    explicit GMOpenGLWidget(QWidget *parent=nullptr);


    // QOpenGLWidget interface
protected:
    virtual void initializeGL();
    virtual void resizeGL(int w, int h);
    virtual void paintGL();
signals:
public slots:
};

#endif // GMOPENGLWIDGET_H
// GMOpenGLWidget.cpp
#include "gmopenglwidget.h"

GMOpenGLWidget::GMOpenGLWidget(QWidget *parent):QOpenGLWidget(parent)
{

}

void GMOpenGLWidget::initializeGL()
{
    initializeOpenGLFunctions();
}

void GMOpenGLWidget::resizeGL(int w, int h)
{

}

void GMOpenGLWidget::paintGL()
{
    glClearColor(0.2f,0.3f,0.3f,1.0f);
    glClear(GL_COLOR_BUFFER_BIT);
}

  • 将在页面上插入的OpenGLWidget提升为刚刚设置好的GMOpenGLWidget,然后运行程序。

图片.png

注意,使用GMOpenGLWidget这个提升类的时候,一定要注意将GLFunction进行初始化,否则会产生空指针异常。

这样我们的OpenGL简单配置就已经完成了。这个demo将一个Qt程序使用OpenGL,绘制了一个渲染区域。我们将这个渲染区域的背景颜色变成了青色。