qt - QML 和 Opengl:一旦视图(QQuickFramebufferObject 实例)id 被删除,QQuickFramebufferObject::renderer 就永远不会被删除
问题描述
我的 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.width(), img.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, img.bits()); ...
它运作良好。
备注:显示始终正确:纹理使用正确,但问题仅与渲染器破坏失败有关。
谢谢你们
解决方案
我的错...实际上问题只发生在 Intel HD 630 上。Opengl 上下文被迫为 3.3(使用 QOpenGlSurfaceFormat::setVersion(int major, int minor)。
删除此方法可解决此问题。
推荐阅读
- python - 遍历数据框以找到存在 datetime.datetime 对象的行
- nuxt.js - 在 Nuxt 全静态生成中关闭 manifest.js 生成
- sql-server - Zend Framework 将表情符号保存为 SQL 表中的问号
- reactjs - 酶的安装第二次失败
- blockchain - 与区块链网络同步的问题
- uipath - Uipath - 如何从 pdf 中提取表格
- string - 你可以自定义@info 颜色吗?
- android - Android如何在带有数据绑定的文本视图中使用字符串变量
- python - 盈透证券 - 未找到请求的安全定义
- amazon-web-services - 从 Secrets Manager 映射 AWS API Gateway HTTPIntegration 标头