qt opengl(after ver2.1) 渲染 nv12


qt opengl(after ver2.1) 渲染 nv12 qt opengl(after ver2.1) 渲染 nv12 qt opengl(after ver2.1) 渲染 nv12
资源截图
代码片段和文件信息
#include 

#include 
#include 

Gl_widget::Gl_widget(int width int height const QString& path QWidget* parent)
    :QGLWidget(QGLFormat(QGL::SampleBuffers) parent)
     video_width(width)
     video_height(height)
     y_texture(0)
     uv_texture(0)
     y_data(0)
     uv_data(0)
     file(path)
     timer(this)
     program(this)
{
    setFocusPolicy(Qt::StrongFocus);

    y_data = new unsigned char[(width*height*3)>>1];
    uv_data = y_data+(width*height);
    file.open(QIODevice::ReadOnly);
}

Gl_widget::~Gl_widget()
{
    file.close();

    glDeleteTextures(1 &y_texture);
    glDeleteTextures(1 &uv_texture);

    uv_data = 0;
    delete [] y_data;
    y_data = 0;
}
void Gl_widget::initializeGL()
{
    qDebug() << program.addShaderFromSourceCode(QGLShader::Fragment
     “uniform sampler2D y_texture;

     “uniform sampler2D uv_texture;

     “void main(void)

     “{

     “   float y u v red green blue;

     “   y = texture2D(y_texture gl_TexCoord[0].st).r ;

     “   y =  1.1643 * (y - 0.0625);

     “   u = texture2D(uv_texture gl_TexCoord[0].st).r - 0.5;

     “   v = texture2D(uv_texture gl_TexCoord[0].st).a - 0.5;

     “   red = y+1.5958*v;

     “   green = y-0.39173*u-0.81290*v;

     “   blue = y+2.017*u;

     “   gl_FragColor = vec4(red green blue 1.0);

     “}“);

    qDebug() << program.link();
    qDebug() << program.bind();

    glGenTextures(1 &y_texture);
    glGenTextures(1 &uv_texture);

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D y_texture);
    glTexParameterf(GL_TEXTURE_2D GL_TEXTURE_MAG_FILTER GL_NEAREST);
    glTexParameterf(GL_TEXTURE_2D GL_TEXTURE_MIN_FILTER GL_NEAREST);
    glTexEnvf(GL_TEXTURE_ENVGL_TEXTURE_ENV_MODEGL_DECAL);
    glTexImage2D(GL_TEXTURE_2D 0 GL_LUMINANCE video_width video_height 0 GL_LUMINANCE GL_UNSIGNED_BYTE y_data);

    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE_2D uv_texture);
    glTexParameterf(GL_TEXTURE_2D GL_TEXTURE_MAG_FILTER GL_NEAREST);
    glTexParameterf(GL_TEXTURE_2D GL_TEXTURE_MIN_FILTER GL_NEAREST);
    glTexEnvf(GL_TEXTURE_ENVGL_TEXTURE_ENV_MODEGL_DECAL);
    glTexImage2D(GL_TEXTURE_2D 0 GL_LUMINANCE_ALPHA video_width>>1 video_height>>1 0 GL_LUMINANCE_ALPHA GL_UNSIGNED_BYTE uv_data);

    program.setUniformValue(“y_texture“ 0);
    program.setUniformValue(“uv_texture“ 1);

    connect(&timer SIGNAL(timeout()) this SLOT(on_timeout()));
    timer.setInterval(25);
    timer.start();
}

void Gl_widget::paintGL()
{
    file.read((char*)y_data (video_width*video_height*3)>>1);

    glActiveTexture(GL_TEXTURE0);
    glTexSubImage2D(GL_TEXTURE_2D 0 0 0 video_width video_height GL_LUMINANCE GL_UNSIGNED_BYTE y_data);
    glActiveTexture(GL_TEXTURE1);
    glTexSubImage2D(GL_TEXTURE_2D 0 0 0 video_width>>1 video_height>>1 GL_LUMINANCE_ALPHA GL_UNSIGNED_BYTE uv_data);


    glClear(GL_COLOR_BUFFER_BIT);

    glEnable(

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2017-09-27 16:48  nv12_shader
     文件        3605  2017-09-25 15:40  nv12_shadergl_widget.cpp
     文件         673  2017-09-25 15:40  nv12_shadergl_widget.h
     文件         280  2017-09-27 15:53  nv12_shadermain.cpp
     文件         280  2017-09-27 15:53  nv12_shadermain.cpp~
     文件     4320000  2017-09-25 15:40  nv12_shader est_yuv420p_320x180.yuv
     文件     3110400  2017-09-25 15:42  nv12_shadervideotestsrc_1920x1080.nv12
     文件         363  2017-09-25 15:40  nv12_shaderyuv_shader.pro
     文件       44458  2017-09-25 15:40  nv12_shaderyuv_shader.pro.user
     文件         315  2017-09-25 15:40  nv12_shaderyuv_window.cpp
     文件         347  2017-09-25 15:40  nv12_shaderyuv_window.h
     文件         433  2017-09-25 15:40  nv12_shaderyuv_window.ui

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。

发表评论

评论列表(条)