为什么我不能在Qt中使用OpenGL ES 3.0?

3
我在窗口上设置了一个 QSurfaceFormat,并将其GL版本号设置为“3.0”。代码如下:

static QSurfaceFormat createSurfaceFormat() {
    QSurfaceFormat format;
    format.setSamples(4);
    format.setDepthBufferSize(24);
    format.setStencilBufferSize(8);
    format.setVersion(3, 0);
    return format;
}

int main(int argc, char *argv[]) {
    // ...

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    QWindow* window = (QWindow*) engine.rootObjects().first();
    window->setFormat(::createSurfaceFormat());

    // ...
}

另外,在main()中,我启用了OpenGL ES模式,如下所示:

QGuiApplication::setAttribute(Qt::AA_UseOpenGLES);

这意味着我正在请求一个GL ES 3.0上下文。 ANGLE文档(在开头附近的表格中)表示实现了GL ES 3.0 -> D3D 11 API翻译支持。根据dxdiag.exe,我的系统支持D3D 11。
但是当我启动包含此QML代码的应用程序时...
Text {
    text: OpenGLInfo.majorVersion + "." + OpenGLInfo.minorVersion
}

我看到显示了“2.0”。同时,使用我在这里描述的方法,我已确定我的PC支持的最大着色语言版本是“100”,也就是1.0。

与此同时,从这篇Qt博客文章中我知道Qt支持GL ES 3.0应用程序。

那么为什么我不能在Qt中使用OpenGL ES 3.0


我在我的窗口上设置了一个QSurfaceFormat,这个表面格式的GL版本号设置为“3.0”,你具体怎么做的?你说的是哪个窗口类? - peppe
@peppe:我编辑了问题,包括了那些信息。 - Stefan Monov
1
代码中粘贴的方式看起来不对,因为它在窗口创建之后设置格式(这太晚了,必须在之前设置)。尝试在主函数中创建Q(Gui)Application对象之前调用QSurfaceFormat::setDefaultFormat - peppe
@peppe:谢谢,这个方法可行。你能否把它发表为答案,这样我就可以标记为已接受了吗? - Stefan Monov
1个回答

5
在创建窗口之前(通过create()),您需要在QWindow上设置QSurfaceFormat。如果通过QML创建顶级窗口,则无法控制何时实际调用create(),因此解决方案是在创建Q(Gui)Application之前的某个地方更改默认的表面格式:
int main(int argc, char **argv) {
    // createSurfaceFormat() is the function you pasted above
    QSurfaceFormat::setDefaultFormat(createSurfaceFormat());

    QApplication app(argc, argv); 
    // etc.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接