我正在尝试调整保留指定属性的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->allocateStorage();
语句会激活QOpenGLDebugLogger,打印以下内容:
Warning: GL_INVALID_ENUM in glTexStorage2D(internalformat = GL_FALSE)
因此在我看来,在破坏纹理之后,先前设置的属性(如纹理目标)会丢失。因此,在我的选择中,它们应该被保留下来以便重建纹理。
是否有另一种方法可以创建第二个具有相同属性的QOpenGLTexture,除了大小?
因此我在Qt bugtracker中提交了一个错误报告,但似乎开发人员无法查看它。 https://bugreports.qt.io/browse/QTBUG-46614
所以也许有人在这里暗示我该怎么办?
答案 0 :(得分:1)
我使用Qt和OpenGL相当多。但我从未使用过Qt GL包装类,我也不建议使用它们,因为这样你依赖于Qt SDK内部的内容。另外,因为this discussion和here中指出了一些API设计缺陷。但关于你的问题。似乎Qt正确的方式(直接使用GL API的另一个原因),正如OpenGL标准规定的那样。也就是说,如果纹理句柄被破坏或重新初始化,必须在需要调整大小时执行,那么所有纹理对象道具都会失效。这就是它应该工作的方式。顺便说一句,如果你想保留纹理采样器属性,你可以使用OpenGL sampler objects。是的,我不知道如何使用Qt GL包装器API。