Qt——使用OpenGL开发

under Qt  tag     Published on May 20th , 2020 at 11:08 pm

一、前言

想吐槽一下小破站了,年久失修,不支持LaTeX语法,文章内容也不支持CSS、Html。有空了就换掉你(不是)。
还是最近在做的Qt界面项目,目前已经实现了FFmpeg+SDL播放视频。但是有一个问题让人受不了,就是用QPainter绘制的图像有马赛克。于是准备换OpenGL试试看。

二、OpenGL介绍

OpenGL,著名的开源图形库。QT5.5以上版本已经集成了OpenGL,不过和纯OpenGL的使用有些区别,而且相关资料较少。

在Qt中使用OpenGL不需要额外引入库,只需要包含几个头文件就行。

三、OpenGL配置

1. 新建窗口类,假设命名为OpenGLWidget

新建窗口类时,注意勾选include QWidget

注意该类需要继承两个基类

公有继承 QOpenGLWidget

保护继承 QOpenGLFunctions

#ifndef OPENGLWIDGET_H
#define OPENGLWIDGET_H

#include <QWidget>
#include <QOpenGLWidget>
#include <QOpenGLFunctions>

class OpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
public:
    explicit OpenGLWidget(QWidget *parent = 0);

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

#endif // OPENGLWIDGET_H

2.重写三个虚函数

initializeGL

paintGL

resizeGL

void OpenGLWidget::initializeGL()
{
    //调用内容初始化函数
    initializeOpenGLFunctions();
}
void OpenGLWidget::resizeGL(int w, int h)
{
    //当窗口大小改变时,调整界面坐标显示高度和宽度
    glViewport(0, 0, w, h);
}
void OpenGLWidget::paintGL()
{
    //清除之前图形并将背景设置为黑色(设置为黑色纯粹个人爱好!)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
}

3.把主窗口中用于显示的Widget控件提升为OpenGLWidget

这边给出代码

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    OpenGLWidget* openGLWidget = new OpenGLWidget();
    //为了便于让OpenGLWidget自动填充父窗口,这里为父窗口设置了一个布局
    QVBoxLayout* centralLayout = new QVBoxLayout();
    centralLayout->addWidget(openGLWidget);
    this->ui->centralWidget->setLayout(centralLayout);
}

四、OpenGL渲染YUV数据

OpenGL中是不能直接渲染YUV数据的,但是我们可以用3个纹理来
分别获取Y、U和V的值,然后根据公式:

r = y + 1.403 * v;
g = y - 0.344 u - 0.714 v;
b = y + 1.770 * u;

转为rgb颜色格式显示出来。这个转换过程是在GPU中完成的,计算
效率比在CPU中计算高很多倍!


本文由simyng创作, 采用知识共享署名4.0 国际许可协议进行许可,转载前请务必署名
  文章最后更新时间为:May 20th , 2020 at 12:26 am