我正在使用 Qt5 开发一个简单的 OpenGL 应用程序,并且我使用新的 QOpenGL 类来处理我的顶点缓冲区、索引缓冲区和着色器。不过,我有点卡在纹理上。
我有我的 QOpenGLBuffer 和 QOpenGLShaderProgram...但是 QOpenGLTexture 在哪里?Qt5 类列表中似乎不存在这样的类。我是否必须求助于直接 OpenGL 调用来管理纹理?
没错:在 Qt5 的 QtGui 模块中不存在这样的类。是的,如果您不想拉入小部件库,则必须求助于普通的 OpenGL 调用来处理您的纹理。
话虽如此,Qt 开发人员已经认识到并积极讨论了当前(假设有些非最佳和不一致)的情况。请参阅Qt 5.1 和后续邮件中的 Sean Harmer 的OpenGL ,特别是第 7 点。但是按照该线程并查看当前的开发树,我怀疑它会在 5.1 中登陆。
编辑:查看其他答案和我想添加的关于标准 Qt 5.0 选项的最新评论:
您的主要目标是:
glTexImage2D(..., GL_UNSIGNED_BYTE, GL_RGBA, pointer)
从你可能“奇怪”的格式化 QImage 传递给它?或者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(...)
this
QQuickView*在哪里?请参阅QGLContext 帮助。(免责声明:我自己没有尝试过。)
伊克。要在我的非小部件应用程序中将 QImages 转换为 OpenGL 格式,我必须包含 QGLWidget?
根据您的机器字节顺序和所需的 OpenGL 格式,您可以使用如下公式:
QImage gl_compatible_image = standard_image.rgbSwapped ().mirrored ();
例如,将Format_RGB32
QImage 映射到GL_RGBA
Intel 机器上的纹理。
看来我正在寻找的类是QGLTexture2D
,它是 Qt3D 的一部分。不幸的是,正如 axxel 所提到的,它不是 Qt 5.0 的一部分,并且可能不会进入 Qt 5.1。
也就是说,我可以自己检索和构建 Qt3D。然后我可以以与我已经拥有QGLTexture2D
的非常相似的方式使用。QOpenGLBuffer
QOpenGLShaderProgram