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,在英特尔和英伟达图形上尝试了这个,结果是一样的。

谢谢你的帮助

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

最新更新