0

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

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

4

5 回答 5

3

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

话虽如此,Qt 开发人员已经认识到并积极讨论了当前(假设有些非最佳和不一致)的情况。请参阅Qt 5.1 和后续邮件中的 Sean Harmer 的OpenGL ,特别是第 7 点。但是按照该线程并查看当前的开发树,我怀疑它会在 5.1 中登陆。


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

您的主要目标是:

  1. 得到一些指针,你可以glTexImage2D(..., GL_UNSIGNED_BYTE, GL_RGBA, pointer)从你可能“奇怪”的格式化 QImage 传递给它?或者
  2. 使用一些帮助您处理glTex*()相关功能的帮助类?

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

如果您想同时拥有QGLWidget::bindTexture(...)链接提到的 OpenGL Qt 5.0 附加模块是一个选项,您甚至可以在 QQuickView 类中实际使用等效模块:

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

thisQQuickView*在哪里?请参阅QGLContext 帮助。(免责声明:我自己没有尝试过。)

于 2013-02-20T16:07:24.667 回答
1

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

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

所以是的,可以/应该使用直接的 OpenGL 调用。

于 2013-02-16T21:16:15.520 回答
1

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

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

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

例如,将Format_RGB32QImage 映射到GL_RGBAIntel 机器上的纹理。

于 2013-02-21T00:09:56.207 回答
1

看来我正在寻找的类是QGLTexture2D,它是 Qt3D 的一部分。不幸的是,正如 axxel 所提到的,它不是 Qt 5.0 的一部分,并且可能不会进入 Qt 5.1。

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

于 2013-02-21T05:33:04.947 回答
1

QOpenGLTexture 是在 Qt 5.2 中添加的

于 2015-09-23T11:33:13.527 回答