Qt OpenGL(二十)——Qt OpenGL 核心模式版本

news/2024/12/2 21:16:57/

Qt OpenGL(二十)——Qt OpenGL 核心模式版本

一、写在前面

在之前的OpenGL教程(1~19)中,采用的方式都是固定渲染管线,也就是OpenGL3.2版本之前的写法,但是OpenGL从3.2版本开始,就鼓励使用核心模式进行开发了,其目的就是为了提高效率,增加编程的灵活性。

从本篇开始,我把核心模式方法的写法分享给大家,主要还是借助以Qt开发。

二、Qt推荐的例程

打开Qt Creator,在Example界面可以搜索到OpenGL相关的例程。

打开Qt creator,可以看到我的Qt版本5.8.0, MinGW的。

 搜索OpenGL

 如上所示,我们可以看到其中给到的几个例子。

编译运行OpenGL Window Example,可以看到效果:

三、源码

源码部分,主要包含openglwindow.h和openglwindow.cpp文件

#include <QtGui/QWindow>
#include <QtGui/QOpenGLFunctions>QT_BEGIN_NAMESPACE
class QPainter;
class QOpenGLContext;
class QOpenGLPaintDevice;
QT_END_NAMESPACE//! [1]
class OpenGLWindow : public QWindow, protected QOpenGLFunctions
{Q_OBJECT
public:explicit OpenGLWindow(QWindow *parent = 0);~OpenGLWindow();virtual void render(QPainter *painter);virtual void render();virtual void initialize();void setAnimating(bool animating);public slots:void renderLater();void renderNow();protected:bool event(QEvent *event) override;void exposeEvent(QExposeEvent *event) override;private:bool m_animating;QOpenGLContext *m_context;QOpenGLPaintDevice *m_device;
};
//! [1]

openglwindow.cpp文件内容:

#include "openglwindow.h"#include <QtCore/QCoreApplication>#include <QtGui/QOpenGLContext>
#include <QtGui/QOpenGLPaintDevice>
#include <QtGui/QPainter>//! [1]
OpenGLWindow::OpenGLWindow(QWindow *parent): QWindow(parent), m_animating(false), m_context(0), m_device(0)
{setSurfaceType(QWindow::OpenGLSurface);
}
//! [1]OpenGLWindow::~OpenGLWindow()
{delete m_device;
}
//! [2]
void OpenGLWindow::render(QPainter *painter)
{Q_UNUSED(painter);
}void OpenGLWindow::initialize()
{
}void OpenGLWindow::render()
{if (!m_device)m_device = new QOpenGLPaintDevice;glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);m_device->setSize(size());QPainter painter(m_device);render(&painter);
}
//! [2]//! [3]
void OpenGLWindow::renderLater()
{requestUpdate();
}bool OpenGLWindow::event(QEvent *event)
{switch (event->type()) {case QEvent::UpdateRequest:renderNow();return true;default:return QWindow::event(event);}
}void OpenGLWindow::exposeEvent(QExposeEvent *event)
{Q_UNUSED(event);if (isExposed())renderNow();
}
//! [3]//! [4]
void OpenGLWindow::renderNow()
{if (!isExposed())return;bool needsInitialize = false;if (!m_context) {m_context = new QOpenGLContext(this);m_context->setFormat(requestedFormat());m_context->create();needsInitialize = true;}m_context->makeCurrent(this);if (needsInitialize) {initializeOpenGLFunctions();initialize();}render();m_context->swapBuffers(this);if (m_animating)renderLater();
}
//! [4]//! [5]
void OpenGLWindow::setAnimating(bool animating)
{m_animating = animating;if (animating)renderLater();
}
//! [5]

四、核心模式

class OpenGLWindow : public QWindow, protected QOpenGLFunctions

通过上面的代码我们可以看到,这个类继承的父类,其中有:QOpenGLFunctions。

这个类Qt封装了对应的OpenGL的核心模式的函数,版本化的函数包装器针对给定的 OpenGL 版本和配置文件,比如 QOpenGLFunctions_3_2_Core。

QOpenGLFunctions_X_X_Core提供OpenGL X.X版本核心模式的所有功能,是对OpenGL函数的封装。

其中的initializeOpenGLFunctions用于初始化OpenGL函数,将Qt里的函数指针指向显卡的函数,之后调用的OpenGL函数才是可用的。

五、QWindow和QOpenGLWidget

Qt这个例子中,窗口类继承了QWindow,在日常的实际项目中,我们使用更多的是继承QOpenGLWidget类。

