背景
因为Qt已经封装了openGL,所以结合Qt进行openGL学习将会比较便捷。
配置
为了在Qt(6.3.1) & Qt Creator(8.0.1) 中使用openGL,需要在CmakesList.txt中配置:
find_package(Qt6 REQUIRED COMPONENTS Core Gui OpenGL OpenGLWidgets Widgets)
target_link_libraries(MyQtApp PRIVATE Qt${QT_VERSION_MAJOR}::Widgets
Qt::Core
Qt::Gui
Qt::OpenGL
Qt::OpenGLWidgets
Qt::Widgets)
窗口绘制
QOpenGLWidget
Qt5.4之前,Qt可以通过一个QGLWidget类来创建opengl窗口,但由于opengl的发展,在5.4版本的时候,Qt提供了一个QGLWidget的现代替代品——QOpenGLWidget。因此,这个教程使用的是QOpenGLWidget来创建和管理窗口。
创建opengl窗口只需新建类继承于QOpenGLWidegt,再实现QOpenGL提供的三个虚函数,就可以完成opengl窗口的创建。
- initializeGL() — 建立OpenGL的资源和状态。在第一次调用resizeGL()或paintGL()之前调用一次
- resizeGL() — 设置OpenGL视口,投影等。每当调整Widget的大小时(第一次显示窗口Widget时会调用它,因为所有新创建Widget都会自动获得调整大小的事件)。
- paintGL() — 渲染OpenGL场景,需要更新Widget时就会调用。
QOpenGLExtraFunctions
QOpenGLExtraFunctions类继承于QOpenGLFunctions,相较于QOpenGLFunctions,额外提供了对OpenGL ES 3.0、3.1和3.2 API的跨平台访问,如果我们需要在类中使用opengl函数,只需要使类继承于QOpenGLExtraFunctions。
创建工程
创建 Qt Widgets Application,新建widget.cpp / widget.h, 并在widget.h中包含头文件 、 修改Widget公有继承自这两个类
重写 initializeGL()、resizeGL(int w,int h)、paintGL(),一般使用protected修饰
完成后你的Widget.h应该是如下的样子:
#ifndef WIDGET_H
#define WIDGET_H
#include <QOpenGLWidget>
#include <QOpenGLExtraFunctions>
class Widget : public QOpenGLWidget,public QOpenGLExtraFunctions
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
protected:
virtual void initializeGL() override;
virtual void resizeGL(int w,int h) override;
virtual void paintGL() override;
};
#endif // WIDGET_H
再对函数进行实现,你的Widget.cpp应该是如下的样子:
#include "widget.h"
Widget::Widget(QWidget *parent)
: QOpenGLWidget(parent)
{}
Widget::~Widget()
{}
void Widget::initializeGL()
{
this->initializeOpenGLFunctions(); //初始化opengl函数
}
void Widget::resizeGL(int w, int h)
{
this->glViewport(0,0,w,h); //定义视口区域
}
void Widget::paintGL()
{
this->glClearColor(0.1f,0.5f,0.7f,1.0f); //设置清屏颜色
this->glClear(GL_COLOR_BUFFER_BIT); //清除颜色缓存
}
然后在main函数入口中调用:
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
即可以看到运行程序: