QGLWidget ignores glClear

QGLWidget ignores glClear

本文关键字:glClear ignores QGLWidget      更新时间:2023-10-16

我被难住了。我在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系统上。)

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()不会再次把事情搞砸。你没有显示代码,所以我在这里是盲目的。