Qt实现OpenGL的经典教程①——创建窗口

本帖将参考LearnOpenGL这一经典教程,使用Qt的原生环境完成教程中所提的所有流程,并尽量和原教程保持一致,如有错误,欢迎评论!

为了方便大家参考,我将项目分享至了gitee,并实时进行更行:Qt实现OpenGL的经典教程: (gitee.com)

教程中文网站:LearnOpenGLCN 

教程原网站:LearnOpenGL

Qt版本:6.7

操作系统:Windows10

Qt如何创建OpenGL渲染窗口

类比GLFW库,Qt也提供了供OpenGL渲染的窗口,参考Qt原文档,可找到以下内容:

  • 子类QOpenGLWidget以如下方式渲染纯3D内容:

  • 重新实现initializeGL()和resizeGL()函数来设置OpenGL状态并提供透视图转换。

  • 重新实现paintGL()来绘制3D场景,只调用OpenGL函数。

  • 还可以使用QPainter将2D图形绘制到QOpenGLWidget子类上。在paintGL()中,不是发出OpenGL命令,而是构建一个用于部件的QPainter对象。

综合一下,就是说重写子类QOpenGLWidget的initializeGL、resizeGL和paintGL三个函数,可以实现渲染的全部功能,并且可以结合QPainter将2D图像渲染到OpenGL窗口上(注意QPainter没调用OpenGL渲染)

如何实现OpenGL函数绑定

上一节我们找到了创建窗口的方法,实现了类似GLFW库的功能,那么如何使用GLAD库的函数绑定功能呢?Qt也提供了途径,再次参考帮助文档,可以找到如下内容:

  • 在调用OpenGL函数时,强烈建议避免直接调用函数。相反,更喜欢使用QOpenGLFunctions(当制作可移植的应用程序时)或版本化的变体(例如,QOpenGLFunctions_3_2_Core或类似的,当目标是现代的、只针对桌面的OpenGL时)。这样,应用程序将在所有Qt构建配置中正确工作,包括那些执行动态OpenGL实现加载的应用程序,这意味着应用程序没有直接链接到GL实现,因此直接函数调用是不可行。

  • 在paintGL()中,通过调用QOpenGLContext::currentContext()始终可以访问当前上下文。在这个上下文中,通过调用QOpenGLContext::functions()可以取得一个已经初始化的、随时可用的QOpenGLFunctions实例。除了给每个GL调用都加上前缀之外,还有一种方法是继承QOpenGLFunctions,然后在initializeGL()中调用QOpenGLFunctions::initializeOpenGLFunctions()。

  • 至于OpenGL头文件,请注意,在大多数情况下,不需要直接包含任何像GL.h这样的头文件。与opengl相关的Qt头文件将包括qopengl.h,而qopengl.h又将包括一个适合系统的头文件。这可能是OpenGL ES 3。X或2.0头文件(可用的最高版本),或者系统提供的gl.h。此外,对于OpenGL和OpenGL ES, Qt都提供了扩展头的副本(在某些系统上称为glext.h)。这些将在可行的平台上自动包含。这意味着来自ARB、EXT、OES扩展的常量和函数指针typedefs是自动可用的

总结一下就是,Qt提供了绑定OpenGL函数指针的方法,不需要包含GLAD库中类似gl.h这样的头文件,不建议直接调用OpenGL函数,需要通过QOpenGLFunctions这一实例来进行函数调用,那么这种调用方法主要有以下俩种:

 1、直接从OpenGLContext::functions()中获取

 QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
 f->glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

2、继承QOpenGLFunctions

 class MyGLWidget : public QOpenGLWidget, protected QOpenGLFunctions
 {
     ...
     void initializeGL() override
     {
         initializeOpenGLFunctions();
         glClearColor(...);
         ...
     }
     ...
 };

显然第二种更加方便,我们将使用第二种方法实现。

开始实现

创建子类MyOpenGLWidget.h

#ifndef MYOPENGLWIDGET_H
#define MYOPENGLWIDGET_H

#include <QtOpenGLWidgets/QtOpenGLWidgets>


class MyOpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
public:
    MyOpenGLWidget();
protected:
    void initializeGL() override;
    void resizeGL(int w, int h) override;
    void paintGL() override;
};

#endif // MYOPENGLWIDGET_H

创建子类MyOpenGLWidget.cpp

#include "myopenglwidget.h"

