Qt,openGL,小部件和屏幕外渲染

时间:2017-08-09 10:59:52

标签: c++ qt opengl double-buffering

我在RedHat Linux上开发,cat / etc / redhat-release:

    Red Hat Enterprise Linux Workstation release 7.2 (Maipo)

我正在使用Qt Creator 4.3.1:

    Based on Qt 5.9.1 (GCC 5.3.1 20160406 (Red Hat 5.3.1-6), 64 bit)

我正在开发的项目是使用Qt 5.6.2 GCC 64bit,该项目是使用从QWidget派生的图形对象开发的,其中包括一个实时视频流。

不幸的是,我们在视频播放过程中经历过撕裂,这在视频周围显示的其他小部件中也很明显,我相信这是因为视频没有使用vsync。

我相信使用openGL可以纠正这种情况,目的是重写小部件,包括使用openGL进行视频播放。我花了几天时间试图找到完整且有效的解决方案,但到目前为止还未能找到完整且有效的解决方案。

我一直在使用QOpenGLWidget,在我用来测试的小部件中:

    class clsElevStrip : public QOpenGLWidget, protected QOpenGLFunctions {
    Q_OBJECT

在构造函数中,我设置了屏幕外渲染的格式:

    //Create surface format for rendering offscreen
    mobjFormat.setDepthBufferSize(24);
    mobjFormat.setSamples(4);
    mobjFormat.setVersion(3, 0);
    mobjFormat.setSwapBehavior(QSurfaceFormat::DoubleBuffer);
    setFormat(mobjFormat);

在paintGL方法中:

    QOpenGLContext* pobjContext = context();
    QSurface* pobjSurface = pobjContext->surface();
    assert(pobjSurface != NULL);

    int intSB1 = pobjSurface->format().swapBehavior();
    qDebug() << (QString("paintGL:format: ")
               + QString::number(intSB1));
    pobjContext->makeCurrent(pobjSurface);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glBegin(GL_TRIANGLES);
    glColor3f(1.0, 0.0, 0.0);
    glVertex3f(-0.5, -0.5, 0);
    glColor3f(0.0, 1.0, 0.0);
    glVertex3f( 0.5, -0.5, 0);
    glColor3f(0.0, 0.0, 1.0);
    glVertex3f( 0.0,  0.5, 0);
    glEnd();

    pobjContext->swapBuffers(pobjSurface);

在主显示屏上看不到任何内容,调试语句将格式显示为2(DoubleBuffering)。

如果我在构造函数中注释掉该行:

    setFormat(mobjFormat);

debug语句将格式显示为0(DefaultSwapBehavior)。图形是可见的,我错过了什么?

0 个答案:

没有答案