QWindow类是Qt5.0之后引入的,QWindow的重绘与QWidget重绘有点不一样,QWindow的没有提供PaintEvent相关的函数。得实现event虚函数,才能实现重绘。

QOpenGLWidget 提供了显示集成到 Qt 应用程序中的 OpenGL 图形的功能。它使用起来非常简单:自定义类继承它并像其他 QWidget 子类一样使用,还可以选择使用 QPainter 和标准 OpenGL 渲染命令。

QOpenGLWidget类提供了三个便捷的虚函数,可以重载,用来重新实现典型的OpenGL任务:

1)paintGL () :渲染OpenGL窗口,当窗口widget需要更新时调用;

2)resize () :设置OpenGL视口、投影等,当widget调整大小(或首次显示)时调用;

3)initializeGL () : 设置OpenGL资源和状态,最先调用且调用一次。

和之前的文章中继承自QGLWidget一样,这三个函数功能也一样。

上一篇:OpenGL(十九)——Qt OpenGL波动纹理(旗子的飘动效果)

下一篇:

本文原创作者:冯一川(ifeng12358@163.com),未经作者授权同意,请勿转载。


http://www.ppmy.cn/news/521567.html

相关文章

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(6月 22 日论文合集)

文章目录 一、检测相关(9篇)1.1 Wildfire Detection Via Transfer Learning: A Survey1.2 Polygon Detection for Room Layout Estimation using Heterogeneous Graphs and Wireframes1.3 Exploiting Multimodal Synthetic Data for Egocentric Human-Object Interaction Detec…

opencore 0.8.6开发版

更新说明 概述 OpenCore 是非常优秀的开源软件&#xff0c;旨在通过提供更加通用和模块化的系统来解决 Clover 带来的限制和问题&#xff0c;拦截内核加载以插入高级的 rootkit&#xff0c;而该 rootkit 旨在替代 Clover。OpenCore 最初诞生于 HermitCrabs 实验室&#xff0c;现…

CorelDRAW2022增强版CDR2022新版功能

图形设计软件CorelDRAW Graphics Suite2022年3月版发布&#xff01;CorelDRAW2022主要增强了图像编辑和导出功能&#xff0c;新功能加快了图片编辑速度&#xff0c;带来新工具、快捷方式和命令菜单&#xff0c;优化了学习工具。 凭借22多年的创新传统&#xff0c;我们了解您的发…

OpenGL学习笔记 ---Create a Window

OpenGL是使用双缓冲的&#xff08;front buffer&#xff0c; back buffer&#xff09;&#xff0c;front buffer用于展示&#xff0c;back buffer用于绘制&#xff0c;结束后将front buffer 与 back buffer的位置对调&#xff0c;此时的front buffer变成了back buffer&#xff…

CorelDRAW2021版本下载 百度网盘

CorelDRAW2021中是一款功能超级强大的矢量图形设计软件&#xff0c;该软件是目前的最新版本&#xff1b;为广大用户提供了非常专业的平面图形设计功能有了它&#xff0c;我们就可以更加得心应手的进行各种创作&#xff0c;轻松地进行矢量插图、页面布局、图片编辑和设计等图像处…

CorelDRAW Graphics Suite 2022零售版

图形设计软件CorelDRAW Graphics Suite 2022零售版2022年3月版发布&#xff01;CorelDRAW2022主要增强了图像编辑和导出功能&#xff0c;新功能加快了图片编辑速度&#xff0c;带来新工具、快捷方式和命令菜单&#xff0c;优化了学习工具。 CorelDRAW&#xff08;简称CDR&…

CorelDRAW2022(CDR2022-64位),Win7 、Win10通用\免激活注册中文版安装图文教程

干货来了&#xff0c;还在为打不开高版本的CDR文件而烦恼吗&#xff0c;下面我给大家分享CDR2022安装程序。 1、打开解压好的CDR2019文件夹&#xff0c;里面有3个程序&#xff0c;先装IE11和ndp48-web这2个程序&#xff0c;如果电脑提示已安装IE11&#xff0c;就可以不用装IE1…

cdr CorelDRAW Graphics Suite 2021 (v23.1.0)

图形设计软件CorelDRAW Graphics Suite 2021 版本于2021年3月推出&#xff0c;CorelDRAW 2021版本支持为所有类型输出文件增加丰富的插图&#xff0c;标牌&#xff0c;徽标&#xff0c;字体等素材&#xff1b;全新的排版功能可以实现精美排版字体&#xff0c;通过可变字体支持微…