代码如下
1YUV420P_Render.h 2 3#ifndef YUV420P_RENDER_H 4#define YUV420P_RENDER_H 5 6#include <QObject> 7#include <QOpenGLWidget> 8#include <QOpenGLFunctions> 9#include <QOpenGLShaderProgram> 10class YUV420P_Render: protected QOpenGLFunctions 11{ 12 13public: 14 YUV420P_Render(); 15 ~YUV420P_Render(); 16 17 //初始化gl 18 void initialize(); 19 //刷新显示 20 void render(uchar* py,uchar* pu,uchar* pv,int width,int height,int type); 21 void render(uchar* ptr,int width,int height,int type); 22 23private: 24 //shader程序 25 QOpenGLShaderProgram m_program; 26 //shader中yuv变量地址 27 GLuint m_textureUniformY, m_textureUniformU , m_textureUniformV; 28 //创建纹理 29 GLuint m_idy , m_idu , m_idv; 30 31}; 32 33#endif // YUV420P_RENDER_H 34 35YUV420P_Render.cpp 36 37#include "YUV420P_Render.h" 38#include <QDebug> 39#include <QTimer> 40 41#define ATTRIB_VERTEX 0 42#define ATTRIB_TEXTURE 1 43 44YUV420P_Render::YUV420P_Render() 45{ 46} 47 48YUV420P_Render::~YUV420P_Render() 49{ 50} 51 52 //初始化gl 53void YUV420P_Render::initialize() 54{ 55 qDebug() << "initializeGL"; 56 57 //初始化opengl (QOpenGLFunctions继承)函数 58 initializeOpenGLFunctions(); 59 60 //顶点shader 61 const char *vString = 62 "attribute vec4 vertexPosition;\ 63 attribute vec2 textureCoordinate;\ 64 varying vec2 texture_Out;\ 65 void main(void)\ 66 {\ 67 gl_Position = vertexPosition;\ 68 texture_Out = textureCoordinate;\ 69 }"; 70 //片元shader 71 const char *tString = 72 "varying vec2 texture_Out;\ 73 uniform sampler2D tex_y;\ 74 uniform sampler2D tex_u;\ 75 uniform sampler2D tex_v;\ 76 void main(void)\ 77 {\ 78 vec3 YUV;\ 79 vec3 RGB;\ 80 YUV.x = texture2D(tex_y, texture_Out).r;\ 81 YUV.y = texture2D(tex_u, texture_Out).r - 0.5;\ 82 YUV.z = texture2D(tex_v, texture_Out).r - 0.5;\ 83 RGB = mat3(1.0, 1.0, 1.0,\ 84 0.0, -0.39465, 2.03211,\ 85 1.13983, -0.58060, 0.0) * YUV;\ 86 gl_FragColor = vec4(RGB, 1.0);\ 87 }"; 88 89 //m_program加载shader(顶点和片元)脚本 90 //片元(像素) 91 qDebug()<<m_program.addShaderFromSourceCode(QOpenGLShader::Fragment, tString); 92 //顶点shader 93 qDebug() << m_program.addShaderFromSourceCode(QOpenGLShader::Vertex, vString); 94 95 //设置顶点位置 96 m_program.bindAttributeLocation("vertexPosition",ATTRIB_VERTEX); 97 //设置纹理位置 98 m_program.bindAttributeLocation("textureCoordinate",ATTRIB_TEXTURE); 99 100 //编译shader 101 qDebug() << "m_program.link() = " << m_program.link(); 102 103 qDebug() << "m_program.bind() = " << m_program.bind(); 104 105 //传递顶点和纹理坐标 106 //顶点 107 static const GLfloat ver[] = { 108 -1.0f,-1.0f, 109 1.0f,-1.0f, 110 -1.0f, 1.0f, 111 1.0f,1.0f 112// -1.0f,-1.0f, 113// 0.9f,-1.0f, 114// -1.0f, 1.0f, 115// 0.9f,1.0f 116 }; 117 //纹理 118 static const GLfloat tex[] = { 119 0.0f, 1.0f, 120 1.0f, 1.0f, 121 0.0f, 0.0f, 122 1.0f, 0.0f 123 }; 124 125 //设置顶点,纹理数组并启用 126 glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, ver); 127 glEnableVertexAttribArray(ATTRIB_VERTEX); 128 glVertexAttribPointer(ATTRIB_TEXTURE, 2, GL_FLOAT, 0, 0, tex); 129 glEnableVertexAttribArray(ATTRIB_TEXTURE); 130 131 //从shader获取地址 132 m_textureUniformY = m_program.uniformLocation("tex_y"); 133 m_textureUniformU = m_program.uniformLocation("tex_u"); 134 m_textureUniformV = m_program.uniformLocation("tex_v"); 135 136 //创建纹理 137 glGenTextures(1, &m_idy); 138 //Y 139 glBindTexture(GL_TEXTURE_2D, m_idy); 140 //放大过滤,线性插值 GL_NEAREST(效率高,但马赛克严重) 141 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 142 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 143 144 //U 145 glGenTextures(1, &m_idu); 146 glBindTexture(GL_TEXTURE_2D, m_idu); 147 //放大过滤,线性插值 148 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 149 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 150 151 //V 152 glGenTextures(1, &m_idv); 153 glBindTexture(GL_TEXTURE_2D, m_idv); 154 //放大过滤,线性插值 155 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 156 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 157 158 glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 159 glClear(GL_COLOR_BUFFER_BIT); 160 161} 162 163//刷新显示 164void YUV420P_Render::render(uchar* py,uchar* pu,uchar* pv,int width,int height,int type) 165{ 166 glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 167 glClear(GL_COLOR_BUFFER_BIT); 168 169 glActiveTexture(GL_TEXTURE0); 170 glBindTexture(GL_TEXTURE_2D, m_idy); 171 //修改纹理内容(复制内存内容) 172 glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width, height, 0, GL_RED, GL_UNSIGNED_BYTE,py); 173 //与shader 关联 174 glUniform1i(m_textureUniformY, 0); 175 176 glActiveTexture(GL_TEXTURE0+1); 177 glBindTexture(GL_TEXTURE_2D, m_idu); 178 //修改纹理内容(复制内存内容) 179 glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width/2, height/2, 0, GL_RED, GL_UNSIGNED_BYTE, pu); 180 //与shader 关联 181 glUniform1i(m_textureUniformU,1); 182 183 glActiveTexture(GL_TEXTURE0+2); 184 glBindTexture(GL_TEXTURE_2D, m_idv); 185 //修改纹理内容(复制内存内容) 186 glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width/2, height/2, 0, GL_RED, GL_UNSIGNED_BYTE, pv); 187 //与shader 关联 188 glUniform1i(m_textureUniformV, 2); 189 190 glDrawArrays(GL_TRIANGLE_STRIP,0,4); 191 qDebug() << "paintGL"; 192} 193 194void YUV420P_Render::render(uchar* ptr,int width,int height,int type) 195{ 196 glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 197 glClear(GL_COLOR_BUFFER_BIT); 198 199 glActiveTexture(GL_TEXTURE0); 200 glBindTexture(GL_TEXTURE_2D, m_idy); 201 //修改纹理内容(复制内存内容) 202 glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width, height, 0, GL_RED, GL_UNSIGNED_BYTE,ptr); 203 //与shader 关联 204 glUniform1i(m_textureUniformY, 0); 205 206 glActiveTexture(GL_TEXTURE0+1); 207 glBindTexture(GL_TEXTURE_2D, m_idu); 208 //修改纹理内容(复制内存内容) 209 glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width/2, height/2, 0, GL_RED, GL_UNSIGNED_BYTE, ptr+width*height); 210 //与shader 关联 211 glUniform1i(m_textureUniformU,1); 212 213 glActiveTexture(GL_TEXTURE0+2); 214 glBindTexture(GL_TEXTURE_2D, m_idv); 215 //修改纹理内容(复制内存内容) 216 glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width/2, height/2, 0, GL_RED, GL_UNSIGNED_BYTE, ptr+width*height*5/4); 217 //与shader 关联 218 glUniform1i(m_textureUniformV, 2); 219 220 glDrawArrays(GL_TRIANGLE_STRIP,0,4); 221 qDebug() << "paintGL"; 222}
最后写一个窗口类继承 QOpenGLWidget
1重写两个函数void initializeGL(); //调用上面渲染类的初始化函数 2 3void paintGL();//调用上面渲染类的渲染函数