• 现代OpenGL+Qt学习笔记 51


    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

  • 相关阅读:
    近期遇到的问题 与 总结
    最近使用的控件整理
    sass import 小记
    Visual studio 相关插件
    nodeJs中linq.js学习
    C++ Socket编程步骤
    Qt 多线程同步 与 通信
    信号槽 与事件区别
    Qt 关键宏 转自网络整理
    mongoDB windows安装
  • 原文地址:https://www.cnblogs.com/carl2380/p/15714046.html
Copyright © 2020-2023  润新知