MyOpenGLWidget::MyOpenGLWidget() {
    //设置上下文属性
    QSurfaceFormat format;
    format.setDepthBufferSize(24);
    format.setStencilBufferSize(8);
    format.setVersion(3, 3); //OpenGL 版本号3.3
    format.setProfile(QSurfaceFormat::CoreProfile);// 核心模式
    this->setFormat(format);
}

void MyOpenGLWidget::initializeGL(){
    //绑定OpenGL函数指针?类似GLAD库的作用?
    initializeOpenGLFunctions();
}

void MyOpenGLWidget::paintGL(){
    //由于继承了QOpenGLFunctions,可以直接使用OpenGL中的函数
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);
}

void MyOpenGLWidget::resizeGL(int w, int h){

}

其中每次窗口刷新都会调用我们重写的paintGL()函数,那么我们调用glClearColor()为其设置一个颜色,并清除掉颜色缓冲,接着我们在MainWindow.cpp中创建我们的窗口

#include "mainwindow.h"


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    _myOpenGLWidget = new MyOpenGLWidget;
    this->setCentralWidget(_myOpenGLWidget);
    //设置窗口大小
    this->setGeometry(0,0,800,600);
}

MainWindow::~MainWindow() {
    if(_myOpenGLWidget)delete _myOpenGLWidget;
}

设置完窗口大小后,那么我们运行就能看到以下一个窗口:

下图是原教程的运行结果:

  • 57
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Qt4.8是一个基于C++的开发框架,它提供了一种简化和加速应用程序开发的方式。OpenGL是一种跨平台的图形渲染API,它可以用于创建高性能的3D图形应用程序。Qt4.8中集成了OpenGL模块,使得开发者可以使用Qt的API来创建基于OpenGL的应用程序。 关于Qt4.8的OpenGL教程,可以从以下几个方面进行介绍。 首先,Qt4.8提供了一些类和函数来简化OpenGL的使用。比如,可以使用QGLWidget类来创建一个OpenGL窗口,可以使用QGLFunctions类来访问OpenGL的函数。 其次,Qt4.8提供了一些示例程序和文档来帮助开发者学习和理解OpenGL的使用。在Qt的安装目录下,可以找到一些示例程序,其中包括了一些使用OpenGL的示例。此外,Qt的官方文档中也提供了关于OpenGL的详细介绍和使用方法。 此外,还有一些第三方的教程和示例程序可以帮助开发者学习Qt4.8中的OpenGL模块。例如,可以在网络上搜索一些Qt4.8的OpenGL教程,或者在一些开源项目中找到使用了Qt4.8和OpenGL的示例程序。 总的来说,学习Qt4.8中的OpenGL模块需要掌握基本的Qt编程知识和OpenGL的基础知识。通过阅读文档、学习示例程序和参考第三方教程,开发者可以更好地理解和应用Qt4.8中的OpenGL模块,从而创建出高性能的图形应用程序。 ### 回答2: QT 4.8是一种流行的跨平台应用程序开发框架,而OpenGL是一种强大的图形渲染API。由于QT 4.8具有强大的界面设计和事件处理功能,结合OpenGL可以实现各种复杂的图形和动画效果。 QT 4.8中的OpenGL教程可以帮助开发人员了解如何使用OpenGLQT程序中创建2D和3D图形教程通常从基础开始,介绍OpenGL的基本概念和原理,如顶点缓冲对象、着色器、纹理等等。然后,教程会演示如何在QT程序中集成OpenGL,包括创建一个OpenGL窗口并进行初始化设置。 教程还会介绍如何在QT中使用OpenGL进行各种图形渲染,如绘制基本形状、绘制立方体和球体、应用光照和阴影效果等等。此外,教程还会展示如何处理用户输入和事件,以及如何使图形交互起来,例如通过鼠标或键盘进行旋转、缩放和平移等操作。 值得一提的是,由于QT 4.8使用了信号和槽机制,开发人员可以很方便地与OpenGL渲染循环进行交互,并实时更新图形显示。此外,QT还提供了一些方便的辅助工具和类,例如QGLWidget和QOpenGLFunctions等,可以简化开发过程。 总之,QT 4.8的OpenGL教程可以帮助开发人员快速入门并掌握在QT应用程序中使用OpenGL进行图形渲染的技巧和方法。通过学习这些教程,开发人员可以创建出更具吸引力和互动性的应用程序,从而丰富用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值