现代OpenGL+Qt学习笔记之二:程序框架

现代OpenGL+Qt学习笔记之二:程序框架

主要内容

  本文的主要内容是新建一个qt工程,用于现代OpenGL内容的学习。主要演示一下怎样在qt框架下实现一个继承自QOpenGLFunctions和QOpenGLWidget类的自定部件类。需要重新实现几个基本函数initializeGL()、resizeGL()和paintGL(),最后介绍怎样清除窗口。

新建一个qt工程

  打开Qt Creator,新建一个Qt Widgets Application;
新建Qt Widgets Application
项目名称QtGLSL,选择项目创建目录;
更改项目名称和路径
基类选择QWidget,类名改为GLSLWidget其它内容默认即可。
基类选择QWidget
  至此,项目创建完成,可以编译运行一下,看你的qt有没有安装好。

新建OpenGL部件类

  接下来新建一个OpenGL部件类,用来显示OpenGL内容,并将该部件添加到现有的这个主窗口部件中。
  首先打开main.cpp,在

    GLSLWidget w;
    w.show();

中间加入一行,

    w.resize(800, 600);

这样做是为了让初始显示的窗口能更大一些。
  接下来才是正题。在QtGLSL项目上右键,选择“添加新文件”,在弹出的对话框中选择C++ class;
新建C++类
点击“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

相应的源文件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);
}

  重写的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 );

  这段代码的作用就是执行清除颜色缓冲区和深度缓冲区的任务,在每一次调用绘制函数时都需要清除各个缓冲区,因此基本都会放在paintGL()的第一行,在所有绘制代码开始前调用。
  这就是一个基本的OpenGL部件类了,没有绘制任何内容。绘制OpenGL内容还需要添加不少的代码,涉及的知识点也很多,因此放在下面的笔记中慢慢介绍。

将OpenGL部件添加到主窗口部件中

  至此,也只是创建了一个OpenGL部件类,而没有将部件添加到主窗口部件中进行显示。接下来介绍在主窗口部件中添加OpenGL部件的方法。
  打开glslwidget.h文件,在

    #include <QWidget>

后添加OpenGLWidget类的前置声明:

    class OpenGLWidget;

再向GLSLWidget类中添加一个私有变量

    OpenGLWidget *glWidget;

  接下来打开glslwidget.cpp文件,添加两个头文件

    #include <QGridLayout>
    #include "openglwidget.h"

再修改其构造函数内容如下:

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);
}

  这里用到了Qt中的布局管理器,目的是让OpenGL部件填满整个主窗口部件的可绘制区域,而且可以再主窗口部件的大小改变时,自动调整OpenGL部件的大小以适应窗口。
  保存,编译,运行程序,如果过程没有出错,应该能看到下面的运行结果。
程序运行结果

小结

  这篇笔记就到这里,内容不多,主要实现的是清除窗口,要绘制内容,就要添加很多东西,而且涉及很多知识点,留在日后再写。需要代码的可以留下邮箱,我也会尽快将代码上传到网盘或者什么地方,晚点再贴上来。

源码地址:http://download.csdn.net/download/chaojiwudixiaofeixia/9972707(没办法,所需积分最少也得是1,不能是0,不知道为什么,如果没积分可以留下邮箱!)

发布了27 篇原创文章 · 获赞 70 · 访问量 20万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览