无法在QGLWidget来绘图设定所需的OpenGL版本(Can't set desired

2019-07-29 21:09发布

我想在Qt的4.8.2使用QGLWidget来绘图。 我注意到,QGLWidget来绘图创建默认情况下不显示上述3.1对OpenGL任何输出。 Qt的维基有一个教程演示使用OpenGL 3.3画一个简单的三角形。 当我尝试运行教程中,我得到了一个空白屏幕。 如果我改变了OpenGL版本3.1,我得到的预期输出(红色三角形)。

我的显卡支持OpenGL 4.2,并呼吁QGLFormat::openGLVersionFlags()创建QGLWidget来绘图之前显示的Qt检测的OpenGL 4.2和所有以前的桌面版。

这里还有一个小例子:

#include <QApplication>
#include <QGLWidget>
#include <QDebug>
#include <QtDeclarative/qdeclarativeview.h>

int main(int argc, char * argv[])
{
    QApplication app(argc, argv);

    qDebug() << "OpenGL Versions Supported: " << QGLFormat::openGLVersionFlags();

    QGLFormat qglFormat;
    qglFormat.setVersion(4,2);  // get expected output with (3,1) and below, else blank window
    qglFormat.setProfile(QGLFormat::CoreProfile);
    qglFormat.setSampleBuffers(true);

    QGLWidget* qglWidget = new QGLWidget(qglFormat);

    QString versionString(QLatin1String(reinterpret_cast<const char*>(glGetString(GL_VERSION))));
    qDebug() << "Driver Version String:" << versionString;
    qDebug() << "Current Context:" << qglWidget->format();

    QDeclarativeView mainView;
    mainView.setViewport(qglWidget);
    mainView.setSource(QString("helloworld.qml"));
    mainView.show();

    return app.exec();
}

下面是输出:

OpenGL Versions Supported:  QFlags(0x1|0x2|0x4|0x8|0x10|0x20|0x40|0x1000|0x2000|0x4000|0x8000|0x10000) 
Driver Version String: "4.2.0 NVIDIA 295.53" 
Current Context: QGLFormat(options QFlags(0x1|0x2|0x4|0x10|0x20|0x80|0x200|0x400) , plane  0 , depthBufferSize  24 , accumBufferSize  16 , stencilBufferSize  8 , redBufferSize  8 , greenBufferSize  8 , blueBufferSize  8 , alphaBufferSize  -1 , samples  4 , swapInterval  0 , majorVersion  4 , minorVersion  2 , profile  1 )  

QFlags()在第一行枚举列表介绍支持的OpenGL版本。 该列表显示我支持所有型号,除了支持OpenGL / ES版本。 QFlags()在第三行描述了格式选项(alpha通道,模版缓冲器等)。

任何人都知道为什么QGLWidget来绘图将不与任何> = 3.1的工作? 我在Linux上,有一个Nvidia的GT440,并且glxinfo显示它支持OpenGL 4.2.0。 驱动程序版本被印刷在样品输出的上方。 我也不太清楚什么尝试。

编辑:我用我的这个编辑前的问题作了解释一些非常严重的错误/假设。 这个问题仍然是相似的,但希望让更多的意义了。 对不起,任何混乱。

Answer 1:

你应该将OpenGL的查询后向下mainView.show(); 。 前show() OpenGL上下文尚未初始化。



Answer 2:

Short version: update to Qt5, it's fixed there.

P.S And if you can use 5.4 you should probably use QtOpenGL... classes instead of QGL... ones.

Long version: So, in case anyone ever come across a problem like this one.

I tried to create NOT OpenGL 3.0 context with my Intel HD3000 on ubuntu 14.04 and Qt 4.8.6. I came up with this test code provided at the end of the answer. Tried creating 3.1, 1.2, 2.1.. etc. contexts Core Compatible.. but always end up with context->format().majorVersion() showing the requested version, and glGetString(GL_VERSION) showing 3.0.

After about 3 hours I noticed that by default Qt Creator uses Qt4 instead of recent Qt 5, installed on my system. And after I recompiled the project with Qt 5.2.1 exactly the same code started working as expected.

Hope this may help someone.

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MainWindow w;
    w.show();

    QGLFormat glFormat;
    glFormat.setVersion(3, 1);
    glFormat.setProfile(QGLFormat::NoProfile);
    glFormat.setSampleBuffers(true);
    glFormat.setDefaultFormat(glFormat);
    glFormat.setSwapInterval(1);
    QGLWidget widget(glFormat);
    widget.makeCurrent();

    const QGLContext *context = widget.context();

    glewExperimental = GL_TRUE;
    if (glewInit() != GLEW_OK) {
        qWarning("Failed to initialize GLEW\n");
    }
    qDebug() << "Context valid: " << context->isValid();
    qDebug() << "Really used OpenGl: " << context->format().majorVersion() << "." << context->format().minorVersion();
    qDebug() << "OpenGl information: VENDOR:       " << (const char*)glGetString(GL_VENDOR);
    qDebug() << "                    RENDERDER:    " << (const char*)glGetString(GL_RENDERER);
    qDebug() << "                    VERSION:      " << (const char*)glGetString(GL_VERSION);
    qDebug() << "                    GLSL VERSION: " << (const char*)glGetString(GL_SHADING_LANGUAGE_VERSION);
    qDebug() << "endstuff\n";

    return a.exec();
}


文章来源: Can't set desired OpenGL version in QGLWidget