调整 QOpenGLTexture 保留属性的大小

Posted

技术标签:

【中文标题】调整 QOpenGLTexture 保留属性的大小【英文标题】:Resizing QOpenGLTexture preserving properties 【发布时间】:2015-06-16 10:50:57 【问题描述】:

我正在尝试调整 QOpenGLTextures 的大小以保留指定的属性。我知道尽可能使用不可变存储这一事实。所以我必须破坏并重新创建纹理。但似乎 QOpenGLTexture 在销毁后失去了它的属性。

void resizeTexture(std::shared_ptr<QOpenGLTexture> texture, const Qsize &size)
    texture->destroy();
    texture->setSize(size.width(),size.height());
    texture->create();
    texture->allocateStorage();

执行texture-&gt;allocateStorage(); 语句会启动 QOpenGLDebugLogger 打印以下内容: Warning: GL_INVALID_ENUM in glTexStorage2D(internalformat = GL_FALSE)

所以在我看来,之前设置的纹理目标等属性在破坏纹理后会丢失。因此,在我看来,它们应该被保留,以便可能重新创建纹理。

是否有另一种方法可以创建第二个 QOpenGLTexture,除了大小之外具有相同的属性?

因此,我在 Qt bugtracker 中提交了一份错误报告,但开发人员似乎无法查看它。 https://bugreports.qt.io/browse/QTBUG-46614

所以也许这里有人对我有提示,该怎么办?

【问题讨论】:

【参考方案1】:

我经常使用 Qt 和 OpenGL。但我从来没有使用过 Qt GL 包装类,我也不建议使用它们,因为这样你就依赖于 Qt SDK 内部发生的事情。还因为在this discussion 和here 中指出了一些API 设计缺陷。但是关于你的问题。似乎 Qt 这样做是正确的(直接使用 GL API 的另一个原因),正如 OpenGL 标准所规定的那样。也就是说,如果纹理句柄被破坏或重新初始化,如果您需要调整大小,则必须这样做,那么所有纹理对象道具都将失效。这就是它应该工作的方式。顺便说一句,如果你想保留纹理采样器属性,你可以使用OpenGL sampler objects。是的,我不知道如何使用 Qt GL 包装器 API。

【讨论】:

感谢您的回答。我重新设计了我的设计,以便在发生调整大小事件时能够重新创建具有所有属性的纹理。 Qt 的 OpenGL 包装类有一个好处:如果您的代码适合 OpenGL ES 2 紧身衣,它可以通过与 Qt 捆绑的转换层 (ANGLE) 在 DirectX 上运行。 Qt 已经处理了 ANGLE 与原生 GL 的动态选择,您可以在运行时进一步覆盖此类选择。有时它很有帮助。 @KubaOber 同意,但我是从 OpenGL 开发人员的角度说的 :) 另外,如果你碰巧不使用 Angle,那么包装类实际上什么都不做。使用它们的方法具有虚拟方法调用的“开销”。您只是在使用函数指针。

以上是关于调整 QOpenGLTexture 保留属性的大小的主要内容,如果未能解决你的问题,请参考以下文章

在调整图像大小时保留 exif 数据

用保留质量的php调整图片大小

使用 php Imagick 保留背景调整 PNG 的大小

在 CodeIgniter 中调整 PNG 的大小,同时保留透明度

opengl:调整大小时如何将对象保留在窗口中

如何使用“包含”选项调整图像的大小,但保留原始尺寸的纵横比?