Qt——使用OpenGL开发
字数统计:383 阅读时长 ≈ 1分钟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