QGLWidget忽略glClear

时间:2013-12-07 04:30:33

标签: c++ qt opengl qglwidget

我很难过。我在QT 4.6应用程序的主窗口中有一个小部件,它已被配置为openGL小部件。它画得很好,除了我无法清除帧之间的背景。当窗户打开时我得到一个黑色的背景,之后它永远不会清除,所以随着时间的推移,我得到了混乱的渲染物体。我还必须在paintGL()函数的末尾调用swapBuffers()来获取窗口小部件,以显示最让我困惑的框架,因为我认为swapBuffers()是自动调用的。我设置为双缓冲,并且不共享窗口小部件。以下是相关代码:

void GLWidget::paintGL ( )
{
    m_Input.Draw();
    QGLWidget::swapBuffers();
}

void GLWidget::initializeGL ( )
{
    qglClearColor(QColor(0,0,255,128));
    glClear(GL_COLOR_BUFFER_BIT);
}

似乎双重缓冲似乎有些不对劲。将屏幕清除为背景颜色非常基本。但它让我疯狂,为什么它不起作用。其余的绘图代码工作正常。有任何想法吗? (这是在Linux系统上。)

1 个答案:

答案 0 :(得分:2)

glClear是一个绘图操作。它不属于initializeGL,而属于paintGL。清除颜色也应该在调用glClear之前设置,因此请移动[q]glClearColor

更新

paintGL方法应如下所示:

void GLWidget::paintGL()
{
    qglClearColor(QColor(0,0,255,128));
    glClear(GL_COLOR_BUFFER_BIT);
    // you probably also want to clear the depth and stencil buffers
    // glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

    m_Input.Draw();

    QGLWidget::swapBuffers();
}

当然,您必须确保m_Input.Draw()不会再次搞砸了。你没有显示代码,所以我在这里是盲人。