我有一个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,在intel和nvidia图形上尝试了这个,结果是一样的。
感谢您的帮助。
答案 0 :(得分:0)
glClear
将使用当前设置的清除颜色来清除颜色缓冲区(通过glClearColor
设置)。所以你的第一个明确的调用只使用旧的/默认的清晰颜色,第二个将具有你想要的效果,而额外的glClearColor
只是多余的。只需交换前两行的顺序并删除重复的代码。