Learn OpenGL with Qt 1 ——创建窗口

https://blog.csdn.net/qq_40946921/article/details/105900252?spm=1001.2014.3001.5501

创建窗口

QOpenGLWidget

Qt5.4之前,Qt可以通过一个QGLWidget类来创建opengl窗口,但由于opengl的发展,在5.4版本的时候,Qt提供了一个QGLWidget的现代替代品——QOpenGLWidget。因此,这个教程使用的是QOpenGLWidget来创建和管理窗口。

创建opengl窗口只需新建类继承于QOpenGLWidegt,再实现QOpenGL提供的三个虚函数,就可以完成opengl窗口的创建。

initializeGL()—建立OpenGL的资源和状态。在第一次调用resizeGL()或paintGL()之前调用一次
resizeGL()—设置OpenGL视口,投影等。每当调整Widget的大小时(第一次显示窗口Widget时会调用它,因为所有新创建Widget都会自动获得调整大小的事件)。
paintGL()—渲染OpenGL场景,需要更新Widget时就会调用。

QOpenGLExtraFunctions

QOpenGLExtraFunctions类继承于QOpenGLFunctions,相较于QOpenGLFunctions,额外提供了对OpenGL ES 3.0、3.1和3.2 API的跨平台访问,如果我们需要在类中使用opengl函数,只需要使类继承于QOpenGLExtraFunctions。

代码

如果你的Qt版本比较低,可能需要在pro文件中添加Qt += opengl

在widget.h中包含头文件 <QOpenGLWidget> 、<QOpenGLExtraFunctions>

修改Widget公有继承自这两个类

重写 initializeGL()、resizeGL(int w,int h)、paintGL(),一般使用protected修饰

完成后你的Widget.h应该是如下的样子:

#ifndef WIDGET_H
#define WIDGET_H

#include <QOpenGLWidget>
#include <QOpenGLExtraFunctions>
class Widget : public QOpenGLWidget,public QOpenGLExtraFunctions
{
Q_OBJECT

public:
  Widget(QWidget *parent = 0);
  ~Widget();
protected:
  virtual void initializeGL() override;
  virtual void resizeGL(int w,int h) override;
  virtual void paintGL() override;
};

#endif // WIDGET_H
再对函数进行实现,你的Widget.cpp应该是如下的样子

(为了便于说明opengl函数来源于QOpenGLFunctions类,函数前我加了this指针,读者在写的时候可以省略)

#include "widget.h"

Widget::Widget(QWidget *parent)
: QOpenGLWidget(parent)
{}

Widget::~Widget()
{}

void Widget::initializeGL()
{
  this->initializeOpenGLFunctions(); //初始化opengl函数
}

void Widget::resizeGL(int w, int h)
{
  this->glViewport(0,0,w,h); //定义视口区域
}

void Widget::paintGL()
{
  this->glClearColor(0.1f,0.5f,0.7f,1.0f); //设置清屏颜色
  this->glClear(GL_COLOR_BUFFER_BIT); //清除颜色缓存
}

QSurfaceFormat——关于opengl窗口的一些配置

格式包括颜色缓冲区的大小(红色,绿色和蓝色)。alpha缓冲区的大小;深度和模板缓冲区的大小;以及用于多采样的每个像素的采样数。此外,该格式包含表面配置参数,例如OpenGL配置文件和用于渲染的版本,是否启用立体声缓冲区以及交换行为。

注意:对上下文或窗口格式问题进行故障排除时,启用日志记录类别可能会有所帮助qt.qpa.gl。根据平台的不同,当涉及到OpenGL初始化以及QSurfaceFormat映射到的本机视觉或帧缓冲区配置时,这可能会打印有用的调试信息。

实例,在构造函数中修改format

Widget::Widget(QWidget *parent)
: QOpenGLWidget(parent)
{
  QSurfaceFormat format;
  format.setAlphaBufferSize(24); //设置alpha缓冲大小
  format.setVersion(3,3); //设置版本号
  format.setSamples(10); //设置重采样次数,用于反走样
  //...
  this->setFormat(format);
}

 

posted on 2021-07-08 09:15  斗战胜佛美猴王  阅读(229)  评论(0编辑  收藏  举报