errorman

不积跬步,无以至千里

导航

Qt+OpengGL使用教程(1)

Posted on 2023-03-20 09:50  Clemens  阅读(248)  评论(0编辑  收藏  举报

首先,建议阅读和Qt OpenGL相关的类。本人对其中的一些类,做了一些翻译,例如:QOpenGLWidget。

环境:Ubuntu16.04, Qt 5.14.2

首先,新建立一个工程qtopengltest,使用ui designer,拖动一个widget到界面上,命名为glwidget。

根据文档,我们要建立一个继承自QOpenGLWidget和QOpenGLFunctions的子类GLWidget,并重新实现paintGL(), resizeGL(), initializeGL()这三个虚函数。

目前的代码如下:

// main.cpp
#include "mainwindow.h"
#include <QSurfaceFormat>
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QSurfaceFormat format;
    format.setDepthBufferSize(24);
    format.setStencilBufferSize(8);
    format.setVersion(3, 2);
    format.setProfile(QSurfaceFormat::CoreProfile);
    QSurfaceFormat::setDefaultFormat(format);

    MainWindow w;
    w.show();
    return a.exec();
}


//glwidget.h
#ifndef GLWIDGET_H
#define GLWIDGET_H

#include <QOpenGLWidget>
#include <QOpenGLExtraFunctions>

class GLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
public:
    explicit GLWidget(QWidget *parent = nullptr);
    ~GLWidget();
protected:
    void resizeGL(int w, int h) override;
    void initializeGL() override;
    void paintGL() override;
};

#endif // GLWIDGET_H

//glwidget.cpp
#include "glwidget.h"

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

}

GLWidget::~GLWidget()
{

}

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

}

void GLWidget::initializeGL()
{

}


void GLWidget::paintGL()
{

}

 我们将界面上的glwidget控件提升为GLWidget.

此时我们运行程序,便会得到一个黑色背景的QOpenglWidget.

initializeGL()中首先需要调用initializeOpenGLFunctions();来为当前上下文初始化OpenGL函数,即将opengl函数的上下文对象设置为当前上下文。然后将清屏颜色设置为我们想要的颜色,启用深度测试和颜色缓冲区。

paintGL()函数中,我们通过glClear函数清空颜色缓冲区和深度缓冲区,然后再进行图形的绘制。

此时,代码如下:

void GLWidget::initializeGL()
{
    initializeOpenGLFunctions();
    // 设置清屏颜色为黑色
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

    // 启用深度测试
    glEnable(GL_DEPTH_TEST);

    // 启用颜色缓冲区
    glEnable(GL_COLOR_BUFFER_BIT);

}

void GLWidget::paintGL()
{
    // 清空颜色缓冲区和深度缓冲区
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // 绘制图形
    // ...
    
    //交换front和back缓冲区
    auto *context = QOpenGLContext::currentContext();
    context->swapBuffers(context->surface());
    context->makeCurrent(context->surface());
}

 

接下来,绘制一个2D三角形。