无法在QGLWidget中设置想要的OpenGL版本?

时间:2022-09-10 17:53:08

I'm trying to use QGLWidget in Qt 4.8.2. I noticed that the default context QGLWidget creates doesn't show any output for OpenGL above 3.1. The Qt wiki has a tutorial that demonstrates using OpenGL 3.3 to draw a simple triangle. When I try to run the tutorial, I get a blank screen. If I change the OpenGL version to 3.1, I get the expected output (a red triangle).

我尝试在Qt 4.8.2中使用QGLWidget。我注意到,默认上下文QGLWidget创建的OpenGL的输出没有超过3.1。Qt wiki有一个教程,演示使用OpenGL 3.3绘制一个简单的三角形。当我尝试运行教程时,我得到一个空白屏幕。如果我将OpenGL版本改为3.1,我将得到预期的输出(红色三角形)。

My video card supports OpenGL 4.2, and calling QGLFormat::openGLVersionFlags() before creating the QGLWidget shows that Qt detects OpenGL 4.2 and all previous desktop versions.

我的显卡支持OpenGL 4.2,在创建QGLWidget之前,调用QGLFormat::openGLVersionFlags(),显示Qt检测OpenGL 4.2和所有以前的桌面版本。

Here's another minimal example:

这是另一个很小的例子:

#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();
}

Here's the output:

输出:

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 )  

The QFlags() enum list on the first line describes the OpenGL versions supported. The list shows I support all variants except for OpenGL/ES versions. QFlags() on the third line describes format options (alpha channel, stencil buffer, etc).

第一行的QFlags()枚举列表描述了支持的OpenGL版本。列表显示,除了OpenGL/ES版本,我支持所有变体。第三行的QFlags()描述格式选项(alpha通道、模板缓冲区等)。

Anyone know why QGLWidget won't work with anything >= 3.1? I'm on Linux, have an Nvidia GT440, and glxinfo shows it supports OpenGL 4.2.0. The driver version is printed in the sample output above. I'm not too sure what else to try.

有人知道为什么QGLWidget不会使用>= 3.1的东西吗?我在Linux上,有一个Nvidia GT440, glxinfo显示它支持OpenGL 4.2.0。驱动程序版本打印在上面的示例输出中。我不太确定还能尝试什么。

Edit: I made some pretty bad mistakes/assumptions with my explanation of the problem before this edit. The issue is still similar, but hopefully makes a bit more sense now. Sorry for any confusion.

编辑:在此编辑之前,我对问题的解释犯了一些非常糟糕的错误/假设。这个问题仍然是相似的,但希望现在更有意义。为所有的困惑。

2 个解决方案

#1


4  

You should move the OpenGL queries down after mainView.show();. Before show() the OpenGL context has not been initialized.

在mainView.show()之后,您应该移动OpenGL查询。在show()之前,OpenGL上下文尚未初始化。

#2


2  

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

短版本:更新到Qt5,它被固定在那里。

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

P。如果你可以使用5.4,你应该使用QtOpenGL…类而不是QGL……的人。

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.

我尝试在ubuntu 14.04和Qt 4.8.6中创建非OpenGL 3.0 context和Intel HD3000。我在答案的末尾给出了这个测试代码。尝试创建3.1、1.2、2.1..等上下文核心兼容。但总是以上下文->格式(). majorversion()显示所请求的版本,而glGetString(GL_VERSION)显示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.

大约3个小时后,我注意到,默认Qt创建者使用Qt4而不是最近的qt5,安装在我的系统上。在我用Qt 5.2.1重新编译了这个项目之后,完全相同的代码开始工作了。

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();
}

#1


4  

You should move the OpenGL queries down after mainView.show();. Before show() the OpenGL context has not been initialized.

在mainView.show()之后,您应该移动OpenGL查询。在show()之前,OpenGL上下文尚未初始化。

#2


2  

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

短版本:更新到Qt5,它被固定在那里。

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

P。如果你可以使用5.4,你应该使用QtOpenGL…类而不是QGL……的人。

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.

我尝试在ubuntu 14.04和Qt 4.8.6中创建非OpenGL 3.0 context和Intel HD3000。我在答案的末尾给出了这个测试代码。尝试创建3.1、1.2、2.1..等上下文核心兼容。但总是以上下文->格式(). majorversion()显示所请求的版本,而glGetString(GL_VERSION)显示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.

大约3个小时后,我注意到,默认Qt创建者使用Qt4而不是最近的qt5,安装在我的系统上。在我用Qt 5.2.1重新编译了这个项目之后,完全相同的代码开始工作了。

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();
}