在Qt5.4之前,OpenGL在Qt中的实现主要是继承QGLWidget,在5.4版本之后,则改为QOpenGLWidget和QOpenGLFunctions(QOpenGLExtraFunctions),这是qt官方的推荐写法,可以在qt自带的examples中搜索opengl找到。
除了这种写法,直接使用指定OpenGL版本的包装器也是可以的,在头文件中包含QOpenGLFunctions_x_x_Core,使用其对象便可,_x_x_是指定的版本,如QOpenGLFunctions_3_3_Core,意思是使用OpenGL3.3的版本。要注意的是,此种方法只能使用OpenGL的核心模式(core profile),有关核心模式和兼容模式的区别,可以参照这篇:https://blog.csdn.net/qq_37996632/article/details/100181462
以官方推荐的写法为准, 下面介绍一下如何以QOpenGLWidget,QOpenGLFunctions(QOpenExtraGLFunctions)来实现OpenGL程序。
1.首先新建qt项目,Base Class选择QWidget,并且不需要.ui界面。
建完之后我们的项目文件应该是这三个,main.cpp和 widget这个类的文件。
2.添加QOpenGLWidget和QOpenGLExtraFunctions的头文件
和以前的方法不同的是,并不需要在.pro文件中添加QT ++ opengl等等。直接在widget.h中包含QOpenglWidget,QOpenGLExtrafunctions,继承即可。(QOpenGLExtraFunctions比父类OpenGLFunctions多了一些函数,如glGenVertexArrays(1,&VAO);)
#ifndef WIDGET_H
#define WIDGET_H
#include
#include
class Widget : public QOpenGLWidget, protected QOpenGLFunctions
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
};
#endif // WIDGET_H
3.实现OpenGLWidget的三个重要函数
initializeGL() :初始化OpenGL,建立OpenGL的资源和状态
resizeGL(int w, int h) :设置OpenGL视口,调整窗口大小
paintGL() :渲染OpenGL场景
#ifndef WIDGET_H
#define WIDGET_H
#include
#include
class Widget : public QOpenGLWidget, protected QOpenGLFunctions
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
protected:
void initializeGL() override;
void resizeGL(int w, int h) override;
void paintGL() override;
};
#endif // WIDGET_H
#include "widget.h"
Widget::Widget(QWidget *parent)
: QOpenGLWidget(parent)
{
}
Widget::~Widget()
{
}
void Widget::initializeGL()
{
this->initializeOpenGLFunctions(); //为当前上下文初始化提供OpenGL函数解析
}
void Widget::resizeGL(int w, int h)
{
glViewport(0.0f,0.0f,w,h); //调整视口
}
void Widget::paintGL()
{
glClearColor(0.2f, 0.3f, 0.3f, 1.0f); //清屏
glClear(GL_COLOR_BUFFER_BIT); //清除颜色缓冲
}
到这里第一个OpenGL程序就完成了,如果屏幕上没有出现任何东西,不要怀疑是否出错,因为这个程序太过简单,连最基本的图形都不能显示出来。想要在OpenGL中显示一个最简单的三角形,需要创建VAO,VBO并绑定,渲染顶点 ,创建顶点着色器,片段着色器等一系列流程,代码的数量有两三百行。如果连最基本的OpenGL知识都不了解,推荐在LearnOpenGL CN这个网站上学习,这是目前最新最好的OpenGL教程,不过作者采用的是vs2017和glfw,glad,并不是Qt,写法和Qt上也有区别。想长期在Qt下做OpenGL的,建议在此网站上先学习OpenGL基本概念和语法,后续再转到Qt上。
入门OpenGL和计算机图形学相关非常吃力,它并不像java,c++一样几行代码就能写出Hello World,几十行代码就可以命令行输出一大堆字符。OpenGL概念太多,并且相对来说比较抽象,学习它的过程是长远并且艰巨的,做好心理准备。
1.LearnOpenGL CN : https://learnopengl-cn.github.io
2.华中科技大学万琳老师的《计算机图形学》
3.IHNF的博客 : https://blog.csdn.net/z136411501