Qt 通过OpenGL显示实时画面

本文探讨了OpenGL和Direct3D在纹理管理和回收利用上的实践,特别是在多窗口环境下避免内存泄漏的问题。通过实例展示了如何在OpenGLDrag类中创建、绑定和更新纹理,以及在不同线程间传递数据的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

“OpenGLDrag.h”头文件

#ifndef OPENGLDRAG_H
#define OPENGLDRAG_H
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QOpenGLTexture>
#include <QOpenGLShaderProgram>

class OpenGLDrag : public QOpenGLWidget,protected QOpenGLFunctions
{
        Q_OBJECT
    public:
        OpenGLDrag(QString ipAddr, QWidget *parent = 0);
        ~OpenGLDrag();
public Q_SLOTS:
        void PlayOneFrame(int width,int height,unsigned char* inBuf,int bufSize);
private Q_SLOTS:
        void initializeGL();
        void resizeGL(int width, int height);
        void paintGL();
private:
        GLuint textureUniformY; //y纹理数据位置
        GLuint textureUniformU; //u纹理数据位置
        GLuint textureUniformV; //v纹理数据位置
        GLuint id_y; //y纹理对象ID
        GLuint id_u; //u纹理对象ID
        GLuint id_v; //v纹理对象ID
        QOpenGLShaderProgram *m_pShaderProgram; //着色器程序容器
        unsigned char* m_pBufYuv420p;//实时数据
        int m_nVideoW; //视频分辨率宽
        int m_nVideoH; //视频分辨率高
};

#endif // OPENGLDRAG_H

“OpenGLDrag.cpp”文件

#include "OpenGLDrag.h"
#include "GlobalData.h"
#include <QtGlobal>

#define ATTRIB_VERTEX 3
#define ATTRIB_TEXTURE 4

// 顶点矩阵
static const GLfloat vertexVertices[] = {
    -1.0f, -1.0f,
     1.0f, -1.0f,
     -1.0f, 1.0f,
     1.0f, 1.0f,
};
//纹理矩阵
static const GLfloat textureVertices[] = {
    0.0f,  1.0f,
    1.0f,  1.0f,
    0.0f,  0.0f,
    1.0f,  0.0f,
};

OpenGLDrag::OpenGLDrag(QString ipAddr, QWidget *parent)
    :QOpenGLWidget(parent)
{
    textureUniformY = 0;
    textureUniformU = 0;
    textureUniformV = 0;
    id_y = 0;
    id_u = 0;
    id_v = 0;
    m_pShaderProgram = NULL;
    m_nVideoH = 0;
    m_nVideoW = 0;
    m_pBufYuv420p = NULL;
}

OpenGLDrag::~OpenGLDrag()
{
    makeCurrent();

    globalData::getInstance()->g_GLList.append(id_y);//回收纹理
    globalData::getInstance()->g_GLList.append(id_u);
    globalData::getInstance()->g_GLList.append(id_v);

    m_pShaderProgram->disableAttributeArray(ATTRIB_VERTEX);
    m_pShaderProgram->disableAttributeArray(ATTRIB_TEXTURE);
    m_pShaderProgram->release();
    m_pShaderProgram->removeAllShaders();
    delete m_pShaderProgram;
    m_pShaderProgram=NULL;
    delete [] m_pBufYuv420p;
    m_pBufYuv420p=NULL;

    doneCurrent();

}

void OpenGLDrag::initializeGL()
{

    //初始化OpenGL函数
    initializeOpenGLFunctions();
#ifdef USEGL
    glEnable(GL_DEPTH_TEST);
#endif
    glEnable(GL_TEXTURE_2D);
    //创建着色器程序容器
    m_pShaderProgram = new QOpenGLShaderProgram();

    //将顶点着色器源码添加到程序容器
    m_pShaderProgram->addShaderFromSourceCode(QOpenGLShader
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值