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)
创建应用程序
让应用程序支持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,然后运行程序。
注意,使用GMOpenGLWidget这个提升类的时候,一定要注意将GLFunction进行初始化,否则会产生空指针异常。
这样我们的OpenGL简单配置就已经完成了。这个demo将一个Qt程序使用OpenGL,绘制了一个渲染区域。我们将这个渲染区域的背景颜色变成了青色。