“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