在Qt中使用OpenGL

在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 <QOpenGLWidget>
#include <QOpenGLFunctions>

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场景

widget.h 

#ifndef WIDGET_H
#define WIDGET_H

#include <QOpenGLWidget>
#include <QOpenGLFunctions>

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

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)
{
    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概念太多,并且相对来说比较抽象,学习它的过程是长远并且艰巨的,做好心理准备。

 

推荐的OpenGL学习参考 

1.LearnOpenGL CN : https://learnopengl-cn.github.io

2.华中科技大学万琳老师的《计算机图形学》:https://www.icourse163.org/learn/HUST-1003636001?tid=1206895203#/learn/announce

3.IHNF的博客 : https://blog.csdn.net/z136411501 

  • 26
    点赞
  • 193
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值