现代OpenGL+Qt学习笔记 5-1
https://blog.csdn.net/chaojiwudixiaofeixia/article/details/77917697
现代OpenGL+Qt学习笔记之二:程序框架
主要内容
本文的主要内容是新建一个qt工程,用于现代OpenGL内容的学习。主要演示一下怎样在qt框架下实现一个继承自QOpenGLFunctions和QOpenGLWidget类的自定部件类。需要重新实现几个基本函数initializeGL()、resizeGL()和paintGL(),最后介绍怎样清除窗口。
新建一个qt工程
打开Qt Creator,新建一个Qt Widgets Application;
项目名称QtGLSL,选择项目创建目录;
基类选择QWidget,类名改为GLSLWidget其它内容默认即可。
至此,项目创建完成,可以编译运行一下,看你的qt有没有安装好。
新建OpenGL部件类
接下来新建一个OpenGL部件类,用来显示OpenGL内容,并将该部件添加到现有的这个主窗口部件中。
首先打开main.cpp,在
GLSLWidget w;
w.show();
1
2
中间加入一行,
w.resize(800, 600);
1
这样做是为了让初始显示的窗口能更大一些。
接下来才是正题。在QtGLSL项目上右键,选择“添加新文件”,在弹出的对话框中选择C++ class;
点击“Chooze…”按钮,在弹出的Define class对话框中,填写类名称为OpenGLWidget,基类为空,其它内容保持默认即可,点击“下一步”,然后“完成”即可。
新类创建完成后,打开头文件openglwidget.h,修改其内容如下:
#ifndef OPENGLWIDGET_H
#define OPENGLWIDGET_H
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
class OpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
Q_OBJECT
public:
OpenGLWidget(QWidget *parent = 0);
protected:
void initializeGL();
void resizeGL(int w, int h);
void paintGL();
};
#endif // OPENGLWIDGET_H
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
相应的源文件openglwidget.cpp的内容修改如下:
#include "openglwidget.h"
OpenGLWidget::OpenGLWidget(QWidget *parent)
:QOpenGLWidget(parent)
{
}
void OpenGLWidget::initializeGL()
{
initializeOpenGLFunctions();
glClearColor(0.5f, 0.0f, 1.0f, 1.0f);
glEnable(GL_DEPTH_TEST);
}
void OpenGLWidget::resizeGL(int w, int h)
{
}
void OpenGLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
重写的3个函数initializeGL()、resizeGL()和paintGL()的简单介绍,可以阅读前一篇博客现代OpenGL+Qt学习笔记之一:概述。这里介绍一下initializeOpenGLFunctions()函数的作用。initializeOpenGLFunctions()是QOpenGLFunctions中的函数,在使用OpenGL API之前,必须先调用一次initializeOpenGLFunctions()函数,和使用glew访问现代OpenGL API一样,必须要先对glew库进行初始化。这里要把initializeOpenGLFunctions()放在initializeGL()中的最后一行,都是不行的。
接下来是glClearColor使用来设置清理颜色缓冲区的颜色,可以理解为设置背景。这里设置为一种淡紫色,等下运行程序就能看到效果。
glEnable()函数,可以打开OpenGL的一些功能,这里开启深度测试,因此传入的参数是GL_DEPTH_TEST,有关更多OpenGL功能,日后遇到了再慢慢介绍。至于开启深度测试的效果就是要考虑显示内容的深度信息,一种普遍的认识就是,离观察者近的物体,肯定会遮挡离观察者远的物体(在不开启透明或者混合效果下),如果不开启深度测试,那么遮挡就不是考虑深度了,而是考虑绘制的先后顺序,反正视觉效果会很差、很奇怪。
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
1
这段代码的作用就是执行清除颜色缓冲区和深度缓冲区的任务,在每一次调用绘制函数时都需要清除各个缓冲区,因此基本都会放在paintGL()的第一行,在所有绘制代码开始前调用。
这就是一个基本的OpenGL部件类了,没有绘制任何内容。绘制OpenGL内容还需要添加不少的代码,涉及的知识点也很多,因此放在下面的笔记中慢慢介绍。
将OpenGL部件添加到主窗口部件中
至此,也只是创建了一个OpenGL部件类,而没有将部件添加到主窗口部件中进行显示。接下来介绍在主窗口部件中添加OpenGL部件的方法。
打开glslwidget.h文件,在
#include <QWidget>
1
后添加OpenGLWidget类的前置声明:
class OpenGLWidget;
1
再向GLSLWidget类中添加一个私有变量
OpenGLWidget *glWidget;
1
接下来打开glslwidget.cpp文件,添加两个头文件
#include <QGridLayout>
#include "openglwidget.h"
1
2
再修改其构造函数内容如下:
GLSLWidget::GLSLWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::GLSLWidget)
{
ui->setupUi(this);
QGridLayout *layout = new QGridLayout();
glWidget = new OpenGLWidget();
layout->addWidget(glWidget);
setLayout(layout);
}
1
2
3
4
5
6
7
8
9
10
11
这里用到了Qt中的布局管理器,目的是让OpenGL部件填满整个主窗口部件的可绘制区域,而且可以再主窗口部件的大小改变时,自动调整OpenGL部件的大小以适应窗口。
保存,编译,运行程序,如果过程没有出错,应该能看到下面的运行结果。
小结
这篇笔记就到这里,内容不多,主要实现的是清除窗口,要绘制内容,就要添加很多东西,而且涉及很多知识点,留在日后再写。需要代码的可以留下邮箱,我也会尽快将代码上传到网盘或者什么地方,晚点再贴上来。
源码地址:http://download.csdn.net/download/chaojiwudixiaofeixia/9972707(没办法,所需积分最少也得是1,不能是0,不知道为什么,如果没积分可以留下邮箱!)
————————————————
版权声明:本文为CSDN博主「懂deeee珍惜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chaojiwudixiaofeixia/article/details/77917697