【问题标题】:QML and Opengl : QQuickFramebufferObject::renderer is never deleted once the view (QQuickFramebufferObject instance) id deletedQML 和 Opengl:一旦视图(QQuickFramebufferObject 实例)id 被删除,QQuickFramebufferObject::renderer 就永远不会被删除
【发布时间】:2021-01-03 01:49:23
【问题描述】:

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

  • 一个 QQuickFramebufferObject 实例(我的观点)
  • 一个 QQuickFramebufferObject::renderer(我的渲染器)。

备注: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.高度(), 0, GL_RGBA, GL_UNSIGNED_BYTE, img.bits()); ...

效果很好。

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

谢谢大家

【问题讨论】:

    标签: qt opengl qml qtquick2


    【解决方案1】:

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

    删除此方法可解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-06
      • 1970-01-01
      相关资源
      最近更新 更多