ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

现代OpenGL+Qt学习笔记 5-1

2021-12-21 10:04:59  阅读:203  来源: 互联网

标签:窗口 Qt OpenGL 部件 OpenGLWidget 笔记 添加 内容


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

标签:窗口,Qt,OpenGL,部件,OpenGLWidget,笔记,添加,内容
来源: https://www.cnblogs.com/carl2380/p/15714046.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有