查看完整版本: [-- 关于QML和OpenGL交互的问题 --]

QTCN开发网 -> Qt QML开发 -> 关于QML和OpenGL交互的问题 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

月叮当0609 2016-07-01 17:03

关于QML和OpenGL交互的问题

本人目前在做的项目中,含有视频模块,即某个界面上有两个部件要实时显示底层发送的图片数据流,达到显示视频的效果。
而我们的界面采用的是QML编写,功能和逻辑全在C++中,之前用C++封装了个动态Image类注册到QML中使用,但是存在性能低,视频卡顿的现象;
没办法,硬件性能不能提高,只能想办法提高软件性能,查看了些资料,将动态Image类采用opengl绘图实现,利用GPU加速达到提升性能的目的。


目前问题是:性能是提高了,可是界面出现了闪烁现象。指定了ViewPort的size和position,但还是有帧被绘制到了界面的后面,起尺寸为整个界面窗口的大小,其他非opengl实现的控件也不能正常显示了。
请问该如何解决这个问题?

月叮当0609 2016-07-01 17:06
paint函数内容如下:
{
if (!m_program) {
                initGLProgram();
                m_program->bind();
            }
            setTexture();
      //  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
        glClearColor(0,0,0,0);
       glClear(GL_DEPTH_BUFFER_BIT);
      //  glViewport(100, 486, 366, 287);
        //glDisable(GL_DEPTH_TEST);
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

        m_pContext->swapBuffers((QSurface *)m_pWin);
        m_program->disableAttributeArray(ATTRIB_VERTEX);
        //m_program->release();
    }
}

月叮当0609 2016-07-01 17:06

initGLProgram函数如下:
{
m_pSurfaceFormat = m_pWin->requestedFormat();
    m_pSurfaceFormat.setSwapBehavior(QSurfaceFormat::DoubleBuffer);
    //设置opengl渲染的场景
    m_pContext = new QOpenGLContext(this);
   // m_pContext->moveToThread(QThread::currentThread());
    m_pContext->setFormat(m_pSurfaceFormat);
    m_pContext->create();
   // m_pContext->moveToThread(QThread::currentThread());
    m_pContext->makeCurrent(m_pWin);
    initializeOpenGLFunctions();

    m_program = new QOpenGLShaderProgram();
    m_program->addShaderFromSourceCode(QOpenGLShader::Vertex,
                                       "attribute highp vec4 vertexIn;"
                                       "attribute highp vec2 textureIn;"
                                       "varying vec2 textureOut;"
                                       "void main(void) {"
                                       "gl_Position = vertexIn;"
                                       "textureOut = textureIn;}");

    m_program->addShaderFromSourceCode(QOpenGLShader::Fragment,
                                       "varying vec2 textureOut;"
                                       "uniform sampler2D tex_y;"
                                       "uniform sampler2D tex_u;"
                                       "uniform sampler2D tex_v;"
                                       "void main(void){"
                                       "vec3 yuv;"
                                       "vec3 rgb;"
                                       "yuv.x = texture2D(tex_y, textureOut).r;"
                                       "yuv.y = texture2D(tex_u, textureOut).r - 0.5;"
                                       "yuv.z = texture2D(tex_v, textureOut).r - 0.5;"
                                       "rgb = mat3( 1,       1,         1,"
                                       "0,       -0.39465,  2.03211,"
                                       "1.13983, -0.58060,  0) * yuv;"
                                       "gl_FragColor = vec4(rgb, 1);}" );

    m_program->bindAttributeLocation("vertexIn", ATTRIB_VERTEX);
    m_program->bindAttributeLocation("textureIn", ATTRIB_TEXTURE);

    m_program->link();

    glGenTextures(1, &m_ytexture);
    glBindTexture(GL_TEXTURE_2D, m_ytexture);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)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, &m_utexture);
    glBindTexture(GL_TEXTURE_2D, m_utexture);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)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, &m_vtexture);
    glBindTexture(GL_TEXTURE_2D, m_vtexture);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)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);


    glViewport(100, 486, 366, 287);
}

月叮当0609 2016-07-01 17:07
setTexture函数如下:
{
static const GLfloat vertexVertices[] = {
        -1.0f, -1.0f,
        1.0f, -1.0f,
        -1.0f,  1.0f,
        1.0f,  1.0f,
    };
    m_program->setAttributeArray(ATTRIB_VERTEX, GL_FLOAT, vertexVertices, 2);
    m_program->enableAttributeArray(ATTRIB_VERTEX);


    static const GLfloat textureVertices[] = {
        0.0f,  1.0f,
        1.0f,  1.0f,
        0.0f,  0.0f,
        1.0f,  0.0f,
    };
    m_program->setAttributeArray(ATTRIB_TEXTURE, GL_FLOAT, textureVertices, 2);
    m_program->enableAttributeArray(ATTRIB_TEXTURE);


    m_TextureID0=m_program->uniformLocation("tex_y");
   m_TextureID1=m_program->uniformLocation("tex_u");
    m_TextureID2=m_program->uniformLocation("tex_v");

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, m_ytexture);
    glTexImage2D ( GL_TEXTURE_2D, 0, GL_LUMINANCE, MAIN_TEXTURE_WIDTH, MAIN_TEXTURE_HEIGHT, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, m_pImgData);
    m_program->setUniformValue(m_TextureID0, 0);

    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE_2D,m_utexture);
     glTexImage2D ( GL_TEXTURE_2D, 0, GL_LUMINANCE, MAIN_TEXTURE_WIDTH/2, MAIN_TEXTURE_HEIGHT/2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, m_pImgData+Pitch);
    m_program->setUniformValue(m_TextureID1, 1);

    glActiveTexture(GL_TEXTURE2);
    glBindTexture(GL_TEXTURE_2D, m_vtexture);
     glTexImage2D ( GL_TEXTURE_2D, 0, GL_LUMINANCE, MAIN_TEXTURE_WIDTH/2, MAIN_TEXTURE_HEIGHT/2, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE,  m_pImgData+Pitch+ (Pitch >> 4));
    m_program->setUniformValue(m_TextureID2, 2);
}

月叮当0609 2016-07-13 17:44
已解决!

conghua 2016-07-25 11:07
你好,我最近也在搞Qt和opengl,有些问题能跟你讨论下吗


查看完整版本: [-- 关于QML和OpenGL交互的问题 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled