需要调用OpenGL函数两次才能生效

时间:2014-03-23 18:52:51

标签: c++ linux multithreading qt opengl

我有一个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图形上尝试了这个,结果是一样的。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

glClear将使用当前设置的清除颜色来清除颜色缓冲区(通过glClearColor设置)。所以你的第一个明确的调用只使用旧的/默认的清晰颜色,第二个将具有你想要的效果,而额外的glClearColor只是多余的。只需交换前两行的顺序并删除重复的代码。