【问题标题】:Can't set desired OpenGL version in QGLWidget无法在 QGLWidget 中设置所需的 OpenGL 版本
【发布时间】:2012-06-15 12:47:59
【问题描述】:

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

我的显卡支持 OpenGL 4.2,在创建 QGLWidget 之前调用 QGLFormat::openGLVersionFlags() 显示 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。驱动程序版本打印在上面的示例输出中。我不太确定还能尝试什么。

编辑:在此编辑之前,我对问题的解释犯了一些非常糟糕的错误/假设。这个问题仍然相似,但希望现在更有意义。如有任何混淆,请见谅。

【问题讨论】:

  • 您的着色器是否正在编译/链接?如果您使用的是 4.2 上下文和不兼容/不正确的着色器,这是导致空白窗口的原因之一。
  • 我还没有走那么远(着色器)。我想使用 QGLWidget 作为 QDeclarativeView 的视口,然后添加一些使用着色器的 3d 内容。但即使是像 Rectangle{} 这样具有默认组件的简单文件也不会呈现任何内容。如果我不设置 QGLFormat 版本,它将按预期呈现,但这个问题的重点是弄清楚为什么我不能首先设置它。另外,如果我(或内部的 Qt)使用不兼容的着色器,我会得到错误。唯一的输出是我在问题中粘贴的内容。
  • 嗯,我建议查看着色器日志的唯一原因是 OpenGL 3.0 + 要求编译和加载您自己的着色器,而 OpenGL 2.0 及更低版本则不需要。我没有通过 QT 使用 OpenGL 的经验,所以我不知道为你处理了多少。但是,在您链接的示例中,作者准备了他或她自己的着色器。如果您不使用核心配置文件为显卡提供着色器,您将不会渲染任何内容。
  • 我刚刚下载并运行了我链接的示例,但它不起作用(显示为空白),除非我将其设置为使用兼容性配置文件而不是核心配置文件。
  • 使用核心运行时有什么错误吗?

标签: c++ qt opengl opengl-3


【解决方案1】:

短版:更新至 Qt5,已修复。

P.S 如果您可以使用 5.4,您可能应该使用 QtOpenGL... 类而不是 QGL... 类。

加长版: 所以,万一有人遇到这样的问题。

我尝试在 ubuntu 14.04 和 Qt 4.8.6 上使用我的 Intel HD3000 创建 NOT OpenGL 3.0 上下文。我想出了答案末尾提供的这个测试代码。尝试创建 3.1、1.2、2.1.. 等上下文 Core Compatible.. 但总是以 context-&gt;format().majorVersion() 显示请求的版本,glGetString(GL_VERSION) 显示 3.0。

大约 3 小时后,我注意到默认情况下 Qt Creator 使用 Qt4 而不是安装在我的系统上的最新 Qt 5。在我使用 Qt 5.2.1 重新编译项目后,完全相同的代码开始按预期工作。

希望这可以帮助某人。

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

【讨论】:

    【解决方案2】:

    您应该将 OpenGL 查询移到 mainView.show(); 之后。在show()之前,OpenGL上下文还没有被初始化。

    【讨论】:

      猜你喜欢
      • 2017-02-18
      • 1970-01-01
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 2020-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多