I’m working on a simple OpenGL application using Qt5, and I’ve used the new QOpenGL classes to handle my vertex buffers, index buffers and shaders. I’m a little stuck on textures, though.
I have my QOpenGLBuffer and QOpenGLShaderProgram… but where’s QOpenGLTexture? No such class seems to exist in the Qt5 class list. Do I have to resort to direct OpenGL calls for managing textures?
That is right: no such class exists in the QtGui module of Qt5. And yes, you have to resort to plain OpenGL calls to handle your textures if you don’t want to pull in the widget library.
That being said, the current (let’s say somewhat non-optimal and inconsistent) situation is recognized and actively being discussed by the Qt developers. See Sean Harmer’s OpenGL in Qt 5.1 and onwards mail, specifically point 7. But following that thread and having a look at the current dev tree, I doubt it is going to land in 5.1.
Edit: Looking at the other answers and the recent comments I’d like to add regarding options you have with standard Qt 5.0:
Is your main goal to:
glTexImage2D(..., GL_UNSIGNED_BYTE, GL_RGBA, pointer)from your potentially ‘weird’ formatted QImage? orglTex*()related functions?If it is the first and linking the (old) OpenGL module (which is part of Qt 5.0) is an option (and apart from ‘esthetically’ reasons, I don’t see why it would not be), you could use the static
QGLWidget::convertToGLFormat(QImage)that Victor was hinting at. If not, then doing something like that function does ‘by hand’ (along the lines of what Xīcò suggested) should work: basically first callingQImage::convertToFormat(QImage::Format_ARGB32)and then add some platform dependent byte swizzeling and mirroring (see convertToGLFormatHelper(…) in the source). Although, if you happen to use your own shaders, then doing that on the GPU is way faster.If you want to have both and linking the mentioned OpenGL Qt 5.0 add-on module is an option you might be able to actually use a
QGLWidget::bindTexture(...)equivalent even in your QQuickView class:Where
thiswould be a QQuickView*. See the QGLContext help. (Disclaimer: I have not tried that myself.)