QGLWidget 拒绝绘制任何东西

Posted

技术标签:

【中文标题】QGLWidget 拒绝绘制任何东西【英文标题】:QGLWidget refuses to draw anything 【发布时间】:2013-02-08 00:49:53 【问题描述】:

我查看了大量关于 OpenGL 不绘图、常见错误等的文章和 SO 问题。这一篇让我很困惑。

我已经为glOrtho 尝试了几种不同的设置,不同的顶点位置、颜色等,都无济于事。

可以确认 OpenGL 状态是有效的,因为代码中的透明颜色紫色(意味着窗口紫色)。 gDEBugger 也在确认框架正在更新(Fraps 也是如此)。

这里是代码。标记为“没有帮助”的行最初不存在,是我尝试过但失败的事情。

QTWindow::QTWindow( )

    // Enable mouse tracking
    this->setMouseTracking(true);


void QTWindow::initializeGL()

    // DEBUG
    debug("Init'ing GL");
    this->makeCurrent(); ///< Didn't help
    this->resizeGL(0, 0); ///< Didn't help
    glDisable(GL_CULL_FACE); ///< Didn't help
    glClearColor(1, 0, 1, 0);


void QTWindow::paintGL()

    // DEBUG
    debug("Painting GL");
    this->makeCurrent(); ///< Didn't help
    glLoadIdentity();
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0,1,1);
    glBegin(GL_TRIANGLES);
    glVertex2f(500,100);
    glVertex2f(100,500);
    glVertex2f(0,0);
    glEnd();
    this->swapBuffers(); ///< Didn't help


void QTWindow::resizeGL(int width, int height)

    // DEBUG
    debug("Resizing GL");
    this->makeCurrent(); ///< Didn't help
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, 1000, 0, 1000, -1, 1);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

即使关闭了剔除,三角形也根本不显示。但是,所有三个调试日志都按应有的方式调用。

我错过了什么?

【问题讨论】:

所以基本上,你得到一个紫色的屏幕(由于glClearColorglClear),但是没有三角形绘制?只是想澄清一下... 正确。我已经尝试过四边形,此时我只是在尝试不同的东西,没有押韵或理由。我删除了对makeCurrent 的调用并将updateGL 更改为仅update。还是什么都没有。 【参考方案1】:

尝试在 QTWindow::resizeGL() 函数的最开始调用 glViewport() 函数:

glViewport(0, 0, width, height);

并且永远不要在 widthheight 设置为 0 的情况下调用 resizeGL() ;) 除此之外,你没有必要直接调用 resizeGL()每当调整窗口大小时,Qt 都会调用它。

您可以删除对 swapBuffers() 函数的所有调用 - 它正在由 Qt 内部调用。

makeCurrent() 函数应该在所有其他 GL 调用之前调用,所以最好在 initializeGL() 中调用它,但不必在 paintGL() 函数中调用它(除非 paintGL( ) 是从另一个线程调用的,但我敢打赌它不在你的代码中)。

【讨论】:

所有这些都是为了让某些东西工作的调试代码。我意识到 resizeGL 对 0,0 做了什么。我知道 glViewport。我知道makeCurrent。我在 OP 中提到了所有这些。【参考方案2】:

问题最终是版本。 glGetString(GL_VERSION) 返回的版本字符串表明正在使用 4.2 兼容性上下文。

由于在 3.1 中删除了 paintGL 方法中的三角形调用(如果我没记错的话),很明显为什么它们没有绘制任何东西。此外,没有错误被抛出,因为它是兼容的。模式。

因为我无法在 QGLWidget 上获得低于 3.0 的版本(由于 QT 需要 2.1,正如我在另一个留言板上获悉的那样),我将版本设置为 3.0 并尝试使用一些 3.0 绘图调用它最终工作了。

【讨论】:

以上是关于QGLWidget 拒绝绘制任何东西的主要内容,如果未能解决你的问题,请参考以下文章

QGLWidget 在 QT 中是如何工作的?

AVAudioPlayer 拒绝播放任何东西,但没有错误等

OpenGL 3.3 无法绘制任何东西

为啥我的 OpenGL 不绘制任何东西?

glDrawElements 不绘制任何东西

自定义视图 Canvas onDraw() 不绘制任何东西