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

时间:2013-02-16 21:12:30

标签: qt opengl qt5

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

我有我的QOpenGLBuffer和QOpenGLShaderProgram ......但QOpenGLTexture在哪里? Qt5 class list中似乎没有这样的类。我是否必须使用直接的OpenGL调用来管理纹理?

5 个答案:

答案 0 :(得分:3)

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

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


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

您的主要目标是:

  1. 从你潜在的'怪异'格式化的QImage中获取一些可以传递给glTexImage2D(..., GL_UNSIGNED_BYTE, GL_RGBA, pointer)的指针?或
  2. 使用一些帮助您处理glTex*()相关功能的助手类?
  3. 如果它是第一个并链接(旧的)OpenGL模块(它是Qt 5.0的一部分)是一个选项(除了'美学'的原因,我不明白为什么它不会),你可以使用Victor暗示的静态QGLWidget::convertToGLFormat(QImage)。如果没有,那么做那样的函数就像'手工'(沿着Xīcò建议的那样)应该工作:基本上先调用QImage::convertToFormat(QImage::Format_ARGB32)然后添加一些平台相关的字节调用和镜像(参见 convertToGLFormatHelper {... 3}}中的(...)。虽然,如果您碰巧使用自己的着色器,那么在GPU上执行此操作会更快。

    如果你想同时连接上面提到的OpenGL Qt 5.0附加模块的,你甚至可以在QQuickView类中实际使用QGLWidget::bindTexture(...)等价物:

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

    this将是QQuickView *。请参阅the source。 (免责声明:我自己没试过。)

答案 1 :(得分:1)

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

见第6章备注here

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

答案 2 :(得分:1)

  

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

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

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

例如,将Format_RGB32 QImage映射到Intel计算机上的GL_RGBA纹理。

答案 3 :(得分:1)

看来我正在寻找的班级是QGLTexture2D,这是Qt3D的一部分。不幸的是,正如axxel所提到的,它不是Qt 5.0的一部分,可能无法进入Qt 5.1。

那就是说,我自己可以retrieve and build Qt3D。然后,我可以以与{I}已经拥有的QGLTexture2DQOpenGLBuffer非常相似的方式使用QOpenGLShaderProgram

答案 4 :(得分:1)