QGLWidget拒绝画任何东西

QGLWidget refuses to draw anything

本文关键字:任何东 拒绝 QGLWidget      更新时间:2023-10-16

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

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

I可以确认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();
}

即使关闭了筛选,三角形也根本没有显示。然而,所有三个调试日志的调用方式都是正确的。

我错过了什么?

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

glViewport(0, 0, width, height);

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

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

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

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

由于paintGL方法中的三角形调用在3.1中被删除(如果我没有记错的话),所以很明显他们没有绘制任何内容。此外,由于它在compat中,所以没有抛出任何错误。模式

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