亲爱的,
成为Qt5的新手。需要您对以下这些问题的专家建议。
我的Qt GUI循环在一个线程上运行,我正在尝试使用来自不同线程的OpenGL调用。
我的主GUI线程执行以下操作
工作线程
注意:如果我将所有内容都放在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