一、说明
在使用VS编写OpenGL程序时需要用到第三方库GLFW和GLAD;Qt自己对OpenGL进行了封装,所以不需要使用GLFW和GLAD
1、GLFW解决操作系统层面的不同
- 创建窗口
- 定义上下文
- 处理用户输入
2、GLAD使得代码可以用于不同的OpenGL驱动
- OpenGL本身只是标准/规范
- 各个厂家具体实现方式可以不同
二、QOpenGLWidget:代替GLFW
QOpenGLWidget提供了三个便捷的虚函数,可以重载,用来实现典型的OpenGL任务:
- paintGL:渲染OpenGL场景,widget刷新时调用;
- resizeGL:设置OpenGL视口、投影等,widget调整大小(或首次显示)时调用;
- initializeGL:设置OpenGL资源和状态,第一次调用paintGL/resizeGL之前调用一次。
如果需要从其他位置(例如,在widget的构造函数或自己的绘制函数中)调用标准的OpenGL API函数,则必须首先调用makeCurrent(),更改上下文,然后调用doneCurrent()结束更改上下文,最后调用update(),安排更新。
三、OpenGLFunctions_X_X_Core:代替GLAD
OpenGLFunctions_X_X_Core提供OpenGL X.X版本核心模式的所有功能,是对OpenGL函数的封装:
- initiazeOpenGLFunctions:初始化OpenGL函数,将Qt里的函数指针指向显卡的函数
四、QOpenGLWidget和OpenGLFunctions_X_X_Core的使用
Qt使用QOpenGLWidget和OpenGLFunctions_X_X_Core需要自定义一个类,这个类继承自QOpenGLWidget和OpenGLFunctions_X_X_Core
新建Qt Widgets Application应用,名称为Samp_1_2_1,基类选择QMainWindow;
新建一个自定义的类MyOpenGLWidget,更改myopenglwidget.h代码如下:
#ifndef MYOPENGLWIDGET_H
#define MYOPENGLWIDGET_H
#include <QOpenGLWidget>
#include <QOpenGLFunctions_3_3_Core>
class MyOpenGLWidget : public QOpenGLWidget,QOpenGLFunctions_3_3_Core
{
Q_OBJECT
public:
explicit MyOpenGLWidget(QWidget *parent = nullptr);
protected:
//重新实现三个虚函数
virtual void initializeGL();
virtual void resizeGL(int w, int h);
virtual void paintGL();
};
#endif // MYOPENGLWIDGET_H
myopenglwidget.cpp代码如下:
#include "myopenglwidget.h"
MyOpenGLWidget::MyOpenGLWidget(QWidget *parent) : QOpenGLWidget(parent)
{
}
void MyOpenGLWidget::initializeGL()
{
//初始化OpenGL函数
initializeOpenGLFunctions();
}
void MyOpenGLWidget::resizeGL(int w, int h)
{
Q_UNUSED(w);
Q_UNUSED(h);
}
void MyOpenGLWidget::paintGL()
{
//设置清空屏幕所用的颜色
glClearColor(0.2f, 0.3f, 0.3f, 1.0f); //状态设置
glClear(GL_COLOR_BUFFER_BIT); //状态使用
}
双击mainwindow.ui,切换到界面编辑器,往界面上拖拽一个OpenGL Widget组件
右击openGLWidget,选择“提升为”
输入自定义类名,点击“添加”,再点击“提升”
openGLWidget组件的基类被更改
在mainwindow.cpp文件的构造函数中添加如下一行代码,设置openGLWidget组件为中心组件
this->setCentralWidget(ui->openGLWidget);
运行结果如下:
注:观看OpenGL中文官网(https://learnopengl-cn.github.io/)和阿西拜的现代OpenGL入门(https://ke.qq.com/course/3999604#term_id=104150693)学习OpenGL