我正在使用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();
}