标题:关于QML和OpenGL交互的问题
作者:月叮当0609
日期:2016-07-01 17:03
内容:
本人目前在做的项目中,含有视频模块,即某个界面上有两个部件要实时显示底层发送的图片数据流,达到显示视频的效果。
而我们的界面采用的是QML编写,功能和逻辑全在C++中,之前用C++封装了个动态Image类注册到QML中使用,但是存在性能低,视频卡顿的现象;
没办法,硬件性能不能提高,只能想办法提高软件性能,查看了些资料,将动态Image类采用opengl绘图实现,利用GPU加速达到提升性能的目的。
目前问题是:性能是提高了,可是界面出现了闪烁现象。指定了ViewPort的size和position,但还是有帧被绘制到了界面的后面,起尺寸为整个界面窗口的大小,其他非opengl实现的控件也不能正常显示了。
请问该如何解决这个问题?
#1 [月叮当0609 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();
}
}
#2 [月叮当0609 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) {"
&n ..
#3 [月叮当0609 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);
  ..
#4 [月叮当0609 07-13 17:44]
已解决!
#5 [conghua 07-25 11:07]
你好,我最近也在搞Qt和opengl,有些问题能跟你讨论下吗