Qt上传纹理线程

时间:2014-03-13 08:43:26

标签: multithreading qt opengl qglwidget

我正在使用QGLWidget来显示实时图像流。由于上传纹理是一项昂贵的操作,我想避免在GUI线程上执行此操作。我在这里阅读http://blog.qt.digia.com/blog/2011/06/03/threaded-opengl-in-4-8/,可以从另一个线程中执行此操作。有人可以提供一个简短的例子吗?我不确定如何分享GL上下文以及如何确保没有竞争条件。

这就是我现在所拥有的:

.h:

class ImageDisplay : public QGLWidget
{
    Q_OBJECT
public:
    ImageDisplay(QWidget* parent = 0);
    void paintGL();
    void resizeGL(int w, int h);

private:
    QRectF plane;
    GLuint texID;

public slots:
    void sl_update(spImageHolder_t _myImageShPtr);
};

的.cpp:

ImageDisplay::ImageDisplay(QWidget *parent)
    : QGLWidget(parent)
    , plane(QPointF(0,1),QSizeF(1,1))
{
    QImage initImg(400,300,QImage::Format_Indexed8);
    resize(initImg.size());
    makeCurrent();
    texID = bindTexture ( initImg, GL_TEXTURE_2D, GL_LUMINANCE, QGLContext::NoBindOption );
}

void ImageDisplay::paintGL()
{
    makeCurrent();
    drawTexture ( plane, texID, GL_TEXTURE_2D );
}
void ImageDisplay::resizeGL(int w, int h)
{
    glViewport (0, 0, w, h);
    glMatrixMode (GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, 1,0,1,-1,1);
    glMatrixMode (GL_MODELVIEW);
}

void ImageDisplay::sl_update(spImageHolder_t _myImageShPtr) //slot
{
    QImage * imgPtr = _myImageShPtr->getImagePtr();
    if (NULLPTR != imgPtr)
    {
        deleteTexture(texID);
        texID = bindTexture( *imgPtr, GL_TEXTURE_2D, GL_LUMINANCE, QGLContext::NoBindOption );
    }
    updateGL();
}

0 个答案:

没有答案