浮云也是风景 |
2015-12-02 09:12 |
主要相关函数是这三个,根据 http://blog.csdn.net/leixiaohua1020/article/details/40379845 这篇文章和Qt自带的例子想结合改动 initializeGL{
initializeOpenGLFunctions(); glEnable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); initshader(); }
initshader{
QOpenGLShader *vshader = new QOpenGLShader(QOpenGLShader::Vertex, this); const char *vsrc = "attribute vec4 vertexIn;\n" "attribute vec2 textureIn;\n" "varying vec2 textureOut;\n" "void main(void)\n" "{\n" " gl_Position = vertexIn;\n" " textureOut = textureIn;\n" "}\n";
vshader->compileSourceCode(vsrc);
QOpenGLShader *fshader = new QOpenGLShader(QOpenGLShader::Fragment, this); const char *fsrc = "precision highp float;" "varying vec2 textureOut;\n" "uniform sampler2D tex_y;\n" "uniform sampler2D tex_u;\n" "uniform sampler2D tex_v;\n" "void main(void)\n" "{\n" " vec3 yuv;\n" " vec3 rgb;\n" " yuv.x = texture2D(tex_y, textureOut).r;\n" " yuv.y = texture2D(tex_u, textureOut).r - 0.5;\n" " yuv.z = texture2D(tex_v, textureOut).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";
fshader->compileSourceCode(fsrc);
program = new QOpenGLShaderProgram; program->addShader(vshader); program->addShader(fshader); program->bindAttributeLocation("vertexIn", PROGRAM_VERTEX_ATTRIBUTE); program->bindAttributeLocation("textureIn", PROGRAM_TEXCOORD_ATTRIBUTE); program->link();
program->bind(); program->setUniformValue("textureOut", 0); program->setAttributeValue("VShowBackColor", 1.0);
textureUniformY = program->uniformLocation("tex_y"); textureUniformU = program->uniformLocation("tex_u"); textureUniformV = program->uniformLocation("tex_v");
glVertexAttribPointer(PROGRAM_VERTEX_ATTRIBUTE, 2, GL_FLOAT, 0, 0, vertexVertices); glEnableVertexAttribArray(PROGRAM_VERTEX_ATTRIBUTE);
glVertexAttribPointer(PROGRAM_TEXCOORD_ATTRIBUTE, 2, GL_FLOAT, 0, 0, textureVertices); glEnableVertexAttribArray(PROGRAM_TEXCOORD_ATTRIBUTE);
glGenTextures(1, &id_y); glBindTexture(GL_TEXTURE_2D, id_y); 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);
glGenTextures(1, &id_u); glBindTexture(GL_TEXTURE_2D, id_u); 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);
glGenTextures(1, &id_v); glBindTexture(GL_TEXTURE_2D, id_v); 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); } paintGL{
glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, id_y); glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, fYSize, fHeight, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, fY); glUniform1i(textureUniformY, 0);
glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, id_u); glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, fYSize/2, fHeight/2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, fU); glUniform1i(textureUniformU, 1);
glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, id_v); glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, fYSize/2, fHeight/2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, fV); glUniform1i(textureUniformV, 2); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); }
|
|