我有一个QWindow,它存在于一个线程中,然后我有另一个类,它在另一个线程的QWindow表面上呈现。
我确实在main函数中调用XInitThreads()。我在QWindow类中创建了QOpenGLContext,然后将它(moveToThread)移动到渲染线程中,使其成为当前的。现在我试图清理屏幕并设置颜色,但当我调用glClear和glClearColor时,它第一次被完全忽略了(没有错误,没有崩溃,没有什么),我需要第二次调用它,让那个功能生效。同样,在我调用它两次之后,它会清除屏幕并设置颜色,但如果我想将颜色设置为不同的颜色,我需要再次执行两次才能生效。
我正确地交换了缓冲区,我知道第一次调用glclear*时它被忽略了,因为在我第一次交换缓冲区后,屏幕窗口上有一个随机噪声(在glclear之后不应该存在)。
下面是QWindow子类中的初始化:void OpenGLWindow::initialize()
{
if (!m_context) {
m_context = new QOpenGLContext();
m_context->setFormat(requestedFormat());
m_context->create();
}
thread = new ThreadHelper(m_context, this);
m_context->moveToThread(thread);
thread->start();
}
下面是渲染类:
ThreadHelper::ThreadHelper(QOpenGLContext *context, OpenGLWindow *window) :
m_context(context),
m_window(window)
{
}
void ThreadHelper::run()
{
m_context->makeCurrent(m_window);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
glClearColor(1.0, 0.0, 0.0, 0.5);
// in order to take effect this have to be called for the second time
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
glClearColor(1.0, 0.0, 0.0, 0.5);
swapOpenGLBuffers();
}
void ThreadHelper::swapOpenGLBuffers()
{
m_context->swapBuffers(m_window);
}
有人知道怎么解决这个问题吗?我使用的是qt5.2.1,在英特尔和英伟达图形上尝试了这个,结果是一样的。
谢谢你的帮助
glClear
将使用当前设置的clear color来清除颜色缓冲区(通过glClearColor
设置)。所以你的第一个清除调用将只使用旧的/默认的清除颜色,第二个将有你想要的效果,额外的glClearColor
只是多余的。只需交换前两行的顺序并删除重复的代码。