我已經瞭解了爲Qt QGLWidget設置單獨的呈現線程here,here和here。 我也設法得到的是一種「工作」設置的:在viewport.Seems清除顏色是ok.But我收到以下警告:QT在單獨的線程中管理OpenGL上下文
QOpenGLContext :: swapBuffers()調用非暴露窗口,行爲 是不確定的
我首先創建一個從QGLWidget.Where我還設置OpenGL的格式繼承的插件:
在窗口部件的構造:
QGLFormat format;
format.setProfile(QGLFormat::CompatibilityProfile);
format.setVersion(4,3);
format.setDoubleBuffer(true);
format.setSwapInterval(1);
setFormat(format);
setAutoBufferSwap(false);
然後我初始化在同一個插件的渲染線程:
void GLThreadedWidget::initRenderThread(void){
doneCurrent();
context()->moveToThread(&m_renderThread);
m_renderThread.start();
}
,並從該點的整個渲染線程中完成的:
RenderThread構造:
RenderThread::RenderThread(GLThreadedWidget *parent)
:QThread(),glWidget(parent)
{
doRendering = true;
}
RenderThread run()方法:
void RenderThread::run(){
glWidget->makeCurrent();
GLenum err = glewInit();
if (GLEW_OK != err) {
printf("GLEW error: %s\n", glewGetErrorString(err));
} else {
printf("Glew loaded; using version %s\n", glewGetString(GLEW_VERSION));
}
glInit();
while (doRendering){
glWidget->makeCurrent();
glClear(GL_COLOR_BUFFER_BIT);
paintGL(); // render actual frame
glWidget->swapBuffers();
glWidget->doneCurrent();
msleep(16);
}
}
任何人都可以指出問題在哪裏?如果該消息可以被丟棄?同樣在渲染的Qt線程設置一個簡單和簡潔的解釋是非常helpful.Using的Qt 5.2(OpenGL的桌面版本)
我把它'glWidget'既是'QOpenGLContext'和'QWindow'?我的假設是問題不在於多線程。你在'RenderThread'的某個地方做過show()嗎? – agrum
如果你打算使用這個線程渲染屏幕外,你可能需要使用http://qt-project.org/doc/qt-5/qoffscreensurface.html我猜。 – agrum
@agrum,不,我沒有,它真的好像那些警告彈出之前,小部件顯示 –