Qt5.12+OpenGL可编程管线之创建OpenGL窗口

2020-01-02 17:24:10 浏览数 (1)

今天正式进入Qt5.12 OpenGL 3.x以上可编程管线的代码部分。

程序主要是参考learnopengl,更多关于OpenGL的说明也可参考他们的文章。

https://learnopengl-cn.github.io/01 Getting started/03 Hello Window/

由于顶点着色器与片段着色器程序需要我们自己去实现,反而创建窗体的程序就比较少了。

.h部分:

代码语言:javascript复制
#include <QOpenGLWidget>
#include <QOpenGLExtraFunctions>

class MyGLWidget : public QOpenGLWidget, protected QOpenGLExtraFunctions
{
    Q_OBJECT

public:
    MyGLWidget(QWidget *parent = nullptr);

    ~MyGLWidget();

protected:
    virtual void initializeGL();
    virtual void resizeGL(int w, int h);
    virtual void paintGL();

    void keyPressEvent( QKeyEvent *e );
};

.cpp部分:

代码语言:javascript复制
#include <QKeyEvent>

MyGLWidget::MyGLWidget(QWidget *parent)
    : QOpenGLWidget(parent)
{
//    setGeometry( 0, 0, 800, 600 );
    resize(800, 600);
    setWindowTitle( "A goose's OpenGL Framework" );
}

MyGLWidget::~MyGLWidget()
{

}

void MyGLWidget::initializeGL()
{
    //要在调用任何gl函数前调用该函数!!
    this->initializeOpenGLFunctions();
}

//改变窗口大小时调用
void MyGLWidget::resizeGL(int w, int h)
{
    //开始渲染前,必须告诉OpenGL渲染窗口的尺寸大小,即视口(Viewport),
    //这样OpenGL才只能知道怎样根据窗口大小显示数据和坐标
    glViewport(0, 0, w, h);
    qDebug() << "w h" << w << h;
}


//每一帧绘制的函数
void MyGLWidget::paintGL()
{
glClearColor(0.2f, 0.3f, 0.3f, 1.0f); //清空屏幕所用的颜色,参数分别为红、绿、蓝以及透明度
                                     //使用三种颜色的分量可配置出超过1600万种不同的颜色
    glClear(GL_COLOR_BUFFER_BIT);        //清空屏幕的颜色缓冲
}

void MyGLWidget::keyPressEvent(QKeyEvent *e)
{
    //ESC 按下后,关闭窗体
    switch ( e->key() )
    {
    case Qt::Key_Escape:
      close();
        break;
    }
}

程序效果:

小结:涉及到图形学编程,尤其是之前从未接触过的,入门还是有一定难度。我也是从0开始学习的,大家可以一起交流!

对于程序中 文字解释的排版欢迎大家多提出宝贵的意见,感谢!

0 人点赞