1.2 创建窗口

一、说明

在使用VS编写OpenGL程序时需要用到第三方库GLFW和GLAD;Qt自己对OpenGL进行了封装,所以不需要使用GLFW和GLAD

1、GLFW解决操作系统层面的不同

  • 创建窗口
  • 定义上下文
  • 处理用户输入

2、GLAD使得代码可以用于不同的OpenGL驱动

  • OpenGL本身只是标准/规范
  • 各个厂家具体实现方式可以不同

二、QOpenGLWidget:代替GLFW

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

  • paintGL:渲染OpenGL场景,widget刷新时调用;
  • resizeGL:设置OpenGL视口、投影等,widget调整大小(或首次显示)时调用;
  • initializeGL:设置OpenGL资源和状态,第一次调用paintGL/resizeGL之前调用一次。

如果需要从其他位置(例如,在widget的构造函数或自己的绘制函数中)调用标准的OpenGL API函数,则必须首先调用makeCurrent(),更改上下文,然后调用doneCurrent()结束更改上下文,最后调用update(),安排更新。

三、OpenGLFunctions_X_X_Core:代替GLAD

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

  • initiazeOpenGLFunctions:初始化OpenGL函数,将Qt里的函数指针指向显卡的函数

四、QOpenGLWidget和OpenGLFunctions_X_X_Core的使用

Qt使用QOpenGLWidget和OpenGLFunctions_X_X_Core需要自定义一个类,这个类继承自QOpenGLWidget和OpenGLFunctions_X_X_Core

新建Qt Widgets Application应用,名称为Samp_1_2_1,基类选择QMainWindow;

新建一个自定义的类MyOpenGLWidget,更改myopenglwidget.h代码如下:

#ifndef MYOPENGLWIDGET_H
#define MYOPENGLWIDGET_H
#include <QOpenGLWidget>
#include <QOpenGLFunctions_3_3_Core>

class MyOpenGLWidget : public QOpenGLWidget,QOpenGLFunctions_3_3_Core
{
    Q_OBJECT
    
public:
    explicit MyOpenGLWidget(QWidget *parent = nullptr);
    
protected:
    //重新实现三个虚函数
    virtual void initializeGL();
    virtual void resizeGL(int w, int h);
    virtual void paintGL();
};

#endif // MYOPENGLWIDGET_H

myopenglwidget.cpp代码如下:

#include "myopenglwidget.h"

MyOpenGLWidget::MyOpenGLWidget(QWidget *parent) : QOpenGLWidget(parent)
{

}

void MyOpenGLWidget::initializeGL()
{
    //初始化OpenGL函数
    initializeOpenGLFunctions();
}

void MyOpenGLWidget::resizeGL(int w, int h)
{
    Q_UNUSED(w);
    Q_UNUSED(h);
}

void MyOpenGLWidget::paintGL()
{
    //设置清空屏幕所用的颜色
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f); //状态设置
    glClear(GL_COLOR_BUFFER_BIT); //状态使用
}

双击mainwindow.ui,切换到界面编辑器,往界面上拖拽一个OpenGL Widget组件

右击openGLWidget,选择“提升为”

输入自定义类名,点击“添加”,再点击“提升”

 openGLWidget组件的基类被更改

在mainwindow.cpp文件的构造函数中添加如下一行代码,设置openGLWidget组件为中心组件

this->setCentralWidget(ui->openGLWidget);

运行结果如下:

注:观看OpenGL中文官网(https://learnopengl-cn.github.io/)和阿西拜的现代OpenGL入门(https://ke.qq.com/course/3999604#term_id=104150693)学习OpenGL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值