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

时间:2016-11-02 16:53:53

标签: qt opengl-es opengl-es-3.0

我在我的窗口上设置了QSurfaceFormat,这种表面格式设置为“3.0”作为其GL版本号。代码:

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 docs说(在开头附近的表格中)实施了GL ES 3.0 -> D3D 11 API转换支持。我的系统根据dxdiag.exe支持D3D 11。

但是当我启动包含此QML代码的应用程序时......

Text {
    text: OpenGLInfo.majorVersion + "." + OpenGLInfo.minorVersion
}

...我看到“2.0”显示。另外,使用我描述的方法here,我已经确定我的PC上支持的最大着色语言版本是“100”,即1.0。

同时,从this Qt blog post我知道Qt支持GL ES 3.0应用程序。

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

1 个答案:

答案 0 :(得分:4)

您需要在创建窗口之前在QWindow上设置QSurfaceFormat(通过create())。如果您通过QML创建顶级窗口,则无法控制实际调用create()的时间,因此解决方案是在创建Q(Gui)应用程序之前更改默认表面格式:

int main(int argc, char **argv) {
    // createSurfaceFormat() is the function you pasted above
    QSurfaceFormat::setDefaultFormat(createSurfaceFormat());

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