我正在使用Qt5开发一个简单的OpenGL应用程序,并且我使用了新的QOpenGL类来处理我的顶点缓冲区,索引缓冲区和着色器。不过,我有点卡在纹理上。
我有我的QOpenGLBuffer和QOpenGLShaderProgram ......但QOpenGLTexture在哪里? Qt5 class list中似乎没有这样的类。我是否必须使用直接的OpenGL调用来管理纹理?
答案 0 :(得分:3)
这是对的:Qt5的QtGui模块中不存在这样的类。是的,如果您不想拉入小部件库,则必须使用普通的OpenGL调用来处理纹理。
话虽如此,Qt开发人员已经认识到并且正在积极讨论当前(假设有些非最佳和不一致)的情况。请参阅Sean Harmer的OpenGL in Qt 5.1 and onwards邮件,特别是第7点。但是按照该线程并查看当前的开发树,我怀疑它将落在5.1中。
编辑:查看其他答案以及我想添加的有关标准Qt 5.0选项的最新评论:
您的主要目标是:
glTexImage2D(..., GL_UNSIGNED_BYTE, GL_RGBA, pointer)
的指针?或glTex*()
相关功能的助手类?如果它是第一个并链接(旧的)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)
答案 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}已经拥有的QGLTexture2D
和QOpenGLBuffer
非常相似的方式使用QOpenGLShaderProgram
。
答案 4 :(得分:1)