1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
| void I420Render2::initializeGL() { initializeOpenGLFunctions(); const char *vsrc = "attribute vec4 vertexIn; \ attribute vec4 textureIn; \ varying vec4 textureOut; \ void main(void) \ { \ gl_Position = vertexIn; \ textureOut = textureIn; \ }";
const char *fsrc = "varying mediump vec4 textureOut;\n" "uniform sampler2D textureY;\n" "uniform sampler2D textureU;\n" "uniform sampler2D textureV;\n" "void main(void)\n" "{\n" "vec3 yuv; \n" "vec3 rgb; \n" "yuv.x = texture2D(textureY, textureOut.st).r; \n" "yuv.y = texture2D(textureU, textureOut.st).r - 0.5; \n" "yuv.z = texture2D(textureV, textureOut.st).r - 0.5; \n" "rgb = mat3( 1, 1, 1, \n" "0, -0.39465, 2.03211, \n" "1.13983, -0.58060, 0) * yuv; \n" "gl_FragColor = vec4(rgb, 1); \n" "}\n";
m_program.addCacheableShaderFromSourceCode(QOpenGLShader::Vertex,vsrc); m_program.addCacheableShaderFromSourceCode(QOpenGLShader::Fragment,fsrc); m_program.link();
GLfloat points[]{ -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, -1.0f, -1.0f,
0.0f,0.0f, 1.0f,0.0f, 1.0f,1.0f, 0.0f,1.0f };
vbo.create(); vbo.bind(); vbo.allocate(points,sizeof(points));
GLuint ids[3]; glGenTextures(3,ids); idY = ids[0]; idU = ids[1]; idV = ids[2]; }
void I420Render2::resizeGL(int w, int h) { if(h<=0) h=1;
glViewport(0,0,w,h); }
void I420Render2::paintGL() { if(!ptr) return;
glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glDisable(GL_DEPTH_TEST);
m_program.bind(); vbo.bind(); m_program.enableAttributeArray("vertexIn"); m_program.enableAttributeArray("textureIn"); m_program.setAttributeBuffer("vertexIn",GL_FLOAT, 0, 2, 2*sizeof(GLfloat)); m_program.setAttributeBuffer("textureIn",GL_FLOAT,2 * 4 * sizeof(GLfloat),2,2*sizeof(GLfloat));
glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D,idY); glTexImage2D(GL_TEXTURE_2D,0,GL_RED,width,height,0,GL_RED,GL_UNSIGNED_BYTE,ptr); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D,idU); glTexImage2D(GL_TEXTURE_2D,0,GL_RED,width >> 1,height >> 1,0,GL_RED,GL_UNSIGNED_BYTE,ptr + width*height); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D,idV); glTexImage2D(GL_TEXTURE_2D,0,GL_RED,width >> 1,height >> 1,0,GL_RED,GL_UNSIGNED_BYTE,ptr + width*height*5/4); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
m_program.setUniformValue("textureY",0); m_program.setUniformValue("textureU",1); m_program.setUniformValue("textureV",2); glDrawArrays(GL_QUADS,0,4); m_program.disableAttributeArray("vertexIn"); m_program.disableAttributeArray("textureIn"); m_program.release(); }
|