首页 > 解决方案 > QML 和 Opengl:一旦视图(QQuickFramebufferObject 实例)id 被删除,QQuickFramebufferObject::renderer 就永远不会被删除

问题描述

我的 opengl 应用程序基于经典的 Qml 架构:

备注:OpenglContext 是共享的(Qt::ApplicationAttribute::AA_ShareOpenGLContexts)

这个渲染器由几个 QOpenGLFunctions_3_3_Core 实例组成。

其中之一是使用纹理。

纹理在 Renderer::render() 方法内部启动,并在其中销毁。

当我尝试关闭我的应用程序时,视图被删除但我的渲染器没有被删除,然后应用程序不会关闭。

当我尽可能减少我的代码时,似乎问题是因为:

tex=new QOpenGLTexture(图像); ...

当我移动到另一个 QOPenGlTExture ctor 时:

tex=new QOpenGLTexture(QOpenGLTexture::Target2D); // 第 1 行 tex->setMinificationFilter(QOpenGLTexture::Linear); // 第 2 行 ....

启用第 2 行时会出现问题。

如果我更改为原始 opengl 函数(非 DSA),例如:

glGenTextures(1, &id); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, id);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img.width(), img.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, img.bits()); ...

它运作良好。

备注:显示始终正确:纹理使用正确,但问题仅与渲染器破坏失败有关。

谢谢你们

标签: qtopenglqmlqtquick2

解决方案


我的错...实际上问题只发生在 Intel HD 630 上。Opengl 上下文被迫为 3.3(使用 QOpenGlSurfaceFormat::setVersion(int major, int minor)。

删除此方法可解决此问题。


推荐阅读