如何使用Qt的OpenGL类加载和绑定纹理?



我正在使用Qt5开发一个简单的OpenGL应用程序,并使用新的QOpenGL类来处理顶点缓冲区、索引缓冲区和着色器。不过,我有点拘泥于纹理。

我有我的QOpenGLBuffer和QOpenGLShader程序。。。但QOpenGLTexture在哪里?Qt5类列表中似乎不存在这样的类。是否必须使用OpenGL直接调用来管理纹理?

没错:Qt5的QtGui模块中不存在这样的类。是的,如果你不想拉入小部件库,你必须求助于普通的OpenGL调用来处理你的纹理。

话虽如此,Qt开发人员已经认识到并积极讨论了当前的情况(比如说有点非最优和不一致)。请参阅Sean Harmer在Qt 5.1及以后的邮件中的OpenGL,特别是第7点。但是,按照这个线程并查看当前的开发树,我怀疑它是否会在5.1中出现。


编辑:查看其他答案和最近的评论,我想添加关于标准Qt 5.0:的选项

您的主要目标是:

  1. 从潜在的"怪异"格式的QImage中获得可以传递给glTexImage2D(..., GL_UNSIGNED_BYTE, GL_RGBA, pointer)的指针?或
  2. 使用一些助手类来避免处理与glTex*()相关的函数

如果它是第一个,并且链接(旧的)OpenGL模块(它是Qt 5.0的一部分)是一个选项(除了"美观"的原因,我不明白为什么它不会),你可以使用Victor暗示的静态QGLWidget::convertToGLFormat(QImage)。如果不是,然后"手动"执行类似该函数的操作(按照Xīcå的建议)应该可以:基本上首先调用QImage::convertToFormat(QImage::Format_ARGB32),然后添加一些依赖于平台的字节刷新和镜像(请参阅源代码中的convertToGLFormatHelper(…))。不过,如果您碰巧使用了自己的着色器,那么在GPU上执行此操作会快得多。

如果您想让链接上述OpenGL Qt 5.0附加模块,您甚至可以在QQuickView类中使用QGLWidget::bindTexture(...)等效模块:

GLuint texID = QGLContext::fromOpenGLContext(
                   this->openglContext())->bindTexture(...)

其中this将是QQuickView*。请参阅QGLContext帮助。(免责声明:我自己没有尝试过。)

QImage直接支持OpenGL友好格式,该格式可提供给glTexImage。。()函数。

请参阅此处的第6章备注。

因此,可以/应该使用直接的OpenGL调用。

Ick。要在我的非小部件应用程序中将QImages转换为OpenGL格式,我必须包含QGLWidget?

根据您的机器端序和所需的OpenGL格式,您可以使用以下公式:

QImage gl_compatible_image = standard_image.rgbSwapped ().mirrored ();

例如将Format_RGB32QImage映射到Intel机器上的GL_RGBA纹理。

我要查找的类似乎是QGLTexture2D,它是Qt3D的一部分。不幸的是,正如axxel所提到的,它不是Qt 5.0的一部分,也可能无法进入Qt 5.1。

也就是说,我可以自己检索和构建Qt3D。然后,我可以以与我已经拥有的QOpenGLBufferQOpenGLShaderProgram非常相似的方式使用QGLTexture2D

Qt 5.2中添加了QOpenGLTexture。

最新更新