关于c ++:QGLWidget忽略glClear

QGLWidget ignores glClear

我很沮丧 我在QT 4.6应用程序的主窗口中有一个小部件,该小部件已配置为openGL小部件。 它绘制得很好,除非我无法清除各帧之间的背景。 当他的窗口打开时,我得到一个黑色背景,此后再也看不到,所以随着时间的流逝,我得到了混乱的渲染对象。 我还必须在paintGL()函数的末尾调用swapBuffers()才能使小部件显示最新的帧,这让我感到困惑,因为我印象中自动调用swapBuffers()。 我设置为双缓冲,并且不共享小部件。 以下是相关代码:

1
2
3
4
5
6
7
8
9
10
11
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方法应如下所示:

1
2
3
4
5
6
7
8
9
10
11
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()不会再次搞砸。 您没有显示代码,所以我在这里是盲目的。