使用QOpenGLWidget尝试从不同的线程绘制而不覆盖paintGL

时间:2015-08-10 15:48:05

标签: multithreading opengl qt5


亲爱的,

成为Qt5的新手。需要您对以下这些问题的专家建议。

我的Qt GUI循环在一个线程上运行,我正在尝试使用来自不同线程的OpenGL调用。


我的主GUI线程执行以下操作

  • QApplication(argc,argv)
  • 创建QOpenGLWidget
  • 创建着色器程序
  • 运行事件循环。

工作线程

  • 使OpenGL调用绘制(比如三角形)

注意:如果我将所有内容都放在paintGL中,它就像魅力一样:)

我尝试创建shareContext,然后执行 makecurrent | 绘制 |来自工作线程的 swapbuffers 。但没有运气。

我甚至尝试在与具有共享上下文的Qt主GUI循环相同的线程上下文中执行绘制作业,如下所示

的main.cpp

class MyQOpenGLWidget : public QOpenGLWidget {

public:
MyQOpenGLWidget(QWidget *parent=0);
~MyQOpenGLWidget();
void createTriangle(int p_vertexAttr, int p_colorAttr, int p_matrixUniform, GLuint pSurfaceProgram);
void draw();

private:
void initializeGL();
//void paintGL(); // No paintGL implementation I've provided
void resizeGL(int w, int h);
void createShareContext () {
    qDebug() << "MyQOpenGLWidget->QThread::currentThread(): " << QThread::currentThread();

    QOpenGLContext *share = context();
    m_context = new QOpenGLContext();
    if (share->isValid()) {
        m_context->setShareContext(share);
        m_context->setFormat(share->format());

        m_Surface = new QOffscreenSurface();
        m_Surface->setFormat(share->format());
        m_Surface->create();
    }
}
Triangle *m_triangle;
QOpenGLContext *m_context;
QOffscreenSurface *m_Surface;
}

MyQOpenGLWidget.h

MyQOpenGLWidget::draw(){
    if (m_context == NULL) {
        createShareContext();
    }
    if (!m_context->isValid()) {
        m_context->create();
    }

    m_context->makeCurrent(m_Surface);

    glClear(GL_COLOR_BUFFER_BIT);
    bind(); // glUseProgram( mSurfaceProgram );

    QMatrix4x4 matrix;
    matrix.ortho(-2.0f, 2.0f, -2.0f, 2.0f, 2.0f, -2.0f);
    matrix.translate(0.0f, 0.0f, 1.0f);
    setUniformValue(m_matrixUniform, 1, GL_FALSE, matrix.constData()); // glUniformMatrix4fv(...)

    m_triangle->draw(); // Draw triangle
    release(); // glUseProgram( 0 );

    m_context->swapBuffers(m_Surface);
    glFlush();

    m_context->doneCurrent();
}

MyQOpenGLWidget.cpp

getIndex

如果你有任何示例程序或任何关于如何做同样的建议,那将会很有帮助。



我在Ubuntu上使用Qt5.5.0,这是OpenGL输出

GL RENDERER:llvmpipe上的Gallium 0.4(LLVM 0x300)

GL VERSION:2.1 Mesa 8.0.2

GL MAX TEXTURE SIZE:4096

0 个答案:

没有答案