c++ - QGLWidget 忽略 glClear

标签 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系统上。)

最佳答案

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()不会再次把事情搞砸。您没有显示该代码,所以我在这里处于盲区。

关于c++ - QGLWidget 忽略 glClear,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20437595/

相关文章:

C++ mktime 更改我的 tm_struct 的值

c++ - 如何将位置 n 的 QList 拆分为新的 QList

c++ - 如何在 OpenGL 4.5 中使用 vao 和缓冲区

c++ - GLSL 语法错误 : "in" parse error

java - 着色器/矩阵问题 - 看不到对象

c++ - 如何在QCustom3DLabel上重置文本?

c++ - 部分模板特化的下标运算符重载

c++ - 标题中的缩进成员

qt - QComboBox:焦点Qt样式表

c++ - 在 Qt 应用程序中,我的工作线程是 "main"线程,我如何与 GUI 线程通信